Python3程式設計實戰Tetris機器人(移動與旋轉)

zhoutk發表於2021-06-20

系列文章入口

《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

相關文章