python实现数字华容道

2021-04-09 0 658

制作Python数字华容道(可选择关卡),供大家参考,具体内容如下

由于比赛需要,我这边制作了一份数字华容道,内含有3,4,5阶的数字华容道,开头在壳窗口内选择,运用了随机数模块(random)和图形化用户界面(tkinter)

下面是程序完整代码

# 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):\'))
def Button_Click_1(x,y):      #按钮点击事件函数
        \"\"\"声明空白按钮行列号和步数的变量为全局变量\"\"\"
        global row_of_space  
        global col_of_space    
        global step_number
        \"\"\"判断判断点击按钮旁是否为空白按钮,是则交换位置\"\"\"
        if abs(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 = 0   
            for row in range(3):
                for col in range(3):
                    \"\"\"对比所有按钮序列是否正确,不正确则跳出函数\"\"\"
                    if buttons[row,col][\'text\'] != numbers[n]:  
                        return
                    n += 1
            \"\"\"所有按钮判断完毕赢得游戏胜利\"\"\"
            label_welcomes[\'text\'] = \'你赢了\'

def Button_Click_2(x,y):      #按钮点击事件函数
        \"\"\"声明空白按钮行列号和步数的变量为全局变量\"\"\"
        global row_of_space  
        global col_of_space    
        global step_number
        \"\"\"判断判断点击按钮旁是否为空白按钮,是则交换位置\"\"\"
        if abs(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 = 0   
            for row in range(4):
                for col in range(4):
                    \"\"\"对比所有按钮序列是否正确,不正确则跳出函数\"\"\"
                    if buttons[row,col][\'text\'] != numbers[n]:  
                        return
                    n += 1
            \"\"\"所有按钮判断完毕赢得游戏胜利\"\"\"
            label_welcomes[\'text\'] = \'你赢了\'

def Button_Click_3(x,y):      #按钮点击事件函数
        \"\"\"声明空白按钮行列号和步数的变量为全局变量\"\"\"
        global row_of_space  
        global col_of_space    
        global step_number
        \"\"\"判断判断点击按钮旁是否为空白按钮,是则交换位置\"\"\"
        if abs(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 = 0   
            for row in range(5):
                for col in range(5):
                    \"\"\"对比所有按钮序列是否正确,不正确则跳出函数\"\"\"
                    if buttons[row,col][\'text\'] != numbers[n]:  
                        return
                    n += 1
            \"\"\"所有按钮判断完毕赢得游戏胜利\"\"\"
            label_welcomes[\'text\'] = \'你赢了\'

\"\"\"创建华容道游戏窗口\"\"\"
root = Tk()                      #创建图形化用户界面实例
root.title(\'数字华容道\')         #设置窗口标题
root.geometry(\"400x400\")    #将窗口大小设为高400宽400
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 in range(3): 
        for col in range(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 in range(4): 
        for col in range(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 in range(5): 
        for col in range(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(\'未完成此类关卡\')

下面是程序运行结果

三阶华容道加胜利

python实现数字华容道

python实现数字华容道

四阶华容道加胜利

python实现数字华容道

python实现数字华容道

五阶就不传了,都一样

接下来说一下代码原理

首先看下这一段

def Button_Click_1(x,y):      #按钮点击事件函数
        \"\"\"声明空白按钮行列号和步数的变量为全局变量\"\"\"
        global row_of_space  
        global col_of_space    
        global step_number
        \"\"\"判断判断点击按钮旁是否为空白按钮,是则交换位置\"\"\"
        if abs(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 = 0   
            for row in range(3):
                for col in range(3):
                    \"\"\"对比所有按钮序列是否正确,不正确则跳出函数\"\"\"
                    if buttons[row,col][\'text\'] != numbers[n]:  
                        return
                    n += 1
            \"\"\"所有按钮判断完毕赢得游戏胜利\"\"\"
            label_welcomes[\'text\'] = \'你赢了\'

这段是自定义了三个按钮的点击事件函数,不过三个都差不多,就是range后面的数字换了(应对不同的阶级)。这个函数在注释上已经写明了,是判断点击按钮旁是否有空白按钮的,有则交换位置。后面运用循环嵌套对比序列中的数字和矩阵上的是否一一对应,不对应就跳出循环,对应则判定为赢得游戏。

\"\"\"创建华容道游戏窗口\"\"\"
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)

这一段创建了图形化用户界面,具体每行代码做什么用的注释上我都标清楚了。

接着说一下,由于时间有限,只做了在壳窗口内选择几阶级数字华容道的版本。是用输入数字来判定的。其他的都是些简单玩意,比如说按钮创建,调用函数和循环嵌套,代码的注释上都写了一些大概意思,有点tkinter基础的应该都能看懂,不会的可以问我。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持自学编程网。

遇见资源网 Linux python实现数字华容道 http://www.ox520.com/30102.html

常见问题

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务