# coding:utf-8 #"""
#============================================================
作者:@Qss
2021年3月20日起草
2021年3月21日完工
2021年3月23日一次优化完成
2021年3月31日完成二次优化(关卡设计)
二次优化待解决漏洞:设计关卡后窗口不能自动显示,需手动切换
2021年4月1日三次优化完成,成功解决二次优化bug
#============================================================
"""from random import*#导入随机数模块from tkinter import*#导入图形化用户界面模块
step_number =0#设置步数的变量,初始值为0
difficulty =int(input('请输入数字华容道列数(3/4/5):'))defButton_Click_1(x,y):#按钮点击事件函数"""声明空白按钮行列号和步数的变量为全局变量"""global row_of_space
global col_of_space
global step_number
"""判断判断点击按钮旁是否为空白按钮,是则交换位置"""ifabs(x-row_of_space)+abs(y-col_of_space)==1:
step_number +=1#将步数赋值
label_step_number['text']='步数:'+str(step_number)#将步数变量导入label控件"""交换按钮位置"""
buttons[row_of_space,col_of_space]['text']= buttons[x,y]['text']
buttons[x,y]['text']=' '
row_of_space = x
col_of_space = y
n =0for row inrange(3):for col inrange(3):"""对比所有按钮序列是否正确,不正确则跳出函数"""if buttons[row,col]['text']!= numbers[n]:return
n +=1"""所有按钮判断完毕赢得游戏胜利"""
label_welcomes['text']='你赢了'defButton_Click_2(x,y):#按钮点击事件函数"""声明空白按钮行列号和步数的变量为全局变量"""global row_of_space
global col_of_space
global step_number
"""判断判断点击按钮旁是否为空白按钮,是则交换位置"""ifabs(x-row_of_space)+abs(y-col_of_space)==1:
step_number +=1#将步数赋值
label_step_number['text']='步数:'+str(step_number)#将步数变量导入label控件"""交换按钮位置"""
buttons[row_of_space,col_of_space]['text']= buttons[x,y]['text']
buttons[x,y]['text']=' '
row_of_space = x
col_of_space = y
n =0for row inrange(4):for col inrange(4):"""对比所有按钮序列是否正确,不正确则跳出函数"""if buttons[row,col]['text']!= numbers[n]:return
n +=1"""所有按钮判断完毕赢得游戏胜利"""
label_welcomes['text']='你赢了'defButton_Click_3(x,y):#按钮点击事件函数"""声明空白按钮行列号和步数的变量为全局变量"""global row_of_space
global col_of_space
global step_number
"""判断判断点击按钮旁是否为空白按钮,是则交换位置"""ifabs(x-row_of_space)+abs(y-col_of_space)==1:
step_number +=1#将步数赋值
label_step_number['text']='步数:'+str(step_number)#将步数变量导入label控件"""交换按钮位置"""
buttons[row_of_space,col_of_space]['text']= buttons[x,y]['text']
buttons[x,y]['text']=' '
row_of_space = x
col_of_space = y
n =0for row inrange(5):for col inrange(5):"""对比所有按钮序列是否正确,不正确则跳出函数"""if buttons[row,col]['text']!= numbers[n]:return
n +=1"""所有按钮判断完毕赢得游戏胜利"""
label_welcomes['text']='你赢了'"""创建华容道游戏窗口"""
root = Tk()#创建图形化用户界面实例
root.title('数字华容道')#设置窗口标题
root.geometry("400x400")#将窗口大小设为高300宽300
root.configure(bg ='black')#将窗口背景设为黑色
root.resizable(width =False,height =False)#设置窗口为不可拉伸"""设置欢迎语的label控件"""
label_welcomes = Label(root,text ='欢迎来到数字华容道',bg ='black',fg ='red',font =("Arial",13))#设置label控件的属性
label_welcomes.place(x =20,y =10,width =250,height =40)#设置label控件位置"""设置显示操作方式的label控件"""
label_operation = Label(root,text ='单击数字',bg ='black',fg ='white',font =("Arial",10))
label_operation.place(x =3,y =40,width =50,height =30)
label_operation_2 = Label(root,text ='移动方块',bg ='black',fg ='white',font =("Arial",10))
label_operation_2.place(x =3,y =60,width =50,height =30)"""设置显示步数的label控件"""
label_step_number = Label(root,text ='步数:'+str(step_number),bg ='black',fg ='yellow',font =("Arial",10))
label_step_number.place(x =3,y =20,width =50,height =30)if difficulty ==3:
root.attributes("-topmost",True)
row_of_space =0#存放空白按钮的行号
col_of_space =0#存放空白按钮的列号
buttons ={}#存放数字按钮的数组
numbers =['1','2','3','4','5','6','7','8',' ']#所有数字文本的列表
shuffle(numbers)#打乱数字列表中的数字顺序"""制造数字华容道方阵"""for row inrange(3):for col inrange(3):"""创建数字按钮,并将行列号传入该按钮的点击事件函数"""
button = Button(root,command =lambda x = row,y = col:Button_Click_1(x,y),bg ='black',fg ='green',font =("Arial",35))
buttons[row,col]= button #将按钮导入数组
button['text']= numbers.pop()#设置按钮上的文本
button.place(x =60+ col *60,y =60+ row *60,width =50,height =50)#设置数字按钮大小if button['text']==' ':#判断是否为空白按钮,如果是,则记录到空白按钮行列号变量
row_of_space = row
col_of_space = col
numbers =['1','2','3','4','5','6','7','8',' ']#还原数字列表
root.mainloop(
)#显示窗口elif difficulty ==4:
root.attributes("-topmost",True)
row_of_space =0#存放空白按钮的行号
col_of_space =0#存放空白按钮的列号
buttons ={}#存放数字按钮的数组
numbers =['1','2','3','4','5','6','7','8','9','10','11','12','13','14','15',' ']#所有数字文本的列表
shuffle(numbers)#打乱数字列表中的数字顺序"""制造数字华容道方阵"""for row inrange(4):for col inrange(4):"""创建数字按钮,并将行列号传入该按钮的点击事件函数"""
button = Button(root,command =lambda x = row,y = col:Button_Click_2(x,y),bg ='black',fg ='green',font =("Arial",35))
buttons[row,col]= button #将按钮导入数组
button['text']= numbers.pop()#设置按钮上的文本
button.place(x =60+ col *60,y =60+ row *60,width =50,height =50)#设置数字按钮大小if button['text']==' ':#判断是否为空白按钮,如果是,则记录到空白按钮行列号变量
row_of_space = row
col_of_space = col
numbers =['1','2','3','4','5','6','7','8','9','10','11','12','13','14','15',' ']#还原数字列表
root.mainloop()#显示窗口elif difficulty ==5:
root.attributes("-topmost",True)
row_of_space =0#存放空白按钮的行号
col_of_space =0#存放空白按钮的列号
buttons ={}#存放数字按钮的数组
numbers =['1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16','17','18','19','20','21','22','23','24',' ']#所有数字文本的列表
shuffle(numbers)#打乱数字列表中的数字顺序for row inrange(5):for col inrange(5):"""创建数字按钮,并将行列号传入该按钮的点击事件函数"""
button = Button(root,command =lambda x = row,y = col:Button_Click_3(x,y),bg ='black',fg ='green',font =("Arial",35))
buttons[row,col]= button #将按钮导入数组
button['text']= numbers.pop()#设置按钮上的文本
button.place(x =60+ col *60,y =60+ row *60,width =50,height =50)#设置数字按钮大小if button['text']==' ':#判断是否为空白按钮,如果是,则记录到空白按钮行列号变量
row_of_space = row
col_of_space = col
numbers =['1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16','17','18','19','20','21','22','23','24',' ']#还原数字列表
root.mainloop()#显示窗口else:print('未完成此类关卡')
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
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
下面是程序运行结果
三阶华容道加胜利
四阶华容道加胜利
五阶就不传了,都一样
接下来说一下代码原理
首先看下这一段
defButton_Click_1(x,y):#按钮点击事件函数"""声明空白按钮行列号和步数的变量为全局变量"""global row_of_space
global col_of_space
global step_number
"""判断判断点击按钮旁是否为空白按钮,是则交换位置"""ifabs(x-row_of_space)+abs(y-col_of_space)==1:
step_number +=1#将步数赋值
label_step_number['text']='步数:'+str(step_number)#将步数变量导入label控件"""交换按钮位置"""
buttons[row_of_space,col_of_space]['text']= buttons[x,y]['text']
buttons[x,y]['text']=' '
row_of_space = x
col_of_space = y
n =0for row inrange(3):for col inrange(3):"""对比所有按钮序列是否正确,不正确则跳出函数"""if buttons[row,col]['text']!= numbers[n]:return
n +=1"""所有按钮判断完毕赢得游戏胜利"""
label_welcomes['text']='你赢了'