俄罗斯方块是俄罗斯人发明的一款休闲类的小游戏,这款小游戏可以说是很多人童年的主打电子游戏了,本文我们使用 Python 来实现这款小游戏。

很多人学习python,不知道从何学起。
很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手。
很多已经做案例的人,却不知道如何去学习更加高深的知识。
那么针对这三类人,我给大家提供一个好的学习平台,免费领取视频教程,电子书籍,以及课程的源代码!
QQ群:1097524789

游戏的基本规则是:移动、旋转和摆放游戏自动输出的各种方块,使之排列成完整的一行或多行并且消除得分。

实现

我们实现俄罗斯方块,主要用到的是 PyQt5 库,安装使用 pip install PyQt5 即可,游戏的组成比较简单,主要包括:主界面、各种方块和计分板,下面我们来看一下具体实现。

首先,我们来画一个主界面,主要实现代码如下:

class MainBoard(QFrame):msg = pyqtSignal(str)BoardWidth = 10BoardHeight = 20Speed = 300def __init__(self, parent):super().__init__(parent)self.initBoard()def initBoard(self):self.timer = QBasicTimer()self.isWaitingAfterLine = Falseself.curX = 0self.curY = 0self.numLinesRemoved = 0self.board = []self.setFocusPolicy(Qt.StrongFocus)self.isStarted = Falseself.isPaused = Falseself.clearBoard()

看一下效果:

分数的显示就是利用上面 msg 的 emit() 方法实现的。

我们接着画各种方块,方块的形状主要包括:T、Z、L、I、O 等,主要实现代码如下:

class ShapeForm(object):NoShape = 0ZShape = 1SShape = 2LineShape = 3TShape = 4SquareShape = 5LShape = 6MirroredLShape = 7class Shape(object):coordsTable = (((0, 0),     (0, 0),     (0, 0),     (0, 0)),((0, -1),    (0, 0),     (-1, 0),    (-1, 1)),((0, -1),    (0, 0),     (1, 0),     (1, 1)),((0, -1),    (0, 0),     (0, 1),     (0, 2)),((-1, 0),    (0, 0),     (1, 0),     (0, 1)),((0, 0),     (1, 0),     (0, 1),     (1, 1)),((-1, -1),   (0, -1),    (0, 0),     (0, 1)),((1, -1),    (0, -1),    (0, 0),     (0, 1)))def __init__(self):self.coords = [[0,0] for i in range(4)]self.pieceShape = ShapeForm.NoShapeself.setShape(ShapeForm.NoShape)def shape(self):return self.pieceShapedef setShape(self, shape):table = Shape.coordsTable[shape]for i in range(4):for j in range(2):self.coords[i][j] = table[i][j]self.pieceShape = shape

看一下效果:

我们知道方块是不断自动下落的,因此需要一个计时器来控制,主要实现代码如下:

def timerEvent(self, event):if event.timerId() == self.timer.timerId():if self.isWaitingAfterLine:self.isWaitingAfterLine = Falseself.newPiece()else:self.oneLineDown()else:super(MainBoard, self).timerEvent(event)

在方块下落的过程中,我们需要通过键盘来控制方块的形状以及左右移动,因此,我们需要一个按键事件来控制它,主要实现代码如下:

def keyPressEvent(self, event):if not self.isStarted or self.curPiece.shape() == ShapeForm.NoShape:super(MainBoard, self).keyPressEvent(event)returnkey = event.key()if key == Qt.Key_P:self.pause()returnif self.isPaused:returnelif key == Qt.Key_Left:self.tryMove(self.curPiece, self.curX - 1, self.curY)elif key == Qt.Key_Right:self.tryMove(self.curPiece, self.curX + 1, self.curY)elif key == Qt.Key_Down:self.tryMove(self.curPiece.rotateRight(), self.curX, self.curY)elif key == Qt.Key_Up:self.tryMove(self.curPiece.rotateLeft(), self.curX, self.curY)elif key == Qt.Key_Space:self.dropDown()elif key == Qt.Key_D:self.oneLineDown()else:super(MainBoard, self).keyPressEvent(event)

当方块落到底部后,需要来检测是否有构成一条直线的,因此我们需要有一个方法来找到所有能消除的行并且消除它们,主要实现代码如下:

def removeFullLines(self):numFullLines = 0rowsToRemove = []for i in range(MainBoard.BoardHeight):n = 0for j in range(MainBoard.BoardWidth):if not self.shapeAt(j, i) == ShapeForm.NoShape:n = n + 1if n == 10:rowsToRemove.append(i)rowsToRemove.reverse()for m in rowsToRemove:for k in range(m, MainBoard.BoardHeight):for l in range(MainBoard.BoardWidth):self.setShapeAt(l, k, self.shapeAt(l, k + 1))numFullLines = numFullLines + len(rowsToRemove)if numFullLines > 0:self.numLinesRemoved = self.numLinesRemoved + numFullLinesself.msg.emit(str(self.numLinesRemoved))self.isWaitingAfterLine = Trueself.curPiece.setShape(ShapeForm.NoShape)self.update()

