黑马程序员技术交流社区

标题: “舒尔特方格” C#实现方法详解 这不只是一个游戏! [打印本页]

作者: pm324    时间: 2013-8-22 10:54
标题: “舒尔特方格” C#实现方法详解 这不只是一个游戏!
本帖最后由 pm324 于 2013-8-22 17:05 编辑

(为了上首页,我什么手段都用上了- -)

要看之前的帖子,请移步欢迎初学的同学来讨论研究
先在这里小感慨下,跟大家分享下我的小心情,上一个帖子真让我感觉有点失落,浏览次数170+,回复的却只有几个版主。。。可能是大家觉这个东西太简单。。。简单。。。单。不值一提。唉。。。
好了好了好了,不感慨了,既然我说了要把源码发上来,说到做到!
Now Start!


首先,在“舒尔特方格训练法”中
有了以上4个大概的功能描述,我们就可以开始构思程序了。

首先,我们需要一个生成1-25的随机数组,问题出现了!
那就是:如何生成一个不重复的1-25的随机数组!
这里我用到的是Hashtable,将每次生成的随机数到Hashtable里面,然后每次插入前检查生成的随机输是否已经存在,如果存在则重新生成,如果不存在,就添加进哈希表里,同时添加到我们的随机数组中!
下面是代码
  1. private void GetRandomNum()
  2.         {
  3.             Hashtable hashtable = new Hashtable();
  4.             Random rm = new Random();
  5.             int RmNum = 25;
  6.             for (int i = 0; hashtable.Count < RmNum; i++)
  7.             {
  8.                 int count = hashtable.Count;
  9.                 int nValue = rm.Next(26);
  10.                 if (!hashtable.ContainsValue(nValue) && nValue != 0)
  11.                 {
  12.                     hashtable.Add(nValue, nValue);
  13.                 }
  14.                 if (hashtable.Count > count)
  15.                 {
  16.                     num.Add(nValue.ToString());
  17.                 }
  18.             }
  19.         }
复制代码
OK,随机数组生成了。
接下来,我们要考虑如何把这个随机数组,依次排列到我们的winform界面上。
我用的是label来显示这些数字
依次创建label,然后讲我们生成的随即数组中的随机数依次给label
下面是代码
  1. #region    创建单元格

  2.             for (int i = 0; i < 5; i++)
  3.             {
  4.                 for (int j = 0; j < 5; j++)
  5.                 {
  6.                     Label label = new Label();
  7.                     label.Width = 40;
  8.                     label.Height = 40;
  9.                     label.Text = num[i * 5 + j].ToString();
  10.                     label.BorderStyle = BorderStyle.FixedSingle;
  11.                     label.Font = new Font("Arial Rounded MT", 12);
  12.                     label.TextAlign = ContentAlignment.MiddleCenter;
  13.                     label.Click += new EventHandler(label_Click);
  14.                     label.MouseEnter += new EventHandler(label_MouseEnter);
  15.                     label.MouseLeave += new EventHandler(label_MouseLeave);
  16.                     label.BackColor = Color.LightGray;
  17.                     label.Location = new Point(x, y);
  18.                     this.Controls.Add(label);
  19.                     x += 40;
  20.                 }
  21.                 y += 40;
  22.                 x = 0;
  23.             }

  24.             #endregion
复制代码
然后我们需要给label加点击事件,进入事件,还有离开事件因为所有的label的事件都是一样的,我们就没有必要给每个label都添加事件
那么 只用一个事件的时候,如何判断到底是哪个label触发的事件呢?
void label_Click(object sender, EventArgs e)中,我们可以看到,有两个参数,一个object,一个Eventargs,那这个object,传递的就是触发这个事件的对象, Eventargs传递的就是所触发的事件
我们不需要知道具体是哪个label触发的事件,值需要把这个object转换成label然后对他进行操作就可以了
Label CurrentLabel = (Label)sender;

在这个过程中,如何判断用户点击label的顺序是否正确呢?
在这里,我用到了一个变量 click。他用来存储单击的顺序,依次点击label,click会递增。
这个时候,我们用click的值和label里的随机数做比较,就可以知道用户单击的顺序是否正确

