用 Python 开发打地鼠小游戏

Python中文社区

共 4195字,需浏览 9分钟

 ·

2020-12-24 07:25

游戏画面

首先先进行游戏画面排版,

class TopWindow(QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.virusnum = 0
        self.setWindowTitle("消灭地鼠小游戏")
        self.setWindowIcon(QIcon(r'sucai/图标.jpg'))


app = QApplication(sys.argv)
Display = TopWindow()
Display.setFixedSize(900600)
Display.show()
sys.exit(app.exec_())

对于 PyQt5 来说,需要创建一个全局的 Application 对象,其参数是命令行参数列表,可以通过 setFixedSize 来设置游戏框的大小。
我们还设置了类变量 virusnum 作为地鼠个数计量

接下来我们创建一个地鼠类,把相关的地洞排布起来

class virus(QPushButton):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setFixedSize(160120
        self.setStyleSheet("QPushButton{border-image: url(sucai/地洞2.png)}"
        self.upTime = QTimer()
        self.upTime.timeout.connect(self.up)

再创建25个地洞

        for i in range(25):
            exec("self.virus{0}=virus()".format(i))
        for i in range(5):
            for j in range(5):
                exec("self.imagelayout.addWidget(self.virus{0},{1},{2})".format(t, i, j))
                t += 1

此时我们程序的效果如下



设置工具栏

下面我们来为游戏页面添加必要的工具栏,比如开始按钮,游戏积分框等等

# 右侧固定窗口内控件
        self.settingslayout = QGridLayout()  # 网格布局
        self.settingsWidget = QWidget()
        self.settingsWidget.setFixedSize(80350)
        self.imagelayout.addWidget(self.settingsWidget, 0515)
        self.settingsWidget.setLayout(self.settingslayout)

之后再创建相关的按钮和输入框

self.startPushButton = QtWidgets.QPushButton(text="开始游戏", clicked=self.handle_play_button)
        self.startPushButton.setFixedSize(8040)
        # self.startPushButton.clicked.connect(self.gamestart)  # 绑定信号

        self.textBrowser = QTextBrowser()
        self.textBrowser.setText('游戏未开始')
        self.textBrowser.setFixedSize(7040)

        self.killBrowser = QTextBrowser()
        self.killBrowser.setText('消灭病毒数:0')
        self.killBrowser.setFixedSize(7050)

        self.escapeBrowser = QTextBrowser()
        self.escapeBrowser.setText('逃离病毒数:0')
        self.escapeBrowser.setFixedSize(7050)

        self.remaintimeText = QTextBrowser()
        self.remaintimeText.setText('剩余时间:\n30s')
        self.remaintimeText.setFixedSize(7055)

在这里,对于开始按钮,采用了与其他按钮不同处理方式,当程序处于游戏中时,该按钮就变成“结束游戏”,所以我们来看看 handle_play_button

@QtCore.pyqtSlot()
    def handle_play_button(self):
        btn = self.sender()
        if btn is not None:
            text = btn.text()
            if text == "开始游戏":
                btn.setText("结束游戏")
                self.gamestart()
            else:
                btn.setText("开始游戏")
                self.gameover()

对于用到的 gamestart 和 gameover 两个函数,代码如下

    def gamestart(self):
        score = 0
        self.textBrowser.setText("正在游戏")
        self.timer.start(30000)  # 30秒执行1次
        self.virustimer.start(1000)
        self.remaintimer.start(1000)

    def gameover(self):
        self.timer.stop()
        self.virustimer.stop()
        self.textBrowser.setText("游戏结束")
        self.mousenum = 0
        for i in range(25):
            exec("self.virus{0}.flag = 0".format(i))

最后再把按钮等增加到游戏页面右侧

self.settingslayout.addWidget(self.startPushButton, 00)
        self.settingslayout.addWidget(self.textBrowser, 10)
        self.settingslayout.addWidget(self.killBrowser, 20)
        self.settingslayout.addWidget(self.escapeBrowser, 30)
        self.settingslayout.addWidget(self.remaintimeText, 40)
        # self.settingslayout.addWidget(self.endPushButton, 5, 0)
        self.settingslayout.addWidget(self.pauseMusicButton, 60)

现在我们的游戏页面是如下样式



游戏积分

既然是游戏,当然要有积分功能。对于地鼠游戏,我们点击鼠标的时候,就是砸地鼠的时候

    def mousePressEvent(self, event):
        self.setCursor(QCursor(QPixmap(r"sucai/down.png")))
        self.upTime.start(100)
        self.kill()

    def up(self):
        self.setCursor(QCursor(QPixmap(r"sucai/up.png")))

然后再进行游戏得分的逻辑

    def kill(self):
        try:
            if self.flag == 1:
                self.setStyleSheet("QPushButton{border-image: url(sucai/killvirus2.png)}")  # 地鼠被砸
                global score
                score += 1
                self.flag = 0
        except:
            pass

这样,一个基本的游戏积分也就有了!

最后来看看最终的效果吧

更多阅读



5 分钟完全掌握 Python 协程


程序运行慢?你怕是写的假 Python


赛博朋克科幻文化的起源和意义


特别推荐


程序员摸鱼指南


为你精选的硅谷极客资讯,
来自FLAG巨头开发者、技术、创投一手消息




点击下方阅读原文加入社区会员

浏览 17
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报