日期:2014-05-18  浏览次数:20898 次

C#利用多线程制作打字游戏(求助关闭的问题)
23:06 唉,终于把第10章的那个理论作业打字游戏做完了(^_^当然是在看答案的情况下),呵呵,还蛮好玩的,原来打字游戏就是这样子做出来的啊,呵。。下面是做法:

  在VS2005中新建一个C#的Windows应用程序,然后把一个Timer控件拉到form里,设置控件的间隔时间为1000,即1秒,然后双击Timer控件,进到timer1_Tick()事件代码编辑区,加入如下代码:

  private void timer1_Tick(object sender, EventArgs e)

  {

  Label lbl = new Label();

  lbl.AutoSize = true;

  lbl.Font = new System.Drawing.Font("Arial", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));

  lbl.Name = "label1";

  lbl.Size = new System.Drawing.Size(19, 18);

  lbl.Top = 0;

  //利用随机函数让标签的位置不一样,且标签内容也不一样,a~Z的ASCII码为65~122

  Random random = new Random();

  lbl.Left = random.Next(0,this.Width);

  int i;

  do

  {

  i = 65 + random.Next(57);

  } while (i >= 91 && i <= 96); //91~96为非字母

  lbl.Text = Convert.ToChar(i).ToString();

   

  this.Controls.Add(lbl);

   

  Letter l = new Letter(lbl,this);

  ThreadStart ts = new ThreadStart(l.run); //计时器每跳动一次就启动一个线程,线程控制字母下落

  Thread t = new Thread(ts);

  t.Start();

  }
 

   

另外再新建一个Letter类,此类中有个run方法,用于控制字母的下落,Letter类代码如下:

  public class Letter

  {

  //让字母动起来的类

  private Label lbl;

  private Form frm;

  const int speed = 1; //下落速度

 

  public Letter(Label lbl, Form frm)

  {

  this.lbl = lbl;

  this.frm = frm;

  }

 

  public void run()

  {

  try

  {

  while (this.lbl.Top != this.frm.Height - 20)

  {

  //当字母还没有落到窗口底部的时候就一直下落

  if (lbl == null)

  {

  Thread.CurrentThread.Abort();

  }

  this.lbl.Top += speed * 5;

  Thread.Sleep(100);

  }

 

  if (Thread.CurrentThread.IsAlive)

  {

  Thread.CurrentThread.Abort();

  }

  }

  catch (Exception ex)

  {

  Console.WriteLine("错误:" + ex.Message);

  Console.WriteLine("错误:" + ex.StackTrace);

  }

  finally

  {

  if (!lbl.Disposing)

  lbl.Dispose();

  frm.Controls.Remove(lbl);

  }

  }

  }
 

   

 让字母动起来的原理就是当字母没有移动到屏幕底的时候就循环的让Y轴坐标加上速度值即可,当落到底部的时候则用Thread.CurrentThread.Abort();该方法来终止当前运行的线程。