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

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

实现

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

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21class MainBoard(QFrame):

msg = pyqtSignal(str)

BoardWidth = 10

BoardHeight = 20

Speed = 300

def __init__(self, parent):

super().__init__(parent)

self.initBoard()

def initBoard(self):

self.timer = QBasicTimer()

self.isWaitingAfterLine = False

self.curX = 0

self.curY = 0

self.numLinesRemoved = 0

self.board = []

self.setFocusPolicy(Qt.StrongFocus)

self.isStarted = False

self.isPaused = False

self.clearBoard()

看一下效果:

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

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36class ShapeForm(object):

NoShape = 0

ZShape = 1

SShape = 2

LineShape = 3

TShape = 4

SquareShape = 5

LShape = 6

MirroredLShape = 7

class 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.NoShape

self.setShape(ShapeForm.NoShape)

def shape(self):

return self.pieceShape

def 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

看一下效果:

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

1

2

3

4

5

6

7

8

9def timerEvent(self, event):

if event.timerId() == self.timer.timerId():

if self.isWaitingAfterLine:

self.isWaitingAfterLine = False

self.newPiece()

else:

self.oneLineDown()

else:

super(MainBoard, self).timerEvent(event)

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24def keyPressEvent(self, event):

if not self.isStarted or self.curPiece.shape() == ShapeForm.NoShape:

super(MainBoard, self).keyPressEvent(event)

return

key = event.key()

if key == Qt.Key_P:

self.pause()

return

if self.isPaused:

return

elif 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)

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22def removeFullLines(self):

numFullLines = 0

rowsToRemove = []

for i in range(MainBoard.BoardHeight):

n = 0

for j in range(MainBoard.BoardWidth):

if not self.shapeAt(j, i) == ShapeForm.NoShape:

n = n + 1

if 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 + numFullLines

self.msg.emit(str(self.numLinesRemoved))

self.isWaitingAfterLine = True

self.curPiece.setShape(ShapeForm.NoShape)

self.update()

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

是不是有内味了。

总结

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

python俄罗斯方块实训报告_用 Python 写个俄罗斯方块相关推荐

  1. python主成分分析法实训报告_基于 python 的主成分分析步骤及应用实例

    主成分分析:步骤.应用及代码实现. 主成分分析(Principal Component Analysis)算法步骤: 设有 m 条 n 维数据: 将原始数据按列组成 n 行 m 列矩阵 X 将 X 的 ...

  2. python开发实训平台_一体化教学实训平台解决方案

    泰迪科技根据高校实践教学中的痛点,首次提出"鱼骨教学法"的概念.以企业真实需求为导向,学生学习技能紧紧围绕企业实际应用需求,将学生掌握的理论知识,通过企业案例的形式进行衔接,达到知 ...

  3. java坦克大战 实训报告_程序设计实训坦克大战实验报告

    <程序设计实训坦克大战实验报告>由会员分享,可在线阅读,更多相关<程序设计实训坦克大战实验报告(12页珍藏版)>请在金锄头文库上搜索. 1. 程序设计实训报告坦克大战专业班级: ...

  4. java坦克大战 实训报告_坦克大战系统《Java程序开发实训》综合实训报告.doc

    坦克大战系统<Java程序开发实训>综合实训报告 <Java程序开发实训>综合实训报告 题目: 坦克大战系统 姓名: 方庆 学号: 2010203206 班级: 10软件(2) ...

  5. 单片机节日彩灯实训报告_单片机数字钟实训报告

    单片机数字钟实训报告 学院:电子工程学院 专业:机电一体化 班级: 姓名: 手机号: 一.任务及要求 用51单片机设计时.分.秒计时器,具体要求如下. 1.具有时.分.秒计时功能和8位数码管显示功能, ...

  6. 计算机微机组装实训报告,微机组装实训报告_相关文章专题_写写帮文库

    时间:2019-05-12 08:39:04 作者:admin 计算机组装与维护实训报告 班 级: 姓 名: 学 号: 指导老师: 二〇一四年六月 微机组装与维护实训报告 一.实训目的 1.能够将零散 ...

  7. 绞车拆装实训报告_千斤顶实训报告.doc

    千斤顶实训报告 千斤顶实训报告 篇一:机电维修实习日记与实习报告 学校 实习日记与实习报告 编号: 实习单位 姓 名 班 级 实习时间 gmc-2-017-01 实 习 日 记篇二:专业设备检修实习报 ...

  8. python项目实训报告简介_python实验报告5

    安徽工程大学 Python程序设计 实验报告 班级  物流191   姓名王凡学号3190505102 成绩 日期     2020.4.29     指导老师修宇 [实验名称]综合运用三种基本结构进 ...

  9. 嵌入式python智能实训总结_智能楼宇实训心得体会

    智能楼宇实训心得体会 篇一:楼宇智能化控制心得体会 学习楼宇智能化技术的心得体会 通过老师的讲解及从书本和网络上的学习,我对楼宇智 能化技术有了一定的了解.楼宇智能化技术即综合计算机. 信息通信等方面 ...

最新文章

  1. MES/MOM的未来:低代码与模型驱动
  2. HDU4549 M斐波那契数列(矩阵快速幂+费马小定理)
  3. 读书计划清单之碎碎念
  4. 1.3 Integer类详解
  5. python 提取前五行_Pandas 1:如何在Python中载入数据集
  6. CSS知识点个人总结(不断更新)
  7. 浅谈.Net异步编程的前世今生----异步函数篇(完结)
  8. 极光推送服务端API(定时推送任务,推送到指定设备,推送到所有设备)
  9. 【SQL Server 学习系列】-- sql 随机生成中文名字
  10. 颜宁:当科学家是幸福的
  11. C51单片机————定时器计数器
  12. ups容量计算和配置方法_山埔UPS电源后备时间计算方法
  13. MySQL怎么查询课程信息_mysql 查询没有学全所有课程的同学的信息
  14. 羊皮卷的实践-第二十章
  15. 这才是你寻寻觅觅想要的 Python 可视化神器!
  16. 中级软件设计师下午试题(百度文库 )
  17. 干货收藏|如何用chrom插件实现U校园自动刷课
  18. python手机代码编辑器_Pycharm(Python代码编辑器) V2020.1.2 官方版
  19. 06-JavaWEB_Git
  20. Flink 可视化开发平台--Streamx部署

热门文章

  1. native app webapp
  2. moco的json如何写
  3. 增值电信业务许可服务指南一:要求三名人员社保的险种有要求吗?
  4. linux中赋予普通用户root权限的三种方式
  5. css 超链接的颜色,用css样式控制超链接颜色显示
  6. 0x79e50c71 (msvcr100d.dll) 处有未经处理的异常: 0xC0000005: 写入位置 0x00000000 时发生访问冲突
  7. static有什么用途?
  8. HTTP标准状态码及非官方拓展码大全
  9. 51单片机总结【引脚、时钟电路、复位电路、I/O端口、内部结构】
  10. 【CO101】计算机组成原理笔记2 —— MIPS指令转机器码