返回首页
当前位置: 主页 > 编程语言 > Python教程 >

如何用Python自行开发俄罗斯方块小游戏

时间:2019-11-21 15:24来源:电脑教程学习网 www.etwiki.cn 编辑:小山哥
俄罗斯方块作为世上销量最高的经典游戏,尽管规则简单、但是十分耐玩,如今,我们可以自己通过Python来开发俄罗斯方块这款小游戏。在开始之前,确保已经安装第三方模块 PyQt5,使用pip install PyQt5即可。
 
首先编写游戏主界面的代码:
1.from PyQt5.QtWidgets import *
2.from PyQt5.QtCore import *
3.import sys
4.class MainBoard(QFrame):
5.    msg = pyqtSignal(str)
6.    BoardWidth = 10
7.    BoardHeight = 22
8.    Speed = 300
9.    def __init__(self, parent):
10.        super().__init__(parent)
11.        self.initBoard()
12.    def initBoard(self):
13.        self.timer = QBasicTimer()
14.        self.isWaitingAfterLine = False
15.        self.curX = 0
16.        self.curY = 0
17.        self.numLinesRemoved = 0
18.        self.board = []
19.        self.setFocusPolicy(Qt.StrongFocus)
20.        self.isStarted = False
21.        self.isPaused = False
效果图如下:
接下来编写小砖块的代码,首先定义形状:
1.class ShapeForm(object):
2.    NoShape = 0
3.    ZShape = 1
4.    SShape = 2
5.    LineShape = 3
6.    TShape = 4
7.    SquareShape = 5
8.    LShape = 6
9.    MirroredLShape = 7
10.
11.class Shape(object):
12.    coordsTable = (
13.        ((0, 0),     (0, 0),     (0, 0),     (0, 0)),
14.        ((0, -1),    (0, 0),     (-1, 0),    (-1, 1)),
15.        ((0, -1),    (0, 0),     (1, 0),     (1, 1)),
16.        ((0, -1),    (0, 0),     (0, 1),     (0, 2)),
17.        ((-1, 0),    (0, 0),     (1, 0),     (0, 1)),
18.        ((0, 0),     (1, 0),     (0, 1),     (1, 1)),
19.        ((-1, -1),   (0, -1),    (0, 0),     (0, 1)),
20.        ((1, -1),    (0, -1),    (0, 0),     (0, 1))
21.    )
22.
23.    def __init__(self):
24.        self.coords = [[0,0] for i in range(4)]
25.        self.pieceShape = ShapeForm.NoShape
26.        self.setShape(ShapeForm.NoShape)
之后画出原型:
1.def drawSquare(self, painter, x, y, shape):
2.    colorTable = [0x000000, 0xCC6666, 0x66CC66, 0x6666CC,
3.                  0xCCCC66, 0xCC66CC, 0x66CCCC, 0xDAAA00]
4.    color = QColor(colorTable[shape])
5.    painter.fillRect(x + 1, y + 1, self.squareWidth() - 2,
6.        self.squareHeight() - 2, color)
7.    painter.setPen(color.lighter())
8.    painter.drawLine(x, y + self.squareHeight() - 1, x, y)
9.    painter.drawLine(x, y, x + self.squareWidth() - 1, y)
10.    painter.setPen(color.darker())
11.    painter.drawLine(x + 1, y + self.squareHeight() - 1,
12.        x + self.squareWidth() - 1, y + self.squareHeight() - 1)
13.    painter.drawLine(x + self.squareWidth() - 1,
14.        y + self.squareHeight() - 1, x + self.squareWidth() - 1, y + 1)
效果图如下:
下一步对按键操作进行编辑:
1.def keyPressEvent(self, event):
2.        if not self.isStarted or self.curPiece.shape() == ShapeForm.NoShape:
3.            super(MainBoard, self).keyPressEvent(event)
4.            return
5.        key = event.key()
6.        if key == Qt.Key_P:
7.            self.pause()
8.            return
9.        if self.isPaused:
10.            return
11.        elif key == Qt.Key_Left:
12.            self.tryMove(self.curPiece, self.curX - 1, self.curY)
13.        elif key == Qt.Key_Right:
14.            self.tryMove(self.curPiece, self.curX + 1, self.curY)
15.        elif key == Qt.Key_Down:
16.            self.tryMove(self.curPiece.rotateRight(), self.curX, self.curY)
17.        elif key == Qt.Key_Up:
18.            self.tryMove(self.curPiece.rotateLeft(), self.curX, self.curY)
19.        elif key == Qt.Key_Space:
20.            self.dropDown()
21.        elif key == Qt.Key_D:
22.            self.oneLineDown()
23.        else:
24.            super(MainBoard, self).keyPressEvent(event)
25.
26.    def tryMove(self, newPiece, newX, newY):
27.        for i in range(4):
28.            x = newX + newPiece.x(i)
29.            y = newY - newPiece.y(i)
30.            if x < 0 or x >= MainBoard.BoardWidth or y < 0 or y >= MainBoard.BoardHeight:
31.                return False
32.            if self.shapeAt(x, y) != ShapeForm.NoShape:
33.                return False
34.        self.curPiece = newPiece
35.        self.curX = newX
36.        self.curY = newY
37.        self.update()
38.        return True
编写计时器:
1.def timerEvent(self, event):
2.    if event.timerId() == self.timer.timerId():
3.        if self.isWaitingAfterLine:
4.            self.isWaitingAfterLine = False
5.            self.newPiece()
6.        else:
7.            self.oneLineDown()
8.    else:
9.        super(MainBoard, self).timerEvent(event)
开始和暂停:
1.def start(self):
2.        if self.isPaused:
3.            return
4.        self.isStarted = True
5.        self.isWaitingAfterLine = False
6.        self.numLinesRemoved = 0
7.        self.clearBoard()
8.        self.msg.emit(str(self.numLinesRemoved))
9.        self.newPiece()
10.        self.timer.start(MainBoard.Speed, self)
11.
12.    def pause(self):
13.        if not self.isStarted:
14.            return
15.        self.isPaused = not self.isPaused
16.        if self.isPaused:
17.            self.timer.stop()
18.            self.msg.emit("paused")
19.        else:
20.            self.timer.start(MainBoard.Speed, self)
21.            self.msg.emit(str(self.numLinesRemoved))
22.        self.update()
游戏类及初始化:
1.class Tetris(QMainWindow):
2.    def __init__(self):
3.        super().__init__()
4.        self.initUI()
5.
6.    def initUI(self):
7.        self.tboard = MainBoard(self)
8.        self.setCentralWidget(self.tboard)
9.        self.statusbar = self.statusBar()
10.        self.tboard.msg[str].connect(self.statusbar.showMessage)
11.        self.tboard.start()
12.        self.resize(300, 500)
13.        self.center()
14.        self.setWindowTitle('俄罗斯方块')
15.        self.show()
16.
17.    def center(self):
18.        screen = QDesktopWidget().screenGeometry()
19.        size = self.geometry()
20.        self.move((screen.width()-size.width())/2,
            (screen.height()-size.height())/2)
启动:
1.if __name__ == '__main__':
2.    app = QApplication([])
3.    tetris = Tetris()
4.    sys.exit(app.exec_())
最终效果图如下:
最后,只需要通过pyinstaller插件来进行打包生成exe文件,便可以顺利运行了。
安装 pyinstaller,使用 pip install pyinstaller 即可。 安装完成后,在文件目录
打开命令窗口,在命令窗口执行命令 pyinstaller --onefile --nowindowed --icon="C:\Users\LE\Desktop\tetris\tetris.ico" tetris.py 即可。执行完成后,我们到 dist 目录下

即可找到生成的 exe 文件。
 
------分隔线----------------------------
标签(Tag):
------分隔线----------------------------
推荐内容
猜你感兴趣