[Python GUI]Python内置图形界面tkinter Hand-Eye Coordination--游戏实战1

  • 游戏介绍
  • 关键词
  • TodoList
  • 代码详解

游戏介绍

本文实现的是一种成为hand-eye coordination的游戏的简单实现。hand-eye coordination就是一种锻炼手眼协调控制的游戏,有些类似于别踩白块,虽然比别踩白块要简单,但是思想是一样的。
代码实现了可以通过设置画布大小和网格多少来初始化UI,并设置方块下落速度,以改变游戏难度,还可以设置方块出现多少次之后结束本次游戏。
此游戏初步实现一个简单的版本,还可继续完善,除了下面Todolist所列出的,有其他玩法,也欢迎在评论区留言讨论。

没有gif,只能靠描述了,点击上方的 START 之后开始游戏,会在第一行随机生成方块,然后一格一格往下掉,直到最后一行,继续往下掉就消失;或者是在下落的途中,有点击事件也会消失。

关键词

Hand-Eye Coordination
Tkinter,Canvas,Button,after

TodoList

  • 设置画布大小
  • 设置网格多少
  • 设置移动速度
  • 循环次数,默认无限次
  • 改成界面设置参数
  • 加个计算分数的功能
  • 增加方块的数量,随机颜色
  • 打包

改变玩法:

  • 可以改成全屏随机出现方块
  • 方块换仓图片就是打地鼠

代码详解

个人感觉代码注释的已经很清楚了,就不在多余去解释了。
就在这里讲讲设计思想和函数的作用吧。

__init__(): 初始化各个参数;
delete_rect(): 绑定在方块上的函数,作用是删除方块,即点击事件调用的函数,或者掉到底部时调用;
draw_grid(): 被init_ui调用,用来画水平线和垂直线,生成网格;
gen_square(): 生成方块,同时绑定删除事件;
init_ui(): 初始化UI,设置并固定窗口大小,设置按钮和画布大小;
move_down(): 控制方块向下运动
还有一个控制延时的函数after,是实现运动的关键;
after(ms, func): 第一个参数是延时时长,单位是毫秒;第二个参数是延时之后运行的函数。对于这个函数,网上看了一些例子,感觉都不太好理解,是我太笨了;还有一些文章说延时时间不准,这也没有去深究,毕竟这个游戏对延时时间准确度要求没那么高。

import tkinter as tk
import random
class EyeHand:def __init__(self, canvas:tuple = (500,500), grid:tuple = (10,10), speed:int = 1, loop:int = 10) -> None:# 网格的数量self.grid = grid# 计算每个grid的宽高,(方便点的话,限制grid为正方形,这里可以为矩形),# 然后确定canvas宽高,所以,输入的宽高只是个参考值# 每个小格的宽高self.grid_w = canvas[0] // self.grid[0]self.grid_h = canvas[1] // self.grid[1]# 画布的尺寸self.canvas_size = (self.grid_w*self.grid[0], self.grid_h*self.grid[1])# 方块移动的速度 1000ms // speedself.speed = 1000 // speed# # 出现几个方块之后结束# self.loop = loop# 窗口的尺寸self.win_size = str(self.canvas_size[0]+40)+"x"+str(self.canvas_size[1]+120)self.main_win = tk.Tk()# 窗口名self.main_win.title("Eye–hand coordination")# 初始化UIself.init_ui()# 窗口显示self.mainloop = self.main_win.mainloop# 方块向下走的步数self.step = 0# 最大步数self.max_step = self.grid[1]# 当前是否有方块self.square_exists = False# 循环次数self.count = 0# 最大循环次数self.max_count = loopdef init_ui(self) -> None :self.main_win.geometry(self.win_size) # 设置窗口大小self.main_win.resizable(0, 0) # 固定窗口大小self.canvas = tk.Canvas(self.main_win, bg="#999AAA", cursor="plus", height=self.canvas_size[0], width=self.canvas_size[1]) # 设置画布self.canvas.place(x=20, y=50)self.draw_grid(self.grid) # 画网格self.btn1 = tk.Button(self.main_win, text="START", font=("Arial", 12), width=20, height=1, command=self.gen_square) # 设置"开始游戏"按钮self.btn1.pack()def draw_grid(self, size) -> None :for row in range(0, size[0]+1):self.canvas.create_line(0, self.grid_h*row, self.canvas_size[1], self.grid_h*row) # 画水平线for col in range(0, size[1]+1):self.canvas.create_line(self.grid_w*col, 0, self.grid_w*col, self.canvas_size[0]) # 画垂直线def gen_square(self) -> None :# 生成矩形的次数达到最大限制则不再生成if self.count >= self.max_count:self.count = 0 # 一次游戏结束,循环次数置0,则可以按"start"键重新开始游戏returnself.step = 0 # 每次生成方块,step置0try:self.delete_rect(tk.Event) # 如果界面中有方块,先清除except:passoffset = random.randint(0, self.grid[0]-1) # 第一行随机位置生成方块的变化量r = self.canvas.create_rectangle(self.grid_w*offset, 0, self.grid_w*offset+self.grid_h, self.grid_h, fill='blue',tags=("rect")) # 第一行随机位置生成方块self.square_exists = Trueself.canvas.tag_bind( 'rect' , '<Button-1>' , self.delete_rect)self.canvas.after(self.speed, self.move_down) # 关键方法,.after(deley_ms, func),延迟deley_ms毫秒后,执行func函数def move_down(self) -> None :self.step += 1 # 计数向下移动次数,到底还没被点击则删除if self.step >= self.max_step:self.delete_rect(tk.Event)if self.square_exists: # 有方块存在,向下移动方块self.canvas.move('rect', 0, self.grid_h)self.canvas.after(self.speed, self.move_down)else: # 没有方块存在,生成下一个方块self.count += 1self.canvas.after(self.speed, self.gen_square)def delete_rect(self, event) ->None : # 删除方块self.canvas.delete("rect")self.square_exists = Falsegame = EyeHand(canvas=(500,500), grid=(5,5), speed=5, loop=10)
game.mainloop()

