tkinter华容道4x4教程二
过程:
1.基于华容道界面设计好的基础上完成华容道数字按钮的判定算法。
2.讲解python字典的创建,刷新,数据结构。
3.tkinter对象的控制与讲解。
目标:
1.能使用字典存储对象信息。
2.编程控制华容道按钮移动
在上一部分的设计中我们完成对华容道界面的设计,并利用类函数创建出16个按钮对象,下面我们要思考如何让这几个对象动起来,程序的设计思路是利用字典的结构,把对象名字和对象的x,y坐标,和对象的文本一起存储起来
hrd = {对象: [x,y,数字]}
字典的初始化我们可以选择放在游戏界面刚创建的时候,然后再创建按钮对象是进行字典的添加
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):#对象点击事件
pass
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
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)#打印字典中的内容
wind=t.Tk()#主程序
wind.geometry("600x600")
zjm()
wind.mainloop()
运行结束后我们就能看到后台开始打印字典中的内容
{<tkinter.Button object .!canvas2.!button>: [50, 50, '1'], <tkinter.Button object .!canvas2.!button2>: [170, 50, '2'], <tkinter.Button object .!canvas2.!button3>: [290, 50, '3'], <tkinter.Button object .!canvas2.!button4>: [410, 50, '4'], <tkinter.Button object .!canvas2.!button5>: [50, 170, '5'], <tkinter.Button object .!canvas2.!button6>: [170, 170, '6'], <tkinter.Button object .!canvas2.!button7>: [290, 170, '7'], <tkinter.Button object .!canvas2.!button8>: [410, 170, '8'], <tkinter.Button object .!canvas2.!button9>: [50, 290, '9'], <tkinter.Button object .!canvas2.!button10>: [170, 290, '10'], <tkinter.Button object .!canvas2.!button11>: [290, 290, '11'], <tkinter.Button object .!canvas2.!button12>: [410, 290, '12'], <tkinter.Button object .!canvas2.!button13>: [50, 410, '13'], <tkinter.Button object .!canvas2.!button14>: [170, 410, '14'], <tkinter.Button object .!canvas2.!button15>: [290, 410, ' '], <tkinter.Button object .!canvas2.!button16>: [410, 410, '15']}
分别记录了坐标信息和数字信息
下一步进行换位的逻辑比较
我们可以通过点击每一个对象获取他自己的对象名称,就可以通过提取字典的关键字方法,获取字典中存储的信息,空数字按钮的对象我们已经通过一个变量kong单独存储,就可以比较他们的坐标是否满足换位的条件
换位的逻辑是利用坐标差值的绝对值判断 (当前点击按钮的x坐标-空位置的x坐标)的绝对值+(当前点击按钮的y坐标-空位置的y坐标)的绝对值的和等于相邻按钮的差值,本程序中每个按钮的坐标相差为120
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
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)#打印字典中的内容
wind=t.Tk()#主程序
wind.geometry("600x600")
zjm()
wind.mainloop()
这样我们就可以达到换位的目的
下一部分讲解华容道随机打乱的算法