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

由于比赛需要,我这边制作了一份数字华容道,内含有3,4,5阶的数字华容道,开头在壳窗口内选择,运用了随机数模块(random)和图形化用户界面(tkinter)
具体代码讲解请看
Python数字华容道编辑日记(细讲原理)

下面是程序完整代码

# 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 = yn = 0   for row in range(3):for col in range(3):"""对比所有按钮序列是否正确,不正确则跳出函数"""if buttons[row,col]['text'] != numbers[n]:  returnn += 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 = yn = 0   for row in range(4):for col in range(4):"""对比所有按钮序列是否正确,不正确则跳出函数"""if buttons[row,col]['text'] != numbers[n]:  returnn += 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 = yn = 0   for row in range(5):for col in range(5):"""对比所有按钮序列是否正确,不正确则跳出函数"""if buttons[row,col]['text'] != numbers[n]:  returnn += 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 = rowcol_of_space = colnumbers = ['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 = rowcol_of_space = colnumbers = ['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 = rowcol_of_space = colnumbers = ['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 = yn = 0   for row in range(3):for col in range(3):"""对比所有按钮序列是否正确,不正确则跳出函数"""if buttons[row,col]['text'] != numbers[n]:  returnn += 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数字华容道(可选择关卡)相关推荐

  1. Python数字华容道--程序实现的创意数学小游戏

    下载链接:Python数字华容道--程序实现的创意数学小游戏-Python文档类资源-CSDN下载 当前的数学教育环境下,更强调的是数学素养的提升,本程序提供了一个免费的数学益智小游戏的学习和训练平台 ...

  2. python数字华容道算法_用React写一个数字华容道,你需要知道的秘密

    还在上班?很无聊? 这个叫前言 年末了.哦,不,要过年了.以前只能一路站到公司的我,今早居然是坐着过来的.新的一年,总要学一个新东西来迎接新的未来吧,所以选择了一直未碰的那个据说是全宇宙最牛逼的前端框 ...

  3. python数字华容道

    python 需要安装PyQt5库 pip install PyQt5 import sys import random from enum import IntEnum from PyQt5.QtW ...

  4. python数字华容道算法_Python 3*3数字华容道源代码

    from random import choice # 导入choice函数 from os import system # 导入system函数 from time import sleep # 导 ...

  5. python数字华容道算法_pyqt 简单实现3X3数字华容道

    # -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'num.ui' # # Created by ...

  6. 超赞的贪吃蛇、吃豆人和数字华容道等童年小游戏1行Python代码就能玩

    今天分享一个有趣的Python游戏库freegames,它包含20余款经典小游戏,像贪吃蛇.吃豆人.乒乓.数字华容道等等,依托于标准库Turtle. 我们不仅可以通过1行代码进行重温这些童年小游戏,还 ...

  7. 超赞!贪吃蛇、吃豆人和数字华容道等童年小游戏1行Python代码就能玩

    大家好,我是才哥. 今天分享一个有趣的Python游戏库freegames,它包含20余款经典小游戏,像贪吃蛇.吃豆人.乒乓.数字华容道等等,依托于标准库Turtle. 我们不仅可以通过1行代码进行重 ...

  8. Python游戏开发:最强大脑第一关,数字华容道

    前言 freegames是Apache2许可的Python游戏集合,旨在用于教育和娱乐,完全是开源的,我们只要引用编写就好,当前在最强大脑的舞台上的第一关就是数字华容道,好多人都栽在了上面,如果你也想 ...

  9. 用python写数字_用python 写游戏之数字华容道

    当初对这个游戏颇有印象还是在最强大脑节目上面,何猷君以几十秒就完成了这个游戏.写2048游戏的时候,又想起了这个游戏,想着来研究一下. 游戏玩法 用尽量少的步数,尽量短的时间,将棋盘上的数字方块,按照 ...

最新文章

  1. NetDevOps — SNMP 协议
  2. 802.1X的wpa认证流程-------4-way handshake过程分析
  3. 设计模式--抽象工厂(Abstract Factory)模式
  4. ActionBarSherlock ViewPagerIndicator
  5. Codevs 2296 仪仗队 2008年省队选拔赛山东
  6. 思科路由器NAT配置详解(转)
  7. vbs关不掉的计算机窗口,恶搞之关不掉的窗口.vbs脚本
  8. 飞机上的氧气面罩有什么用_第2部分—另一个面罩检测器……(
  9. Shell 字符串截取
  10. ansbile简单应用
  11. Configtool
  12. java文件传输实验分析_Java实验报告(实验五)
  13. 如果读书无用,那为什么还要读书
  14. Least Angel Regression
  15. js实现网页进度条效果
  16. 鼠标右键“新建”选项没没有如何解决?
  17. spss之“方差分析”
  18. 计算机专业简历教育背景怎么写,简历中教育背景怎么写?填写教育背景注意事项...
  19. Django view(视图)
  20. java查看kafka数据量_Java kafka监控 topic的数据量count情况,每个topic的offset,

热门文章

  1. VESC 电控命令调试记录
  2. CSM(Certified Scrum Master)敏捷大师培训总结
  3. 2、Solr创建核心
  4. Java:JSON解析工具-json-lib
  5. 研报精选230207
  6. Linux - top命令详解
  7. 军犬舆情热点:诺贝尔颁奖盛典在瑞典举行;多款iPhone禁止销售
  8. Java面试必备八股文
  9. FPGA项目承接|FPGA项目外包|FPGA项目研发
  10. 电话号码 (哈希表+模拟)