python制作小游戏——俄罗斯方块
发布时间:2026-01-16 17:28:09

实现俄罗斯方块的主要用途是 PyQt5 库,安装使用pip install PyQt5可以,游戏的组成相对简单,主要包括:主界面、各种方块和评分板,让我们来看看具体的实现。
首先,让我们画一个主界面,主要实现代码如下:
classMainBoard(QFrame): msg=pyqtSignal(str) BoardWidth=10 BoardHeight=20 Speed=300 def__init__(self,parent): super().__init__(parent) self.initBoard() definitBoard(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 等等,代码主要实现如下:
classShapeForm(object): NoShape=0 ZShape=1 SShape=2 LineShape=3 TShape=4 SquareShape=5 LShape=6 MirroredLShape=7 classShape(object): coordsTable=( (0,0),(0,0),(0,0),(0,0),(0,0), (0,-1),(0,0),(-1,0),(-1,0), (0,-1),(0,0),(1,0),(1,0) (0,-1),(0,0),(0,0)(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),(0,1) ) def__init__(self): self.coords=[[0,0]foriinrange(4)] self.pieceShape=ShapeForm.NoShape self.setShape(ShapeForm.NoShape) defshape(self): returnself.pieceShape defsetShape(self,shape): table=Shape.coordsTable[shape] foriinrange(4): forjinrange(2): self.coords[i][j]=table[i][j] self.pieceShape=shape
看看效果:

我们知道方块是自动下落的,所以需要一个计时器来控制,主要实现代码如下:
deftimerEvent(self,event): ifevent.timerId()==self.timer.timerId(): ifself.isWaitingAfterLine: self.isWaitingAfterLine=False self.newPiece() else: self.oneLineDown() else: super(MainBoard,self).timerEvent(event)
在方块下落的过程中,我们需要通过键盘来控制方块的形状和左右移动。因此,我们需要一个关键事件来控制它,主要实现代码如下:
defkeyPressEvent(self,event): ifnotself.isStartedorself.curPiece.shape()==ShapeForm.NoShape: super(MainBoard,self).keyPressEvent(event) return key=event.key() ifkey==Qt.Key_P: self.pause() return ifself.isPaused: return elifkey==Qt.Key_Left: self.tryMove(self.curPiece,self.curX-1,self.curY) elifkey==Qt.Key_Right: self.tryMove(self.curPiece,self.curX+1,self.curY) elifkey==Qt.Key_Down: self.tryMove(self.curPiece.rotateRight(),self.curX,self.curY) elifkey==Qt.Key_Up: self.tryMove(self.curPiece.rotateLeft(),self.curX,self.curY) elifkey==Qt.Key_Space: self.dropDown() elifkey==Qt.Key_D: self.oneLineDown() else: super(MainBoard,self).keyPressEvent(event)
当方块落到底部时,我们需要检测是否有直线,所以我们需要找到所有可以消除的线并消除它们,主要实现代码如下:
defremoveFullLines(self): numFullLines=0 rowsToRemove=[] foriinrange(MainBoard.BoardHeight): n=0 forjinrange(MainBoard.BoardWidth): ifnotself.shapeAt(j,i)==ShapeForm.NoShape: n=n+1 ifn==10: rowsToRemove.append(i) rowsToRemove.reverse() forminrowsToRemove: forkinrange(m,MainBoard.BoardHeight): forlinrange(MainBoard.BoardWidth): self.setShapeAt(l,k,self.shapeAt(l,k+1)) numFullLines=numFullLines+len(rowsToRemove) ifnumFullLines>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的文章。