本文实例为大家分享了C#实现数字华容道游戏的具体代码,供大家参考,具体内容如下
代码如下:
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
|
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace WindowsFormsApp6 {undefined public partial class Form1 : Form {undefined public Form1() {undefined InitializeComponent(); } const int N = 4; Button[,] buttons = new Button[N, N]; private void Form1_Load( object sender, EventArgs e) {undefined //产生所有按钮 GenerateAllButtons(); } private void button1_Click( object sender, EventArgs e) {undefined Shuffle(); } //打乱顺序 void Shuffle() {undefined //多次随机交换两个按钮 Random rnd = new Random(); for ( int i=0;i<100;i++) {undefined int a = rnd.Next(N); int b = rnd.Next(N); int c = rnd.Next(N); int d = rnd.Next(N); Swap(buttons[a, b], buttons[c, d]); } } //生成所有按钮 void GenerateAllButtons() {undefined int x0 = 100, y0 = 10, w = 45, d = 50; for ( int r=0;r<N;r++) for ( int c = 0; c < N; c++) {undefined int num = r * N + c; Button btn = new Button(); btn.Text = (num + 1).ToString(); btn.Top = y0 + r * d; btn.Left = x0 + c * d; btn.Width = w; btn.Height = w; btn.Visible = true ; btn.Tag = r * N + c; //这个数据用来表示它所在的行列位置 //注册事件 btn.Click += new EventHandler(btn_Click); buttons[r, c] = btn; this .Controls.Add(btn); } buttons[N - 1, N - 1].Visible = false ; //最后一个不可见 } //交换两个按钮 void Swap(Button btna,Button btnb) {undefined string t = btna.Text; btna.Text = btnb.Text; btnb.Text = t; bool v = btna.Visible; btna.Visible = btnb.Visible; btnb.Visible = v; } //按钮点击事件处理 void btn_Click( object sender, EventArgs e) {undefined Button btn = sender as Button; //当前点中按钮 Button blank= FindHiddenButton(); //空白按钮 //判断与空白按钮是否相邻,如果是,交换 if (IsNeighbor(btn, blank)) {undefined Swap(btn, blank); blank.Focus(); } //判断是否完成了 if (ResultIsOk()) {undefined MessageBox.Show( "ok" ); } } //查找要隐藏的按钮 Button FindHiddenButton() {undefined for ( int r = 0; r < N; r++) for ( int c = 0; c < N; c++) {undefined if (!buttons[r, c].Visible) {undefined return buttons[r, c]; } } return null ; } //判断是否相邻 bool IsNeighbor(Button btnA, Button btnB) {undefined int a = ( int )btnA.Tag; //Tag中记录是行列位置 int b = ( int )btnB.Tag; int r1 = a / N, c1 = a % N; int r2 = b / N, c2 = b % N; if (r1 == r2 && (c1 == c2 - 1 || c1 == c2 + 1) //左右相邻 || c1 == c2 && (r1 == r2 - 1 || r1 == r2 + 1)) return true ; return false ; } //检查是否完成 bool ResultIsOk() {undefined for ( int r = 0; r < N; r++) for ( int c = 0; c < N; c++) {undefined if (buttons[r, c].Text != (r * N + c + 1).ToString()) {undefined return false ; } } return true ; } } } |
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/summoxj/article/details/79911776