tkinter华容道4x4教程二

该教程介绍了如何在tkinter基础上完成华容道4x4的数字按钮判定算法,讲解了python字典的创建与刷新,以及如何通过字典存储和控制对象信息。目标是学会使用字典控制华容道按钮移动,实现对象的动态操作。内容包括利用字典记录按钮的坐标和数字,以及设计换位逻辑,通过点击按钮获取坐标信息,判断并实现相邻按钮的交换条件。
摘要由CSDN通过智能技术生成

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()

这样我们就可以达到换位的目的
下一部分讲解华容道随机打乱的算法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mh_Python_learn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值