代码还有可以优化和完善的地方,留待日后无聊的时候再说吧!

[Python GUI]Python内置图形界面tkinter Eye-Hand Coordination--游戏实战1相关推荐

  1. JDK 内置图形界面工具:海阔凭鱼跃,天高任鸟飞

    GUI 图形界面工具,主要是 3 款:JConsole.JVisualVM.JMC.其实这三个产品可以说是 3 代不同的 JVM 分析工具. 这三个工具都支持我们分析本地 JVM 进程,或者通过 JM ...

  2. python tkinter界面布局,python图形界面tkinter布局那些事

    布局 任何界面都有自己的布局风格,有些是横向布局,有些是纵向布局,有些是流水布局,还有些是网格布局,总之布局就是一种考虑如何放置元素或者组件的一种说明方式. 包裹(包装)布局 thinter中使用pa ...

  3. Python两个内置函数——locals 和globals

    python作用域 http://tgstdj.blog.163.com/blog/static/748200402012419114428813/ 有两种类型的作用域--类的变量和对象的变量. 类的 ...

  4. python 两个内置函数——locals 和globals(名字空间)批量以自定义变量名创建对象

    文章目录 locals 和globals(名字空间)简介 1.局部变量函数locals例子(locals 返回一个名字/值对的字典) 批量创建对象 示例1 示例2 函数内 类内 2.全局变量函数glo ...

  5. python只能使用内置数据库_隐藏彩蛋:你知道python有一个内置的数据库吗?

    本文转载自公众号"读芯术"(ID:AI_Discovery). 如果你是软件开发人员,相信你一定知道甚至曾经使用过一个非常轻量级的数据库--SQLite.它几乎拥有作为一个关系数据 ...

  6. python中比较重要的几个函数_Python 几个重要的内置函数 python中的内置函数和关键字需要背过吗...

    python重要的几个内置函数用法 python内置函数什么用忘不掉的是回忆,继续的是生活,错过的,就当是路过吧.来来往往身边出现很多人,总有一个位置,一直没有变.看看温暖的阳光,偶尔还是会想一想. ...

  7. python之路——内置函数和匿名函数

    楔子 在讲新知识之前,我们先来复习复习函数的基础知识. 问:函数怎么调用? 函数名() 如果你们这么说...那你们就对了!好了记住这个事儿别给忘记了,咱们继续谈下一话题... 来你们在自己的环境里打印 ...

  8. 十五. Python基础(15)--内置函数-1

    十五. Python基础(15)--内置函数-1 1 ● eval(), exec(), compile() 执行字符串数据类型的python代码 检测#import os 'import' in c ...

  9. dbeaver无法修改表数据_隐藏彩蛋:你知道python有一个内置的数据库吗?

    全文共2520字,预计学习时长7分钟 如果你是软件开发人员,相信你一定知道甚至曾经使用过一个非常轻量级的数据库--SQLite.它几乎拥有作为一个关系数据库所需的所有功能,而且这些有功能都保存在一个文 ...

  10. python学习总结----内置函数及数据持久化

    python学习总结----内置函数及数据持久化 抽象基类(了解)- 说明:- 抽象基类就是为了统一接口而存在的- 它不能进行实例化- 继承自抽象类的子类必须实现抽象基类的抽象方法 - 示例:from ...

最新文章

  1. 伍六七带你学算法 进阶篇-三数之和
  2. 为什么下一个SaaS公司绝不会效仿Salesforce?
  3. Centos5.6入门学习003之Cenots环境初始化
  4. MongoDB的基本用法
  5. 【组合数学】递推方程 ( 递推方程示例 2 汉诺塔 | 递推方程示例 3 插入排序 )
  6. 为jupyter_notebook增加目录
  7. 电脑所有程序里有不一样颜色_12个好玩的电脑屏保,让你成为别人眼中最靓的仔。...
  8. 2026.静态分析工具pclint
  9. Entity Framework加载相关实体——Eager Loading
  10. 两个向量的点乘和叉乘怎么算_【解析几何】赋值法(点乘双根法)解决解析几何大题...
  11. L1-003. 个位数统计-PAT团体程序设计天梯赛GPLT
  12. 色散方程用matlab编译,急切求助用matlab曲线拟合色散方程 - 程序语言 - 小木虫 - 学术 科研 互动社区...
  13. BitviseSSH绕过4A内网直连服务器
  14. Ps 2021教程,如何更换证件照背景?
  15. 苹果用计算机加个微信怎么弄的,教你苹果怎么用双开微信,就是这么简单!
  16. 搭建Longhorn
  17. 不知怎么选,用RFM模型看舔狗质量!
  18. Linux入门——1、Linux的安装(Ubuntu)
  19. 十分钟掌握 “UML ” 的基本使用
  20. VMware虚拟机centos6.5最小化安装以及配置网络

热门文章

  1. 电脑网页如何截取全图(长图)
  2. MapReduce实现kmeans算法
  3. u盘写保护怎么才能真正去掉
  4. 网页页面缩小放大的快捷键
  5. hive函数进阶总结
  6. 微信头像css 3圆形,如何在手机端用PICSART制作微信圆形头像(图文教程)
  7. JavaScript实现动态时间显示功能
  8. 微信小程序模拟器加载图片成功,真机加载失败
  9. RTMP 两种方式推流:推H.264、ACC和推FLV封装格式
  10. 数字/模拟信号中带宽的含义