A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 pm324 于 2013-8-22 17:05 编辑

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

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


首先,在“舒尔特方格训练法”中
  • 1-25应该是随机打乱之后排列在 5*5 的方格中,且每次打开都应该是不一样的。
  • 点完之后的数字应该被标记出来(当然必须分点击的对错)
  • 当点击错误的数字被标记出来,重新找到正确的数字点击后,错误的标记会被取消
  • 当25个数字被正确的依次点击完之后,需要显示所用时间

有了以上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:}



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

我希望大家能把自己的解决方案或者优化过的代码,传上来
大家一起交流 共同进步
游客,如果您要查看本帖隐藏内容请回复




评分

参与人数 2技术分 +1 黑马币 +3 收起 理由
赵宗荣 + 1
龚首道 + 3 神马都是浮云

查看全部评分

30 个回复

倒序浏览
尹桥印 发表于 2013-8-22 13:06
楼主V5。
我只是来.NET闲逛的
勿撵、、、

欢迎欢迎,么么哒~{:soso_e124:}
回复 使用道具 举报
没想到你个屌丝也报了黑马,就不给哥说一声····
顺便说一句
我只是来闲逛的。。。

回复 使用道具 举报
龚首道 发表于 2013-8-22 15:21
没想到你个屌丝也报了黑马,就不给哥说一声····
顺便说一句
我只是来闲逛的。。。

这帖子又要沉= ={:soso_e105:}
回复 使用道具 举报
其实,我想知道。这个帖子为什么会沉。。。。。。
看到的。。帮我分析下- -
回复 使用道具 举报
不够详细,代码都没有注释!
回复 使用道具 举报
pm324 中级黑马 2013-8-23 12:21:37
7#
孔健 发表于 2013-8-23 10:58
不够详细,代码都没有注释!

好的。。。原来是注释的问题{:soso_e109:}
回复 使用道具 举报
让你再飘一下
回复 使用道具 举报
pm324 中级黑马 2013-8-26 11:12:03
9#

{:soso_e146:}
回复 使用道具 举报
支持下!
回复 使用道具 举报
pm324 中级黑马 2013-8-29 13:31:39
11#

Thanks a lot {:soso_e142:}
回复 使用道具 举报
回复可见
回复 使用道具 举报
想编出来一个可以改字体颜色的舒尔特方格,加油!
回复 使用道具 举报
楼主厉害
回复 使用道具 举报
楼主,你的文件下完怎么打开看到效果呀
回复 使用道具 举报
kkess 初级黑马 2016-12-13 20:11:07
16#
很强。。。。。。。。。。。
回复 使用道具 举报
看一個
回复 使用道具 举报
赶紧66666666666666666666
回复 使用道具 举报
不知道怎么样啊
回复 使用道具 举报
舒尔特方格” C#实现方法详解 这不只是一个游戏!
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马