tkinter华容道4x4教程三
过程:
1.分析讨论华容道随机开始的方法
2.尝试使用直接打断的列表程序的方法探索可能性
3.字典的随机抽取与打乱判定讲解
目标:
1.能使用random库函数随机打乱列表排序
2.掌握字典随机抽取关键字方法
3.设计华容道有解的打断算法
基于第二部分的程序我们完成了华容道数字按钮的判定移动,因为本程序项目中的数字文本是用一个列表的内容去创建调用的,如果我们直接打乱这个列表就可以让华容道生成的数字按钮位置随机,这里大家可以先尝试一下
但是大家多玩几次会发现华容道会有无解的可能性,说明我们程序如果是直接随机打乱位置,这种方法是行不同的,我们可以使用一个思路,就是如果华容道一开始是排序好的情况,我们的程序随机选择一个数字按钮,如果这个数字按钮是满足华容道移动条件的,那么就让他和空格的数字按钮换位置,加快这一过程的话,有点类似与让华容道按照自己的移动规律去打乱
代码更新为55-72行,注释详细标注
import tkinter as t
import random
from tkinter import messagebox
class btn:#类函数创建单独的华容道按钮
def __init__(self,x,y,text,ca):
global number,kong
self.canvas=ca
self.x=x
self.y=y
self.text=text
self.btnname=t.Button(self.canvas,text=self.text,font="kaiti 50 bold",width=3,command=self.check)
self.btnname.place(x=self.x,y=self.y)
if self.text == " ":#判断文本是否为空
kong=self.btnname#单独创意一个变量存储我们空按钮,也就是没有数字的按钮
number[self.btnname]=[self.x,self.y,self.text]#将内容添加到字典number中
def check(self): # 对象点击事件
global kongx, kongy, number, kong
if abs(abs(number[self.btnname][0] - kongx) + abs(number[self.btnname][1] - kongy)) == 120:
kong.place(x=number[self.btnname][0], y=number[self.btnname][1])#空数字按钮的位置移动到点击按钮的位置
self.btnname.place(x=kongx, y=kongy)#点击按钮的位置移动到空数字按钮的位置
a = kongx#中间变量
b = kongy#中间变量
kongx = number[self.btnname][0]#空数字按钮的x坐标更新
kongy = number[self.btnname][1]#空数字按钮的y坐标更新
number[self.btnname] = [a, b, self.text]#字典信息更新
def zjm():#主界面程序
zjm_canvas=t.Canvas(wind,width=600,height=600,bg="lightyellow")
zjm_canvas.place(x=0,y=0)
begin_btn=t.Button(zjm_canvas,text="开始挑战",font="kaiti 40 bold",command=fjm)
begin_btn.place(x=180,y=200)
def fjm():#游戏界面程序与初始化设置
global number
number = {}
global kongx,kongy,numlist,upset_num,fjm_canvas,random_number
fjm_canvas = t.Canvas(wind, width=600, height=600, bg="lightyellow")
fjm_canvas.place(x=0, y=0)
numlist=[1,2,3,4,5,6,7,8,9,10,11,12,13,14," ",15]
#random.shuffle(numlist)
x=50#x坐标初始值
y=50#y坐标初始值
n=0#定义换行的变量
for i in numlist:#遍历列表
if i == " ":#如果等于空,提前记录关于空按钮的坐标信息
kongx=x#空按钮的x坐标
kongy=y#空按钮的y坐标
btn(x,y,str(i),fjm_canvas)#调用类函数
x+=120#每个按钮间隔为120
n+=1
if n == 4:#满足条件说明横向有四个按钮
n=0#计数清零
x=50#换行x坐标归零位
y+=120#y坐标增加
print(number)#打印字典中的内容
random_number = 0 # 定义随机打乱的次数
random_method() # 随机打乱方法
def random_method():
global kongx, kongy, number, random_number
random_btn = random.choice(list(number)) # 随机选择一个字典中的关键字,也就是我们的按钮对象
if number[random_btn][2] != " ": # 这一步很重要
if abs(abs(number[random_btn][0] - kongx) + abs(number[random_btn][1] - kongy)) == 120: # 判断当前随机出的按钮是否满足换位条件
text = number[random_btn][2] # 暂存文本内容
kong.place(x=number[random_btn][0], y=number[random_btn][1])
random_btn.place(x=kongx, y=kongy)
a = kongx
b = kongy
kongx = number[random_btn][0]
kongy = number[random_btn][1]
number[random_btn] = [a, b, text] # 以上程序和华容道移动相似,这里不做重复的讲解
random_number += 1 # 没成功换位一次,增加1
if random_number != 100: # 随机换位次数限制100次
fjm_canvas.after(1, random_method) # 1ms进行一次刷新
wind=t.Tk()#主程序
wind.geometry("600x600")
zjm()
wind.mainloop()
下一步讲解华容道的数字判定