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

本文介绍了使用Python的PyQT5库开发俄罗斯方块小游戏的过程,涵盖了开发环境、游戏界面设计和游戏逻辑。通过二维数组模拟方块的下降、旋转、左右移动和填充,结合QTimer和QPainter实现游戏功能。详细代码已上传至GitHub供参考。
摘要由CSDN通过智能技术生成

      学习了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。

以上就是我对俄罗斯方块的理解了,具体代码我已经放到Github上了,如果需要源代码的话,可以访问

https://github.com/karboboy/PyQt5-Tetris

  • 37
    点赞
  • 133
    收藏
    觉得还不错? 一键收藏
  • 16
    评论
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值