本帖最后由 pm324 于 2013-8-22 17:05 编辑
(为了上首页,我什么手段都用上了- -)
要看之前的帖子,请移步“欢迎初学的同学来讨论研究”
先在这里小感慨下,跟大家分享下我的小心情,上一个帖子真让我感觉有点失落,浏览次数170+,回复的却只有几个版主。。。可能是大家觉这个东西太简单。。。简单。。。单。不值一提。唉。。。
好了好了好了,不感慨了,既然我说了要把源码发上来,说到做到!
Now, Start!
首先,在“舒尔特方格训练法”中- 1-25应该是随机打乱之后排列在 5*5 的方格中,且每次打开都应该是不一样的。
- 点完之后的数字应该被标记出来(当然必须分点击的对错)
- 当点击错误的数字被标记出来,重新找到正确的数字点击后,错误的标记会被取消
- 当25个数字被正确的依次点击完之后,需要显示所用时间
有了以上4个大概的功能描述,我们就可以开始构思程序了。
首先,我们需要一个生成1-25的随机数组,问题出现了!
那就是:如何生成一个不重复的1-25的随机数组!
这里我用到的是Hashtable,将每次生成的随机数到Hashtable里面,然后每次插入前检查生成的随机输是否已经存在,如果存在则重新生成,如果不存在,就添加进哈希表里,同时添加到我们的随机数组中!
下面是代码- private void GetRandomNum()
- {
- Hashtable hashtable = new Hashtable();
- Random rm = new Random();
- int RmNum = 25;
- for (int i = 0; hashtable.Count < RmNum; i++)
- {
- int count = hashtable.Count;
- int nValue = rm.Next(26);
- if (!hashtable.ContainsValue(nValue) && nValue != 0)
- {
- hashtable.Add(nValue, nValue);
- }
- if (hashtable.Count > count)
- {
- num.Add(nValue.ToString());
- }
- }
- }
复制代码 OK,随机数组生成了。
接下来,我们要考虑如何把这个随机数组,依次排列到我们的winform界面上。
我用的是label来显示这些数字
依次创建label,然后讲我们生成的随即数组中的随机数依次给label
下面是代码- #region 创建单元格
- for (int i = 0; i < 5; i++)
- {
- for (int j = 0; j < 5; j++)
- {
- Label label = new Label();
- label.Width = 40;
- label.Height = 40;
- label.Text = num[i * 5 + j].ToString();
- label.BorderStyle = BorderStyle.FixedSingle;
- label.Font = new Font("Arial Rounded MT", 12);
- label.TextAlign = ContentAlignment.MiddleCenter;
- label.Click += new EventHandler(label_Click);
- label.MouseEnter += new EventHandler(label_MouseEnter);
- label.MouseLeave += new EventHandler(label_MouseLeave);
- label.BackColor = Color.LightGray;
- label.Location = new Point(x, y);
- this.Controls.Add(label);
- x += 40;
- }
- y += 40;
- x = 0;
- }
- #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里的随机数做比较,就可以知道用户单击的顺序是否正确
下面是代码- void label_Click(object sender, EventArgs e)
- {
- Label CurrentLabel = (Label)sender;
- if (CurrentLabel.BackColor == Color.Green)
- {
- }
- else
- {
- click++;
- if (click.ToString() == CurrentLabel.Text)
- {
- CurrentLabel.BackColor = Color.Green;
- if (click == 25)
- {
- end = DateTime.Now;
- TimeSpan s1 = end - start;
- lab_end.Text = "用时:" + s1.TotalSeconds.ToString() + " 秒";
- panel_end.Visible = true;
- }
- }
- else
- {
- click--;
- CurrentLabel.BackColor = Color.Red;
- }
- }
- }
- void label_MouseLeave(object sender, EventArgs e)
- {
- Label CurrentLabel = (Label)sender;
- if (CurrentLabel.BackColor != Color.Red && CurrentLabel.BackColor != Color.Green)
- {
- CurrentLabel.BackColor = Color.LightGray;
- }
- }
- void label_MouseEnter(object sender, EventArgs e)
- {
- Label CurrentLabel = (Label)sender;
- if (CurrentLabel.BackColor != Color.Red && CurrentLabel.BackColor != Color.Green)
- {
- CurrentLabel.BackColor = Color.White;
- }
- }
复制代码 大概的思路就是这样子。工程文件在附件里,需要的同学可以下载下来看看。(请原谅万恶的回复可见{:soso_e106:})
这些只是我的思路,我知道肯定有同学有比我更出色,更简洁的方法来实现这个东西。有更好的建议,请大家及时发表看法
我希望大家能把自己的解决方案或者优化过的代码,传上来大家一起交流 共同进步
|