共计 2191 个字符,预计需要花费 6 分钟才能阅读完成。
界面设计
本我的项目重视算法实现,为了安装简单且具备强跨平台性,所以抉择 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
正文完