龙空技术网

用 Python 写个俄罗斯方块

程序员编程分享 331

前言:

眼前看官们对“java编写俄罗斯方块”可能比较关怀,小伙伴们都需要剖析一些“java编写俄罗斯方块”的相关知识。那么小编也在网上网罗了一些关于“java编写俄罗斯方块””的相关资讯,希望同学们能喜欢,兄弟们快快来学习一下吧!

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

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

当然小编这里也准备一份适合你的学习资料爬虫 ,web开发的学习资料视频教程,私信小编“01”都可以免费获取!实现

我们实现俄罗斯方块,主要用到的是 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 = 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.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 库感兴趣的话,可以尝试使用一下。

标签: #java编写俄罗斯方块