tkinter华容道4x4教程三

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

下一步讲解华容道的数字判定

  • 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、付费专栏及课程。

余额充值