使用pyqt5实现坤坤小游戏

最近刚开始接触pyqt5,边学边玩,学习创建画布、按钮、文字,信号与槽,利用这些基本功能简单做了一个小游戏,话不多说,放图

代码不算复杂,首先是导入的包:

import random
import sys
from PyQt5.QtCore import QBasicTimer, Qt, QTimer ,QUrl
from PyQt5.QtGui import QColor, QImage, QPixmap, QFont, QIcon, QCursor
from PyQt5.QtWidgets import QApplication, QGraphicsView, QGraphicsScene, QMainWindow, QWidget, QPushButton
from PyQt5.QtMultimedia import QMediaPlayer ,QMediaContent

创建类然后初始化:

class WhackAMole(QMainWindow):
    def __init__(self):
        super().__init__()
        self.i = 0
        # 设置窗口属性
        self.setWindowTitle("击毙坤坤")
        self.setGeometry(300, 300, 650, 650)
        self.setWindowIcon(QIcon('enemy.png'))
        # 创建一个图形场景
        self.scene = QGraphicsScene()
        self.background=self.scene.addPixmap(QPixmap("background.png").scaled(645,645))
        self.background.setZValue(0)
        # self.background.setZValue(1)
        self.view = QGraphicsView(self.scene)
         
        # 创建一个计时器
        self.timer = QBasicTimer()
        # self.interval = 1000  # 每一秒发生一次事件
        self.counter = 0  # 计数器
        # 创建开始按钮
        self.btn = QPushButton("开始游戏", self.view)
        self.btn.setGeometry(280, 500, 100, 30)
        self.btn.clicked.connect(self.choosebtn)
        # 创建一个地鼠
        self.mole = self.scene.addPixmap(QPixmap("enemy.png"))
        self.mole.setZValue(1)
        self.mole.hide()
        # 创建计数器
        self.btn_click = self.scene.addSimpleText("计数:" + str(self.counter))
        self.btn_click.setZValue(2)
        self.font = QFont()
        self.font.setPointSize(20)
        self.btn_click.setFont(self.font)
        self.btn_click.setPos(0,0)
        self.btn_click.hide()
        # 创建结算画面
        font = QFont() # 字体设置
        font.setPointSize(50)
        font2 = QFont()
        font2.setPointSize(20)
        self.gameover = self.scene.addSimpleText("你干嘛哎嗨哟")
        self.gameover.setZValue(2)
        self.gameover.setFont(font)
        self.gameover.setPos(140,300)
        self.gameover.hide()
        self.score = self.scene.addSimpleText("你用"+ str(self.counter)+"枪击毙了坤坤")
        self.score.setZValue(2)
        self.score.setFont(font2)
        self.score.setPos(220,100)
        self.score.hide()
        # 将鼠标跟踪设置为True,以便获取鼠标位置
        self.setMouseTracking(True)
        # 存储图像项的引用
        self.pixmap_items = []
        # 设置自定义鼠标图片
        self.setCustomCursor("zhunxin.png")
        # 设置窗口布局
        self.setCentralWidget(self.view)
        self.sound()

由于每次枪声响了要等放完才能再响,所以创建了多个枪声,每次响完执行下一个,避免多次点击时枪声不响。

def sound(self):
        # 创建音效
        self.player = QMediaPlayer()
        self.player2= QMediaPlayer()
        self.player3= QMediaPlayer()
        self.player4= QMediaPlayer()
        self.player5= QMediaPlayer()
        self.player6= QMediaPlayer()
        soundFile2 = QUrl.fromLocalFile("shoot.mp3")
        soundFile = QUrl.fromLocalFile("niganma.mp3")
        soundContent = QMediaContent(soundFile)
        soundContent2 = QMediaContent(soundFile2)
        self.player.setMedia(soundContent)
        self.player2.setMedia(soundContent2)
        self.player3.setMedia(soundContent2)
        self.player4.setMedia(soundContent2)
        self.player5.setMedia(soundContent2)
        self.player6.setMedia(soundContent2)
        self.soundtrack=[self.player2,self.player3,self.player4,self.player5,self.player6]
    def xunhuan(self): 
        self.soundtrack[self.i].play()
        self.i+=1
        if self.i==5:
            self.i=0

