用到的主要有线程,随机数
为了实现多余组件的清空,用到了panel面板
以及按钮的一些属性,注解很详尽
代码如下:
1 namespace Number_Games 2 { 3 public partial class Form1 : Form 4 { 5 public Form1() 6 { 7 Controls.Clear(); 8 InitializeComponent(); 9 } 10 int rand_num;//定义随机数 11 int i = 0;//定义计数 12 Thread RunTime;//定义一条线程 13 14 private void button1_Click(object sender, EventArgs e) 15 { 16 Clear_btn();//清掉多余组件 17 int int_x = 20;//定义初始x坐标 18 int int_y = 20;//定义初始y坐标 19 for (int i = 1; i <= 100; i++) 20 { //按钮布局部分 21 Button bt = new Button();//创建button对象 22 bt.Text = i.ToString();//设置按钮文本 23 bt.Name ="bt_"+i.ToString();//按钮名字 24 bt.Size = new Size(35, 35);//按钮大小 25 bt.Click += new EventHandler(bt_click);//建立該按鈕的 Click 事件 26 bt.Location = new Point(int_x, int_y);//按钮位置 27 if (i % 10 == 0) 28 { 29 int_x = 20; 30 int_y += 37; 31 } 32 else 33 { 34 int_x += 37; 35 } 36 panel1.Controls.Add(bt);//向面板中添加按钮 37 } 38 //时间线程部分 39 RunTime = new Thread(//使用一条线程 需要引用System.Threading空间 40 new ThreadStart(Count));//使用委托执行方法部分 41 RunTime.IsBackground = true;//设置线程为后台线程(-与前台应用同时退出-) 42 RunTime.Start();//启动线程 43 rand_num = new Random().Next(1, 100);//设置随机数 44 button1.Enabled = false;//开始按钮为不可用状体 45 //避免多线程问题 46 } 47 48 //Click事件的实现 49 void bt_click(object sender, EventArgs e) 50 { 51 52 Button b = (Button)sender;//向下转型为Button类型 53 int num = int.Parse(b.Text.ToString());//获取按钮对应数字 54 if (num != rand_num) 55 { 56 b.BackColor = Color.Red; 57 if (num < rand_num) 58 b.Text = "小"; 59 else 60 b.Text = "大"; 61 } 62 else { 63 b.BackColor = Color.Green; 64 MessageBox.Show("恭喜你!任务完成\n用时:"+i+" 秒","恭喜:"); 65 RunTime.Abort();//停止线程 66 button1.Enabled = true;//启用开始按钮 67 i = 0;//计时器归0 68 } 69 70 } 71 //计时方法 72 void Count() { 73 //int i = 0; 74 while (true) 75 { 76 i = ++i > 1000000 ? 0 : i++; 77 this.label2.Text = i.ToString()+" 秒"; 78 Thread.Sleep(1000); 79 }; 80 } 81 //清掉多余组件方法 82 void Clear_btn() { 83 foreach(Button b in panel1.Controls){ 84 panel1.Controls.Clear();//清除面板按钮 85 } 86 } 87 } 88 }
经过多番调试,最终如下
1>开始界面
2>游戏运行
3>游戏结束