下面是代码
  1. void label_Click(object sender, EventArgs e)
  2.         {
  3.             Label CurrentLabel = (Label)sender;
  4.             if (CurrentLabel.BackColor == Color.Green)
  5.             {
  6.             }
  7.             else
  8.             {
  9.                 click++;

  10.                 if (click.ToString() == CurrentLabel.Text)
  11.                 {
  12.                     CurrentLabel.BackColor = Color.Green;
  13.                     if (click == 25)
  14.                     {
  15.                         end = DateTime.Now;
  16.                         TimeSpan s1 = end - start;
  17.                         lab_end.Text = "用时:" + s1.TotalSeconds.ToString() + " 秒";
  18.                         panel_end.Visible = true;
  19.                     }
  20.                 }

  21.                 else
  22.                 {
  23.                     click--;
  24.                     CurrentLabel.BackColor = Color.Red;
  25.                 }
  26.             }
  27.         }

  28.         void label_MouseLeave(object sender, EventArgs e)
  29.         {
  30.             Label CurrentLabel = (Label)sender;
  31.             if (CurrentLabel.BackColor != Color.Red && CurrentLabel.BackColor != Color.Green)
  32.             {
  33.                 CurrentLabel.BackColor = Color.LightGray;
  34.             }
  35.         }

  36.         void label_MouseEnter(object sender, EventArgs e)
  37.         {
  38.             Label CurrentLabel = (Label)sender;
  39.             if (CurrentLabel.BackColor != Color.Red && CurrentLabel.BackColor != Color.Green)
  40.             {
  41.                 CurrentLabel.BackColor = Color.White;
  42.             }
  43.         }
复制代码
大概的思路就是这样子。工程文件在附件里,需要的同学可以下载下来看看。(请原谅万恶的回复可见{:soso_e106:}



这些只是我的思路,我知道肯定有同学有比我更出色,更简洁的方法来实现这个东西。有更好的建议,请大家及时发表看法

我希望大家能把自己的解决方案或者优化过的代码,传上来
大家一起交流 共同进步





作者: pm324    时间: 2013-8-22 14:13
尹桥印 发表于 2013-8-22 13:06
楼主V5。
我只是来.NET闲逛的
勿撵、、、

欢迎欢迎,么么哒~{:soso_e124:}

作者: 龚首道    时间: 2013-8-22 15:21
没想到你个屌丝也报了黑马,就不给哥说一声····
顺便说一句
我只是来闲逛的。。。


作者: pm324    时间: 2013-8-22 16:44
龚首道 发表于 2013-8-22 15:21
没想到你个屌丝也报了黑马,就不给哥说一声····
顺便说一句
我只是来闲逛的。。。

这帖子又要沉= ={:soso_e105:}

作者: pm324    时间: 2013-8-22 23:10
其实,我想知道。这个帖子为什么会沉。。。。。。
看到的。。帮我分析下- -
作者: 孔健    时间: 2013-8-23 10:58
不够详细,代码都没有注释!
作者: pm324    时间: 2013-8-23 12:21
孔健 发表于 2013-8-23 10:58
不够详细,代码都没有注释!

好的。。。原来是注释的问题{:soso_e109:}

作者: 赵宗荣    时间: 2013-8-23 22:40
让你再飘一下
作者: pm324    时间: 2013-8-26 11:12
赵宗荣 发表于 2013-8-23 22:40
让你再飘一下

{:soso_e146:}

作者: 张林杰    时间: 2013-8-28 22:03
支持下!

作者: pm324    时间: 2013-8-29 13:31
张林杰 发表于 2013-8-28 22:03
支持下!

Thanks a lot {:soso_e142:}

作者: 姚团结    时间: 2013-10-23 13:45
回复可见
作者: kijuil    时间: 2014-6-4 21:03
想编出来一个可以改字体颜色的舒尔特方格,加油!
作者: 123454321    时间: 2015-12-8 09:58
楼主厉害
作者: 123454321    时间: 2015-12-8 10:16
楼主,你的文件下完怎么打开看到效果呀
作者: kkess    时间: 2016-12-13 20:11
很强。。。。。。。。。。。
作者: wh345736500    时间: 2017-1-6 14:54
看一個

作者: xiaozhou1    时间: 2017-9-20 15:42
赶紧66666666666666666666
作者: pangkema    时间: 2017-10-11 13:21
不知道怎么样啊

作者: lysj_zishan    时间: 2019-2-9 11:55
舒尔特方格” C#实现方法详解 这不只是一个游戏!
作者: a1012140020    时间: 2019-4-8 13:07
hhhhhhhhhhhhhhhhhhhhhhhhhh
作者: xmh902921    时间: 2019-5-13 01:39
来学习学习
作者: 东方不败52123    时间: 2019-6-2 19:34
想看代码

作者: mxmax    时间: 2019-12-17 14:03
牛皮奥楼主
作者: Song983    时间: 2020-4-26 15:28
膜拜膜拜大神nb大神nb


作者: 万物生    时间: 2020-6-4 11:19
12222222看看看55555
作者: 呆雁    时间: 2020-8-22 20:06
来学习学习

作者: 1112455    时间: 2020-11-2 09:49
太厉害了,不知道啥时候我也可以
作者: noodlescc    时间: 2020-12-21 08:25
很详细
作者: ELE    时间: 2021-12-24 11:02
标题: 请确认所在校区后再发布帖子

作者: 281428645    时间: 2024-1-6 12:52
很强。就是没有注释啊




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2