系列文章入口

《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度旋转。

算法原理

如图,按下标对矩阵进行轮换即可。正规的矩阵旋转算法是先交换行再转置。我们要控制方块连续顺时针旋转,因为初始状态固定,只要记住旋转次数就能知道方块的实时形态,所以选择轮换算法。

算法公式

                   a[i,j]      ------------->  a[j,N-i-1]

                      ↑                            ↓

                      ↑                            ↓

                  a[N-j-1,i]  <-------------  a[N-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

zhoutk
2.6k 声望1.2k 粉丝

自由程序员,技术路线c,delphi,c++,c#,java,php,node.js,python,golang,typescript;超喜欢react.js的设计思路,全栈开发成为我的终极目标。开发机器macbook pro,或装ubuntu、fedora的机器,编程用vim...