系列文章入口
《Python3编程实战Tetris机器人》
设计思路
游戏暂停性能比较简单,次要是管制gameRunningStatus变量的值与界面的管制对立起来,游戏暂停了,键盘的响应也要进行。另,gameRunningStatus变量的扭转也不能间接操作,需生成一个暂停命令单元,送入队列中,由工作工作线程去解决。
具体实现
界面管制
开始按钮会在 “Start”、“Rause”和“Resume”之间切换。
def btnStartClicked(self): if self.game.getGameRunningStatus() == 0: # 点击时游戏处于未开始状态 self.btnStartVar.set("Pause") self.game.start() elif self.game.getGameRunningStatus() == 1: # 点击时游戏处于游戏中 self.btnStartVar.set("Resume") self.game.pause() elif self.game.getGameRunningStatus() == 5: # 点击时游戏处于暂停状态 self.btnStartVar.set("Pause") self.game.resume() self.gameCanvas.focus_set() # 设置游戏空间为以后流动控件
游戏完结时,复原初始状态
self.app.setStartButtonText("Start")
暂停操作
def pause(self): opQueue.put(("pause",5))
复原操作
游戏处于暂停中,所以间接批改变量值,没有设计命令单元了。
def resume(self): self.gameRunningStatus = 1 self.canvas.after(self.gameSpeedInterval * (0 if self.isAutoRunning else 1), self.tickoff)
每一个工作单元都是一个二元元组(不便数据解构),第一个是字符串,为命令;第二个是元组,是数据包(也按不便解构的形式去设计),由每个命令自行定义。
工作线程减少暂停解决
...elif cmd == "pause": self.gameRunningStatus = data...
键盘响应革新
def processKeyboardEvent(self, ke): if self.game.getGameRunningStatus() == 1 and self.game.isAutoRunning == 0: if ke.keysym == 'Left': opQueue.put(('Left',())) ...
我的项目地址
https://gitee.com/zhoutk/ptetris或https://github.com/zhoutk/ptetris
运行办法
1. install python3, git2. git clone https://gitee.com/zhoutk/ptetris (or download and unzip source code)3. cd ptetris4. python3 tetrisThis project surpport windows, linux, macOson linux, you must install tkinter first, use this command: sudo apt install python3-tk
相干我的项目
曾经实现了C++版,我的项目地址:
https://gitee.com/zhoutk/qtetris