用 Python 開發(fā)打地鼠小游戲

游戲畫面
首先先進行游戲畫面排版,
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(900,?600)
Display.show()
sys.exit(app.exec_())
對于 PyQt5 來說,需要創(chuàng)建一個全局的 Application 對象,其參數(shù)是命令行參數(shù)列表,可以通過 setFixedSize 來設(shè)置游戲框的大小。
我們還設(shè)置了類變量 virusnum 作為地鼠個數(shù)計量
接下來我們創(chuàng)建一個地鼠類,把相關(guān)的地洞排布起來
class?virus(QPushButton):
????def?__init__(self,?parent=None):
????????super().__init__(parent)
????????self.setFixedSize(160,?120)?
????????self.setStyleSheet("QPushButton{border-image: url(sucai/地洞2.png)}")?
????????self.upTime?=?QTimer()
????????self.upTime.timeout.connect(self.up)
再創(chuàng)建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
此時我們程序的效果如下

設(shè)置工具欄
下面我們來為游戲頁面添加必要的工具欄,比如開始按鈕,游戲積分框等等
#?右側(cè)固定窗口內(nèi)控件
????????self.settingslayout?=?QGridLayout()??#?網(wǎng)格布局
????????self.settingsWidget?=?QWidget()
????????self.settingsWidget.setFixedSize(80,?350)
????????self.imagelayout.addWidget(self.settingsWidget,?0,?5,?1,?5)
????????self.settingsWidget.setLayout(self.settingslayout)
之后再創(chuàng)建相關(guān)的按鈕和輸入框
self.startPushButton?=?QtWidgets.QPushButton(text="開始游戲",?clicked=self.handle_play_button)
????????self.startPushButton.setFixedSize(80,?40)
????????#?self.startPushButton.clicked.connect(self.gamestart)??#?綁定信號
????????self.textBrowser?=?QTextBrowser()
????????self.textBrowser.setText('游戲未開始')
????????self.textBrowser.setFixedSize(70,?40)
????????self.killBrowser?=?QTextBrowser()
????????self.killBrowser.setText('消滅病毒數(shù):0')
????????self.killBrowser.setFixedSize(70,?50)
????????self.escapeBrowser?=?QTextBrowser()
????????self.escapeBrowser.setText('逃離病毒數(shù):0')
????????self.escapeBrowser.setFixedSize(70,?50)
????????self.remaintimeText?=?QTextBrowser()
????????self.remaintimeText.setText('剩余時間:\n30s')
????????self.remaintimeText.setFixedSize(70,?55)
在這里,對于開始按鈕,采用了與其他按鈕不同處理方式,當程序處于游戲中時,該按鈕就變成“結(jié)束游戲”,所以我們來看看 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("結(jié)束游戲")
????????????????self.gamestart()
????????????else:
????????????????btn.setText("開始游戲")
????????????????self.gameover()
對于用到的 gamestart 和 gameover 兩個函數(shù),代碼如下
????def?gamestart(self):
????????score?=?0
????????self.textBrowser.setText("正在游戲")
????????self.timer.start(30000)??#?30秒執(zhí)行1次
????????self.virustimer.start(1000)
????????self.remaintimer.start(1000)
????def?gameover(self):
????????self.timer.stop()
????????self.virustimer.stop()
????????self.textBrowser.setText("游戲結(jié)束")
????????self.mousenum?=?0
????????for?i?in?range(25):
????????????exec("self.virus{0}.flag?=?0".format(i))
最后再把按鈕等增加到游戲頁面右側(cè)
self.settingslayout.addWidget(self.startPushButton,?0,?0)
????????self.settingslayout.addWidget(self.textBrowser,?1,?0)
????????self.settingslayout.addWidget(self.killBrowser,?2,?0)
????????self.settingslayout.addWidget(self.escapeBrowser,?3,?0)
????????self.settingslayout.addWidget(self.remaintimeText,?4,?0)
????????#?self.settingslayout.addWidget(self.endPushButton,?5,?0)
????????self.settingslayout.addWidget(self.pauseMusicButton,?6,?0)
現(xiàn)在我們的游戲頁面是如下樣式

游戲積分
既然是游戲,當然要有積分功能。對于地鼠游戲,我們點擊鼠標的時候,就是砸地鼠的時候
????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
這樣,一個基本的游戲積分也就有了!
最后來看看最終的效果吧
更多閱讀
特別推薦

點擊下方閱讀原文加入社區(qū)會員
評論
圖片
表情
