python制作小游戏——俄罗斯方块

python

实现

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

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

python">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制作小游戏——俄罗斯方块 的全部内容, 来源链接: utcz.com/z/527357.html

回到顶部