用 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()


看一下效果:


image.png


分数的显示就是利用上面 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


看一下效果:


image.png


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


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


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


微信图片_20220213124607.gif


是不是有内味了。


总结


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

目录
相关文章
|
Python
python实现俄罗斯方块
python实现俄罗斯方块
463 1
|
前端开发 数据库 Python
python制作俄罗斯方块
python制作俄罗斯方块
161 0
|
Python
Python小游戏(俄罗斯方块)
Python小游戏(俄罗斯方块)玩法:童年经典,普通模式没啥意思,小时候我们都是玩加速的。
265 0
Python小游戏(俄罗斯方块)
|
Python
python小游戏,pygame手写俄罗斯方块
python小游戏,pygame手写俄罗斯方块
|
2月前
|
数据采集 机器学习/深度学习 人工智能
Python:现代编程的首选语言
Python:现代编程的首选语言
261 102
|
2月前
|
数据采集 机器学习/深度学习 算法框架/工具
Python:现代编程的瑞士军刀
Python:现代编程的瑞士军刀
295 104
|
2月前
|
人工智能 自然语言处理 算法框架/工具
Python:现代编程的首选语言
Python:现代编程的首选语言
247 103
|
2月前
|
机器学习/深度学习 人工智能 数据挖掘
Python:现代编程的首选语言
Python:现代编程的首选语言
186 82
|
26天前
|
Python
Python编程:运算符详解
本文全面详解Python各类运算符,涵盖算术、比较、逻辑、赋值、位、身份、成员运算符及优先级规则,结合实例代码与运行结果,助你深入掌握Python运算符的使用方法与应用场景。
156 3