舒尔特方格(SchulteGrid)游戏C#实现

背景

观察网上的一个flash小游戏,对照着,做了一个C#版本的。
舒尔特方格游戏下载地址

游戏说明

舒尔特方格(Schulte Grid)是在一张方形卡片上画上 1cm × 1cm 的 25 个方格,格子内任意填写上阿拉伯数字1-25 等共25个数字。训练时,要求被测者用手指按 1-25的顺序依次指出其位置,同时诵读出声,记录所用时间。点完25个数字所用时间越短,注意力水平越高。(来自百度百科)

效果

Show me Code

MainForm.cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace SchulteForm
{
public partial class MainForm : Form
{

#region 全局成员字段
HelpBox hb; //帮助对话框
SchulteForm.Controls.Numbers nbs; //实例化按钮矩阵类
Stopwatch stopWatch = new Stopwatch(); //计时器实例化
Thread thd ;
List<Button> listbu= new List<Button>();
int i = 1;
#endregion

public MainForm()
{

InitializeComponent();
}

private void MainForm_Load(object sender, EventArgs e)
{

nbs = new Controls.Numbers();
nbs.InitNumbers(this.tableLayoutPanel, listbu);
nbs.RandomNumbers(ref listbu);
foreach (Control col in listbu)
{
//Console.WriteLine(col.Text);
if (col.Text == "1")
{
col.Click += new EventHandler(col_Click);

}
if (col.Text == "25")
{
col.Click += new EventHandler(col_OverClick);
}
if (col.Text != "25")
{
col.Click += new EventHandler(col_NumClick);
}
}
}

private void col_OverClick(object sender, EventArgs e)
{

if (stopWatch.IsRunning == true & i==25)
{
stopWatch.Stop();
StartButton.Text = "开始游戏";
thd.Abort();
//Label.CheckForIllegalCrossThreadCalls = true;
DialogResult dr = MessageBox.Show("Your Time:" + timeLabel.Text, "Done", MessageBoxButtons.OK, MessageBoxIcon.Information);
Button btn = sender as Button;
btn.Click -= new System.EventHandler(col_OverClick); //事件队列,有顺序!

if (dr == DialogResult.OK)
{
stopWatch.Reset();
//btn.Click -= new System.EventHandler(col_NumClick);
ReStartButton_Click(sender,e);
}
}
}

private void col_NumClick(object sender, EventArgs e)
{

nbs.ResetNumbersColor(ref listbu);
Button btn = sender as Button;
//MessageBox.Show(btn.Text);
//btn.BackColor = SystemColors.Control;
nbs.ClickNumbers(ref btn, ref i);
}
private void col_Click(object sender, EventArgs e)
{

if (stopWatch.IsRunning == false & StartButton.Text == "开始游戏")
{
thd = new Thread(RunWatch);
thd.IsBackground = true;
Label.CheckForIllegalCrossThreadCalls = false;
stopWatch.Start();
StartButton.Text = "暂停游戏";
thd.Start();
}
Button btn = sender as Button;
btn.Click -= new System.EventHandler(col_Click); //取消事件,因为点击完1后,就要点击2了,就不需要这个事件了;并且,防止“重新开始”,变成不是1的数字,误触
}

private void MainForm_HelpRequested(object sender, HelpEventArgs hlpevent)
{

if (hb == null || hb.IsDisposed)
{
hb = new HelpBox();
}
hb.Show();
}

private void MainForm_HelpButtonClicked(object sender, CancelEventArgs e)
{

if (hb == null || hb.IsDisposed)
{
hb = new HelpBox();
}
hb.Show();
}

private void StartButton_Click(object sender, EventArgs e)
{

//1.点击开始游戏,开始计时,变成暂停游戏
//2.点击数字1开始游戏
//3.点击暂停游戏,暂停时间,再次点击开始计时
if (StartButton.Text == "开始游戏")
{
thd = new Thread(RunWatch);
thd.IsBackground = true;
Label.CheckForIllegalCrossThreadCalls = false;
stopWatch.Start();
StartButton.Text = "暂停游戏";
thd.Start();
}
else
{
stopWatch.Stop();
StartButton.Text = "开始游戏";
thd.Abort();
//Label.CheckForIllegalCrossThreadCalls = true;
}
}

private void ReStartButton_Click(object sender, EventArgs e)
{

//1.计时器清零
//2.随机数重新产生
//3. i =1
//4. 重新设置颜色
//5. 重置前25按钮的事件要取消
stopWatch.Stop();
stopWatch.Reset();
StartButton.Text = "开始游戏";
i = 1;
foreach (Control col in listbu)
{
if (col.Text == "1")
{
col.Click -= new System.EventHandler(col_Click);
}
if (col.Text == "25")
{
col.Click -= new System.EventHandler(col_OverClick);
}
if (col.Text != "25")
{
col.Click -= new EventHandler(col_NumClick);
}
}
nbs.RandomNumbers(ref listbu);
foreach (Control col in listbu)
{
//Console.WriteLine(col.Text);
if (col.Text == "1")
{
col.Click += new EventHandler(col_Click);
}
if (col.Text == "25")
{
col.Click += new EventHandler(col_OverClick);
}
if (col.Text != "25")
{
col.Click += new EventHandler(col_NumClick);
}
}
nbs.ResetNumbersColor(ref listbu);
}

private void RunWatch()
{

//stopWatch.Stop();
//// Get the elapsed time as a TimeSpan value.
TimeSpan ts;
try
{
while (true)
{
Thread.Sleep(10);
ts = stopWatch.Elapsed;
// Format and display the TimeSpan value.
//string elapsedTime =
timeLabel.Text = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
ts.Hours, ts.Minutes, ts.Seconds,
ts.Milliseconds / 10);
}
}
catch (Exception)
{

throw;
}
//timeLabel.Text = stopWatch.ElapsedTicks.ToString();
}

private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
{

if (thd!=null)
{
thd.Abort();
}

//Label.CheckForIllegalCrossThreadCalls = true;
}
}
}

Numbers.cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace SchulteForm.Controls
{
class Numbers
{
//Button b;
public void InitNumbers(TableLayoutPanel tbp, List<Button> listbu)
{


for (int i = 0; i < 5; i++)
{
for (int j = 0; j < 5; j++)
{
Button bu = new Button();
bu.Dock = DockStyle.Fill;
bu.Text = (i*5+j+1).ToString();
bu.Font = new Font("Consolas", 30, FontStyle.Bold |FontStyle.Italic);
listbu.Add(bu);
tbp.Controls.Add(bu, j, i);
}
}
}

public void RandomNumbers(ref List<Button> listbu)
{

int[] a = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25 };
Random r = new Random();
int b = a.Length;
for (int i = 0; i < a.Length; i++)
{
int temp = r.Next(b);
//Console.WriteLine(a[temp]);
//int temp1 = a[temp];
//a[temp] = a[b - 1];
//a[b - 1] = temp1;
string temp1 = listbu[temp].Text;
listbu[temp].Text = listbu[b - 1].Text;
listbu[b - 1].Text = temp1;
b -= 1;
}
}

public void ClickNumbers(ref Button bu,ref int i)
{


//Console.WriteLine(col.Text);
//Button btn = col as Button;
if (bu.Text == i.ToString())
{
bu.BackColor = Color.Orange;
i++;
}
else
{
bu.BackColor = Color.Red;
}

}

public void ResetNumbersColor(ref List<Button> listbu)
{

foreach (Control col in listbu)
{
col.BackColor = SystemColors.Control;
}
}

}
}