我们来看一下最终实现效果:

是不是有内味了。

总结

本文我们使用 PyQt5 库写了一个俄罗斯方块小游戏,如果你对 PyQt5 库感兴趣的话,可以尝试使用一下。

Python编写俄罗斯方块小游戏相关推荐

  1. 用python编写乒乓球小游戏--Turtle功能的应用

    用python编写乒乓球小游戏–Turtle功能的应用 python有很多功能强大的代码库,Turtle是一款用于游戏开发的代码库.通过编写乒乓球小游戏可以了解这个库的基本的代码的使用 先创建游戏的背 ...

  2. Python 编写石头剪刀布小游戏

    Python 编写石头剪刀布小游戏 一个简单的小游戏 程序只运行一次 每次出拳一次要运行一次,很麻烦,要让程序一直运行 长期玩游戏不利于身心健康,玩游戏要有度不是 免费玩了这么多次,要给项目创造一点收 ...

  3. python实现俄罗斯方块小游戏

    回顾我们的python制作小游戏之路 我们用python实现了坦克大战 python制作坦克大战 我们用python实现了飞船大战 python制作飞船大战 我们用python实现了两种不同的贪吃蛇游 ...

  4. 用Python编写微信小游戏“跳一跳”的运行脚本

    前言 更新了微信后发现了一款小游戏跳一跳,但是玩了一下午最高才达到200,每次差点破纪录后总是手抖就挂掉了,气的想要砸手机..闲来无事刷微博的时候正好看到有人分析如何编写脚本自动运行游戏破了3000多 ...

  5. python编写抽奖小游戏

    python代码 import random #抽奖系统 #等级 dj = ["一","二","三"] #奖品 jp = ["th ...

  6. python编写五子棋小游戏 (电脑自走棋)

    class Checkerboard:def __init__(self, line_points):self._line_points = line_pointsself._checkerboard ...

  7. 吾昂王的Python之路---利用python编写石头剪刀布小游戏

    ~~ 整体思路: ~~ 首先: 用变量 获取 输入的石头 剪刀 布 其次: 利用条件判断 玩家一 输入的为 石头 剪刀 还是 布 若为石头 若玩家一输出非1 2 3 其中一个则退出语句 则执行 下一个 ...

  8. (心得三)java俄罗斯方块小游戏编写心得

    在"java俄罗斯方块小游戏编写心得02"中,我们已经做到了方块的各种功能的实现,那么接下来我们需要一个destroyLine()方法来对方块进行消除.我们需要想一个问题,当一个方 ...

  9. python tkinter火柴人_用Python实现童年小游戏俄罗斯方块!别说还挺好玩!

    原标题:用Python实现童年小游戏俄罗斯方块!别说还挺好玩! 前言 大三上学期的程序设计实训大作业,挑了其中一个我认为最简单的的<图书管理系统>来写.用python写是因为py有自带的G ...

最新文章

  1. 终于有人把分布式事物TCC讲明白了
  2. 每次重启需要source /etc/profile的原因-环境变量
  3. java配置mongo最大连接数
  4. java多线程 -- ReadWriteLock 读写锁
  5. JavaParser生成,分析和修改Java代码
  6. python字典速度能比字典高多少_python – 字典访问速度比较与整数键对字符串键...
  7. 12864汉字液晶显示驱动程序
  8. Bagging Classifier+Regressor
  9. MySQL之存储过程和函数
  10. .net4.0切换2.0时,SplitContainer”的对象强制转换为类型
  11. 【洛谷】【线段树】P1047 校门外的树
  12. Android控件-TabLayout使用介绍
  13. 汉诺塔实例python_python递归版汉诺塔实例 python汉诺塔递归算法
  14. wc2018冲刺期总结
  15. 让你在面试前先写需求的公司是什么公司
  16. 苹果电脑ping 不通本地网络
  17. 计算机一级应用基础选择题,2016一级计算机基础及MSOffice应用选择题
  18. 如何利用python画一些简单的图形
  19. 盘点2011年各月影响云计算发展的大事件
  20. Activity全屏透明动画等

热门文章

  1. 文件压缩 Huffman编码 (java)
  2. selenium 图片上传
  3. 啃碎并发(二):Java线程的生命周期
  4. Android热修复Tinker接入文档
  5. Redhat 7 Web服务器配置
  6. 迷你MVVM框架 avalonjs 学习教程20、路由系统
  7. Kali Linux安装Remmina无法加载RDP插件
  8. Java学习笔记1——类和对象
  9. andriod手机客户端自动化测试工具整理
  10. 在Spring中使用JDBC访问关系数据