Python3编程实战Tetris机器人(移动与旋转)
系列文章入口
《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
方块旋转 【Python3编程实战Tetris机器人(移动与旋转)】方块旋转,实质上是矩形的旋转,我们设定按一次方向上键,方块进行一次顺时针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 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
推荐阅读
- python青少年编程比赛_第十一届蓝桥杯大赛青少年创意编程组比赛细则
- 《机器学习实战》高清中文版PDF英文版PDF+源代码下载
- HTML基础--基本概念--跟着李南江学编程
- --木木--|--木木-- 第二课作业#翼丰会(每日一淘6+1实战裂变被动引流# 6+1模式)
- 我的软件测试开发工程师书单
- 芯灵思SinlinxA33开发板Linux内核定时器编程
- 关于响应式编程的十个问题
- 2020-07-29《吴军·阅读与写作50讲》24实战才能转化效能
- iOS-Swift-map|iOS-Swift-map filter reduce、函数式编程
- 零基础学习Python作业本(13)