系列文章入口

《Python3编程实战Tetris机器人》

界面设计

本项目注重算法实现,为了安装简单且具有强跨平台性,所以选择python内置的tkinter。这个界面库是有些问题,比如后面发现其与线程锁配合有问题,会莫名死掉。项目中的lockbug分支,我已经把问题定位了,进行了一系列的日志输出,有兴趣的同学可以去研究一下具体问题。这个问题可以避开,本项目使用的界面特性很少,我的主张够用即可。

设计思路

使用两个canvas来显示方块,一个是游戏空间,另一个是下一方块显示。因为界面比较简单,分成三部分,一是游戏空间,二是下一方块显示,三是信息即操作按钮。这三大块直接使用place绝对定位,第三大块使用frame对Label,Button等元素进行组合。

界面效果

具体实现

窗口设定

def start():
    root = Tk()
    root.title("Tetris")
    root.geometry('470x630')   # 窗口大小,中间是字母x表示乘号
    root.resizable(0, 0)       # 窗口大小固定
    App(root)
    root.mainloop()

两个canvas

from tkinter import *
from tkinter import ttk
                  # 常数CANVASOFFSET,目的是留一点边框空隙,在不同的操作系统上表现不一致,用空隙协调
self.gameCanvas = Canvas(root, bg='black', height=600 + CANVASOFFSET * 2, width=300 + CANVASOFFSET * 2)
self.gameCanvas.place(x=12, y=10)          # 绝对定位
                        # 父窗口   背景设为黑色
self.nextCanvas = Canvas(root, bg='black', height=120 + CANVASOFFSET * 2, width=120 + CANVASOFFSET * 2)
self.nextCanvas.place(x = 330, y = 10)

信息操作单元

使用frame来组合画布对象,使用anchor方式来布局,这块不能用side方式,注意两种方式的区别。

frame = Frame(root)
frame.place(x = 330, y = 160)

Label(frame, text = "SPEED:").pack(anchor="w") # 使用anchor方式布局
self.speedVar = StringVar()                    # 游戏速度显示变量,注意这有圆括号,与后面的下拉框比较
speed = Label(frame, height=1, width=12, relief=SUNKEN, bd=1, textvariable=self.speedVar)
speed.pack(anchor="w")

复选框与按钮:

Checkbutton(frame, text = "AutoPlay").pack(anchor="w") # 复选框使用方式
self.btnStartVar = StringVar()
self.btnStartVar.set("Start")           # 开始游戏按钮
Button(frame, height=1, width=10, command=self.btnStartClicked, textvariable=self.btnStartVar).pack(anchor="w")
                                        # 绑定点击事件

下拉框选择回放参数:

coboxVar = StringVar     # 注意这没有圆括号,与前面的游戏速度参数比较
cobox = ttk.Combobox(frame, textvariable=coboxVar, height=5, width=8, state="readonly")
cobox.pack(anchor="w")                                                # 只能选择,不能修改
cobox["value"] = ("last", "one", "two", "three")
cobox.current(0)                                        # 当前选择第一项
cobox.bind("<<ComboboxSelected>>", self.comboxClicked)  # 绑定单击事件

游戏空间绑定键盘响应:

self.gameCanvas.bind(sequence="<Key>", func=self.processKeyboardEvent) # 绑定键盘响应
self.game = Game(self.gameCanvas, self.nextCanvas, self)               # 初始化游戏对象
self.gameCanvas.focus_set()                                            # 设置游戏空间为焦点对象

项目地址

https://gitee.com/zhoutk/ptetris
或
https://github.com/zhoutk/ptetris

运行方法

1. install python3, git
2. git clone https://gitee.com/zhoutk/ptetris (or download and unzip source code)
3. cd ptetris
4. python3 tetris

This project surpport windows, linux, macOs

on linux, you must install tkinter first, use this command:
sudo apt install python3-tk

相关项目

已经实现了C++版,项目地址:

https://gitee.com/zhoutk/qtetris
03-06 00:10