系列文章入口
《Python3 编程实战 Tetris 机器人》
方块挪动
为了不便,设计了相对定位函数,变相对运动形式为相对定位。
方块相对定位函数
咱们 Block 类中,对 blog 的挪动应用的是 tkinter.move 函数,该函数提供的是绝对间隔形式,咱们须要计算出位移差。该办法相当于把绝对间隔挪动形式,变成了方块的相对定位函数,所有挪动操作都应用这个函数。
def relocate(self, x, y):
for block in self.objs: # 遍历方块的 block
block.relocate(x - self.x, y - self.y) # 挪动操作
self.x = x
self.y = y
方块左移
def moveLeft(self):
if self.canPlace(self.x - 1, self.y): # 判断是否能左移
self.relocate(self.x - 1, self.y) # 挪动
return True
else:
return False
方块右移
def moveRight(self):
if self.canPlace(self.x - 1, self.y): # 判断是否能右移
self.relocate(self.x + 1, self.y) # 挪动
return True
else:
return False
方块下移
方块下移,须要判断是否曾经到底,到底后,方块地位将固定下来。
def moveDown(self):
if self.canPlace(self.x, self.y + 1): # 判断是否能下移
self.relocate(self.x, self.y + 1) # 下移
return True
else: # 曾经到底
for i in range(TETRISDIMENSION):
for j in range(TETRISDIMENSION):
if self.data[i][j]: # 固定方块,改游戏空间格局
GameRoom[self.y + i][self.x + j] = 1
return False
方块旋转
方块旋转,本质上是矩形的旋转,咱们设定按一次方向上键,方块进行一次顺时针 90 度旋转。
算法原理
如图,按下标对矩阵进行轮换即可。正规的矩阵旋转算法是先替换行再转置。咱们要管制方块间断顺时针旋转,因为初始状态固定,只有记住旋转次数就能晓得方块的实时状态,所以抉择轮换算法。
算法公式
ai,j -------------> aj,N-i+1
↑ ↓
↑ ↓
aN-j+1 -------------> aN-i+1,N-j+1
算法实现
def rotate(self):
for i in range(TETRISDIMENSION // 2):
lenJ = TETRISDIMENSION - i - 1 # 减少变量,简化下标
for j in range(i, lenJ):
lenI = TETRISDIMENSION - j - 1
t = self.data[i][j]
self.data[i][j] = self.data[lenI][i] # 按公式轮换
self.data[lenI][i] = self.data[lenJ][lenI]
self.data[lenJ][lenI] = self.data[j][lenJ]
self.data[j][lenJ] = t
self.rotateCount += 1 # 旋转次数记录
self.redraw() # 重绘
我的项目地址
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