Python 俄罗斯方块, 基于pyqt5实现俄罗斯方块 --pyqt5 进阶

学习了pyqt5后 , 总想弄些有趣点的 , 然后就想起了弄一个小游戏 , 弄一个简单的小游戏 , 然后就用pyqt5写了一个俄罗斯方块的小游戏
开发环境
windows10python3.8x游戏界面
Python 俄罗斯方块, 基于pyqt5实现俄罗斯方块 --pyqt5 进阶
文章图片
游戏思路
了解俄罗斯方法的基本操作:方块下降、方块旋转、方块的左右移动、方块的填充
1、方块的下降 , 可以看成是一个二维数组 , 创建一个20行(y轴)10列(x轴)的二维数组 , 初始化数值为0 , 方块从最顶端(第20行)下降到最低端(第1行) , 也就是方块的高度在减少 , 也就是行(row)的减少 , 解决:利用QTimer设置定时器 , 每隔一段时间启动一次方块下降的函数 , 就可以实现方块随时间下降 , 但是怎么判断方块下降到底了呢 , 就是设置二维数组的第0行为1 , 如果下降过程中遇到1的二维数组 , 则证明碰到了其他方块或者方块到底了 。
2、方块的旋转 , 最简单的方法就是枚举出该类型的所有方块(包括旋转的) , 可以参考一下我的写法
blocks={
'LShape':[[[0,0],[0,-1],[0,-2],[1,-2]],[[-1,-1],[0,-1],[1,-1],[-1,-2]],
[[-1,0],[0,0],[0,-1],[0,-2]],[[-1,-1],[0,-1],[1,-1],[1,0]]],
'JShape':[[[0,0],[0,-1],[0,-2],[-1,-2]],[[-1,0],[-1,-1],[0,-1],[1,-1]],
[[0,0],[1,0],[0,-1],[0,-2]],[[-1,-1],[0,-1],[1,-1],[1,-2]]],
'ZShape':[[[-1,0],[0,0],[0,-1],[1,-1]],[[0,0],[0,-1],[-1,-1],[-1,-2]],
[[-1,0],[0,0],[0,-1],[1,-1]],[[0,0],[0,-1],[-1,-1],[-1,-2]]],
'SShape':[[[-1,0],[-1,-1],[0,-1],[0,-2]],[[0,0],[1,0],[-1,-1],[0,-1]],
[[-1,0],[-1,-1],[0,-1],[0,-2]],[[0,0],[1,0],[-1,-1],[0,-1]]],
'OShape':[[[-1,0],[0,0],[-1,-1],[0,-1]],[[-1,0],[0,0],[-1,-1],[0,-1]],
[[-1,0],[0,0],[-1,-1],[0,-1]],[[-1,0],[0,0],[-1,-1],[0,-1]]],
'IShape':[[[0,0],[0,-1],[0,-2],[0,-3]],[[-2,-1],[-1,-1],[0,-1],[1,-1]],
[[0,0],[0,-1],[0,-2],[0,-3]],[[-2,-1],[-1,-1],[0,-1],[1,-1]]],
'TShape':[[[-1,-1],[0,-1],[1,-1],[0,-2]],[[0,0],[-1,-1],[0,-1],[0,-2]],
[[0,0],[-1,-1],[0,-1],[1,-1]],[[0,0],[0,-1],[1,-1],[0,-2]]]
拿’LShape‘中的第一个方块来说明 , 它的坐标是这样子的[[0,0],[0,-1],[0,-2],[1,-2]] , 我们以(0 , 0)为坐标原点 , 可以画出这样子的四个方块(以左上方为顶点 , 往右下方绘制矩形)
Python 俄罗斯方块, 基于pyqt5实现俄罗斯方块 --pyqt5 进阶
文章图片
只要我们给每个方块的坐标都加上对应的所有行和所有列 , 就可以使方块位于最顶端了 , 旋转的时候只有每次下标(index+1%4)就可以得到旋转之后的方块了 , 不过旋转的时候还是需要判断的 , 如果旋转时候碰到其他方块 , 则取消旋转 , 或者旋转时候超过边界也要取消旋转 , 要满足旋转的条件才可以 。
3、方块的左右移动 , 方块向左移动 , 即方块的列也就是x减去1 , 同理方块向右移动 , 方块的列加上1 , 同时也要满足左右移动的条件:没有超出边界而且没有碰到其他方块 。
4、方块的填充 , 假如说‘LShape’的方块到达了底端 , 我们就给对应的二维数组坐标赋值为1 , 利用QPainter来实现方块的填充 , 每次从第1行开始遍历一遍二维数组 , 如果该点的值为1 , 则在该点绘制一个矩形 。 下面的图片可能更好理解
Python 俄罗斯方块, 基于pyqt5实现俄罗斯方块 --pyqt5 进阶
文章图片
上面图片中 , 没有填1的就是0 。
以上就是我对俄罗斯方块的理解了 , 具体代码我已经放到Github上了 , 如果需要源代码的话 , 可以访问
【Python 俄罗斯方块, 基于pyqt5实现俄罗斯方块 --pyqt5 进阶】https://github.com/karboboy/PyQt5-Tetris


    推荐阅读