制作Python数字华容道的实现(可选择关卡)

 更新时间:2021年04月08日 09:33:50   作者:#Qss#  
这篇文章主要介绍了制作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基础的应该都能看懂,不会的可以问我。

到此这篇关于制作Python数字华容道的实现(可选择关卡)的文章就介绍到这了,更多相关Python数字华容道内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Django ORM多对多查询方法(自定义第三张表&ManyToManyField)

    Django ORM多对多查询方法(自定义第三张表&ManyToManyField)

    今天小编就为大家分享一篇Django ORM多对多查询方法(自定义第三张表&ManyToManyField),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-08-08
  • 浅析Python语言自带的数据结构有哪些

    浅析Python语言自带的数据结构有哪些

    Python已经广泛的应用于数据分析、数据挖掘、机器学习等众多科学计算领域,这篇文章主要介绍了Python语言自带的数据结构有哪些?需要的朋友可以参考下
    2019-08-08
  • pycharm 使用心得(三)Hello world!

    pycharm 使用心得(三)Hello world!

    作为PyCharm编辑器的起步,我们理所当然的先写一个Hello word,并运行它。(此文献给对IDE不熟悉的初学者)
    2014-06-06
  • Python 实现大整数乘法算法的示例代码

    Python 实现大整数乘法算法的示例代码

    这篇文章主要介绍了Python 实现大整数乘法算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • python 列表输出重复值以及对应的角标方法

    python 列表输出重复值以及对应的角标方法

    今天小编就为大家分享一篇python 列表输出重复值以及对应的角标方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-06-06
  • Python类定义和类继承详解

    Python类定义和类继承详解

    这篇文章主要介绍了Python类定义和类继承详解,本文讲解了类的私有属性、类的方法、私有的类方法、类的专有方法、类的定义、类的单继承、类的多继承等内容,需要的朋友可以参考下
    2015-05-05
  • Python入门篇之列表和元组

    Python入门篇之列表和元组

    Python包含6种内建序列:列表、元组、字符串、Unicode字符串、buffer对象、xrange对象。本篇主要讨论最常用的两种类型:列表、元组
    2014-10-10
  • 利用Python实现Windows定时关机功能

    利用Python实现Windows定时关机功能

    是最初的几个爬虫,让我认识了Python这个新朋友,虽然才刚认识了几天,但感觉有种莫名的默契感。下面通过这篇文章给大家介绍Python实现Windows定时关机功能,需要的朋友可以参考下
    2017-03-03
  • Python OpenCV实现裁剪并保存图片

    Python OpenCV实现裁剪并保存图片

    这篇文章主要为大家详细介绍了Python OpenCV实现裁剪并保存图片,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-07-07
  • Python实现将n个点均匀地分布在球面上的方法

    Python实现将n个点均匀地分布在球面上的方法

    这篇文章主要介绍了Python实现将n个点均匀地分布在球面上的方法,涉及Python绘图的技巧与相关数学函数的调用,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-03-03

最新评论