python编写俄罗斯方块代码详解_python如何写个俄罗斯方块
俄罗斯方块是俄罗斯人发明的一款休闲类的小游戏,这款小游戏可以说是很多人童年的主打电子游戏了,本文我们使用 Python 来实现这款小游戏。
游戏的基本规则是:移动、旋转和摆放游戏自动输出的各种方块,使之排列成完整的一行或多行并且消除得分。
实现
我们实现俄罗斯方块,主要用到的是 PyQt5 库,安装使用 pip install PyQt5 即可,游戏的组成比较简单,主要包括:主界面、各种方块和计分板,下面我们来看一下具体实现。
首先,我们来画一个主界面,主要实现代码如下:
class 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 等,主要实现代码如下:
class 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
我们知道方块是不断自动下落的,因此需要一个计时器来控制,主要实现代码如下:
def 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)
在方块下落的过程中,我们需要通过键盘来控制方块的形状以及左右移动,因此,我们需要一个按键事件来控制它,主要实现代码如下:
def 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)
当方块落到底部后,需要来检测是否有构成一条直线的,因此我们需要有一个方法来找到所有能消除的行并且消除它们,主要实现代码如下:
def 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 俄罗斯方块的资料请关注脚本之家其它相关文章!
python编写俄罗斯方块代码详解_python如何写个俄罗斯方块相关推荐
- 从零编写60%+胜率的短线择时信号!零基础python量化投资代码详解【邢不行】
引言: 邢不行的系列帖子"量化小讲堂",通过实际案例教初学者使用python进行量化投资,了解行业研究方向,希望能对大家有帮助. 如果有人说你是百年难得一见的量化投资天才, ...
- python中logging模块详解_python logging日志模块详解
logging 日志模块详解 用Python写代码的时候,在想看的地方写个print xx 就能在控制台上显示打印信息,这样子就能知道它是什么了,但是当我需要看大量的地方或者在一个文件中查看的时候,这 ...
- python使用kafka原理详解_Python操作Kafka原理及使用详解
Python操作Kafka原理及使用详解 一.什么是Kafka Kafka是一个分布式流处理系统,流处理系统使它可以像消息队列一样publish或者subscribe消息,分布式提供了容错性,并发处理 ...
- unet网络python代码详解_python网络编程详解
最近在看<UNIX网络编程 卷1>和<FREEBSD操作系统设计与实现>这两本书,我重点关注了TCP协议相关的内容,结合自己后台开发的经验,写下这篇文章,一方面是为了帮助有需要 ...
- python中zip函数详解_Python中zip函数用法
看openstack的代码,遇到一个内建函数zip不明白其意思: # Adjust the weights in the grid by the functions weight adjustment ...
- python凯撒密码详解_Python基础题目集--课堂案例
这些案例均为在校期间学习<python基础编程>课程的案例,适合初学者练手~ 1.输入分数,返回等级 ''' 分数区间为0~100,等级:A(>=90).B(>=80).C(& ...
- python回调函数实例详解_Python回调函数用法实例详解
本文实例讲述了Python回调函数用法.分享给大家供大家参考.具体分析如下: 一.百度百科上对回调函数的解释: 回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函 ...
- python类和对象详解_Python公开课 - 详解面向对象
前言 在C语言中,单纯通过结构化的函数也可以实现很好的软件,顺序思路比较好理解:而C++则以面向对象的思维来进行代码组织,通过定义对象.成员变量.成员函数.以封装.继承和多态等方式来更灵活处理业务逻辑 ...
- python中的import详解_python中的import
Python 中的模块和包 模块(module):包含定义的类/函数/变量的文件,后缀是.py.Python代码的可重用性由此保证 包(package):由模块或者子模块组成的Python应用程序执行 ...
- python中time模块详解_Python time模块详解
time 模块主要包含各种提供日期.时间功能的类和函数.该模块既提供了把日期.时间格式化为字符串的功能,也提供了从字符串恢复日期.时间的功能. 在 Python 的交互式解释器中先导入 time 模块 ...
最新文章
- 调用微信高级群发接口--视频群发接口出问题(微信官方文档错误纠正)
- 深度学习入门之感知器(原理+代码)
- JZOJ 5628. 【NOI2018模拟4.4】Travel
- mysql导出d盘_mysql 导出导入数据库
- mysql-bin.000001文件的来源及处理方法
- layui table异步调用数据的时候,数据展示不出来现象解决方案
- 安利几个优质nlp开源项目
- Struts2基础总结
- 利用【数据链接属性】对话框,创建连接字符串
- 基于Unity3D的AR射击游戏设计与实现
- 分解因子算法——Pollard rho算法
- 卸载Autodesk系列之后电脑屏幕灰白怎么解决
- iTop4412 Booting Sequence
- python调用so库 undefind symbol_内嵌Python import时undefined symbol错误及解决 | 学步园
- 程序员杂志在线阅读 豆瓣的架构—专访豆瓣网站的技术总监洪强宁
- centos7局域网挂载nas硬盘
- xlwt/xlrd库的区别
- ​PC电脑流行的主要原因
- 二极管反向恢复时间和反向恢复电流
- 【蓝桥杯真题】2021年蓝桥杯省赛A组题目解析+代码(python组)