系列文章入口
方塊移動
為了方便,設計了絕對定位函式,變相對運動方式為絕對定位。
方塊絕對定位函式
我們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