鼠标光标修改和难度选择按钮:

def setCustomCursor(self, cursor_image):
        cursor_pixmap = QPixmap(cursor_image)
        # 设置光标形状为自定义图像
        cursor = QCursor(cursor_pixmap)
        # 将光标设置为应用程序的全局光标
        QApplication.setOverrideCursor(cursor)
    # 创建按钮
    def create_btn(self,text,x,y,w,h,gamechoose):
        btn = QPushButton(text, self.view)
        btn.setGeometry(x, y, w, h)
        btn.clicked.connect(gamechoose)
        return btn
        # 选择难度按钮
    def choosebtn(self):
        self.gameover.hide()
        self.btn.hide()
        self.btn1=self.create_btn("简单难度",280,100,100,30,self.startGame1)
        self.btn2=self.create_btn("中等难度",280,250,100,30,self.startGame2)
        self.btn2.setStyleSheet("background-color: green; color: white")
        self.btn3=self.create_btn("困难难度",280,400,100,30,self.startGame3)
        self.btn3.setStyleSheet("background-color: yellow")
        self.btn4=self.create_btn("地狱难度",280,550,100,30,self.startGame4)
        self.btn4.setStyleSheet("background-color: red; color: white")
        self.btn1.show()
        self.btn2.show()
        self.btn3.show()
        self.btn4.show()

重新开始按钮和计数窗口:

# 隐藏选择按钮并重新计数
    def hide_btn(self):
        self.btn1.hide()
        self.btn2.hide()
        self.btn3.hide()
        self.btn4.hide()
        self.counter = 0
        self.btn_click.setText("计数:" + str(self.counter))
        # 计数窗口
    def count_window(self):
        self.btn_click = self.scene.addSimpleText("计数:" + str(self.counter))
        self.btn_click.setZValue(2)
        self.font = QFont()
        self.font.setPointSize(20)
        self.btn_click.setFont(self.font)
        self.btn_click.setPos(0,0)
        self.timer.start(self.interval, self)
        self.mole.show()
        self.hide_btn()

按钮连接启动游戏,以及开枪动作

def startGame1(self):
        self.interval = 1000
        self.count_window()
    def startGame2(self):
        self.interval = 500
        self.count_window()
    def startGame3(self):
        self.interval = 300
        self.count_window()
    def startGame4(self):
        self.interval = 100
        self.count_window()
    def timerEvent(self, event):
        if event.timerId() == self.timer.timerId():
            # 随机移动地鼠
            self.mole.setPos(random.randint(0, 600), random.randint(0, 600))
        else:
            super().timerEvent(event)
 
    def mousePressEvent(self, event):
        # 点击地鼠时,将地鼠隐藏
        if self.mole.isUnderMouse():
            self.mole.hide()
            self.gameover.show()
            self.restart = QPushButton("重新开始", self.view)
            self.restart.setGeometry(280, 250, 100, 30)
            self.restart.show()
            self.score.setText("你用"+ str(self.counter)+"下抓住了坤坤")
            self.score.show()
            self.restart.clicked.connect(self.choosebtn)
            self.restart.clicked.connect(self.restartclick)
            self.btn_click.hide()
            self.player.play()
        if self.background.isUnderMouse():
            self.counter += 1
            self.click_text()
            # 跟踪鼠标
            pixmap = QPixmap("dankong.png")
            self.gun=self.scene.addPixmap(pixmap)
            self.gun.setPos(event.pos() - pixmap.rect().center())
            self.pixmap_items.append(self.gun)
            self.xunhuan()
    def click_text(self):
        self.btn_click.setText("计数:" + str(self.counter))
                       
    def restartclick(self):
        self.restart.hide()
        self.btn_click.hide()
        self.score.hide()
        for gun in self.pixmap_items:
            self.scene.removeItem(gun)
            # 清空图像项的引用列表
            self.pixmap_items = []

最后启动程序:

if __name__ == "__main__":
    app = QApplication(sys.argv)
    game = WhackAMole()
    game.show()
    # game.startGame()
    sys.exit(app.exec_())

本人代码较菜,很多地方可以优化,仅供参考

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值