系列文章入口
界面设计
本项目注重算法实现,为了安装简单且具有强跨平台性,所以选择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