• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    python实现数字华容道

    制作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('未完成此类关卡')

    下面是程序运行结果

    三阶华容道加胜利

    四阶华容道加胜利

    五阶就不传了,都一样

    接下来说一下代码原理

    首先看下这一段

    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基础的应该都能看懂,不会的可以问我。

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

    您可能感兴趣的文章:
    • 如何在CocosCreator中利用常驻节点做图层管理
    • 游戏开发中如何使用CocosCreator进行音效处理
    • CocosCreator ScrollView优化系列之分帧加载
    • 详解CocosCreator项目结构机制
    • 如何使用CocosCreator对象池
    • CocosCreator如何实现划过的位置显示纹理
    • 整理CocosCreator常用知识点
    • 39条Python语句实现数字华容道
    • Android数字华容道小游戏开发
    • C/C++仿华容道小游戏
    • 详解CocosCreator华容道数字拼盘
    上一篇:python tkinter模块的简单使用
    下一篇:39条Python语句实现数字华容道
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    python实现数字华容道 python,实现,数字,华容道,