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