完整数字华容道05:游戏结束


前面已经把游戏的整体流程介绍完毕,接下来讲解游戏结束页面。

1. 页面流程图

话不多说,直接看图。

01_game_over_page

2. 代码讲解

接下来对上述流程图中的各个部分做详细说明。

2.1 GameOverPage类

GameOverPage 类继承自 QDialog 类,是弹出对话框。

02_GameOverPage_class

成员变量:

  • time:游戏用时
  • step:游戏步数
  • isNewRecord:是否为新记录,用来决定界面布局
  • playerName:用户姓名,新纪录时用

成员函数:

  • initUI():布局,需要传入 isNewRecord 以便区分新纪录和不是新纪录的展示。
  • over():游戏结束
  • gameover():是自定义的 PyQt信号,其定义为gameover = pyqtSignal(str)

GameOverPage 类的创建需要传入三个参数:time、step和isNewRecord。所以该类的代码框架如下:

class GameOverPage(QDialog):
    """ 游戏结束页面 """
    gameover = pyqtSignal(str)  # 自定义信号

    def __init__(self, time, step, isNewRecord):
        super(GameOverPage, self).__init__()

        self.time = time
        self.step = step
        self.playerName = ''
        self.isNewRecord = isNewRecord
        self.initUI(self.isNewRecord)

    def initUI(self, isNewRecord):
        pass
    def over(self):
        pass

2.2 布局

游戏结束了,那么游戏数据是必须要进行展示的,即游戏用时和游戏步数,这属于新纪录和不是新纪录展示的共同部分。

03_time_and_step

该部分实现代码:

font = QFont()
font.setPointSize(15)
lbInfo = QLabel('您本次成绩为: \r\n时间: {}s\r\n步数: {}'.format(self.time, self.step))
lbInfo.setFont(font)

# 布局
self.vltMain.addWidget(lbInfo, 0, Qt.AlignLeft)

如果用户打破了记录,提示并让用户输入姓名:

05_new_record

否则提示其未打破记录:

04_not_new_record

该部分实现代码:

		# 根据是否打破了记录进行布局
        if self.isNewRecord:
            lbSaveResult = QLabel('恭喜您打破记录,请留下姓名:')
            font.setBold(True)
            lbSaveResult.setFont(font)
            self.letName = QLineEdit()
            self.letName.setFixedSize(360, 30)
            self.vltMain.addWidget(lbSaveResult, 0, Qt.AlignLeft)
            self.vltMain.addWidget(self.letName, 0, Qt.AlignLeft)
        else:
            lbGameover = QLabel('很遗憾您没有打破纪录,再接再厉!')
            font.setBold(True)
            lbGameover.setFont(font)
            self.vltMain.addWidget(lbGameover, 0, Qt.AlignLeft)

        self.btnConfirm = QPushButton('确定')
        self.btnConfirm.setFixedSize(80, 30)
        self.btnConfirm.clicked.connect(self.over)
        self.vltMain.addWidget(self.btnConfirm, 0, Qt.AlignRight)

        self.setLayout(self.vltMain)
        self.setFixedSize(380, 200)
        self.setStyleSheet("background-color:lightblue;")
        self.setWindowTitle('游戏结束')
        self.show()

2.3 游戏结束

over()函数完成游戏结束时的操作:

  • 是新纪录,获取用户输入用户名,如果用户名为空,则提示其继续输入,直至用户输入用户名,发送 gameover 信号,并销毁。
  • 不是新纪录,发送 gameover 信号,并销毁。

2.4 最终效果展示

新纪录游戏结束页面:

06_new_record_page

不是新纪录游戏结束页面:

07_not_new_record_page

3. 完整代码

import os
import sys
from PyQt5.QtWidgets import QLabel, QMessageBox, QVBoxLayout, QPushButton, QApplication, QLineEdit, QDialog
from PyQt5.QtGui import QPixmap, QFont
from PyQt5.QtCore import Qt, pyqtSignal

class GameOverPage(QDialog):
    """ 游戏结束页面 """
    gameover = pyqtSignal(str)  # 自定义信号

    def __init__(self, time, step, isNewRecord):
        super(GameOverPage, self).__init__()

        self.time = time
        self.step = step
        self.playerName = ''
        self.isNewRecord = isNewRecord
        self.vltMain = QVBoxLayout()
        self.initUI(self.isNewRecord)

    def initUI(self, isNewRecord):
        font = QFont()
        font.setPointSize(15)

        lbInfo = QLabel(
            '您本次成绩为: \r\n时间: {}s\r\n步数: {}'.format(self.time, self.step))
        lbInfo.setFont(font)

        # 布局
        self.vltMain.addWidget(lbInfo, 0, Qt.AlignLeft)

        # 根据是否打破了记录进行布局
        if self.isNewRecord:
            lbSaveResult = QLabel('恭喜您打破记录,请留下姓名:')
            font.setBold(True)
            lbSaveResult.setFont(font)
            self.letName = QLineEdit()
            self.letName.setFixedSize(360, 30)
            self.vltMain.addWidget(lbSaveResult, 0, Qt.AlignLeft)
            self.vltMain.addWidget(self.letName, 0, Qt.AlignLeft)
        else:
            lbGameover = QLabel('很遗憾您没有打破纪录,再接再厉!')
            font.setBold(True)
            lbGameover.setFont(font)
            self.vltMain.addWidget(lbGameover, 0, Qt.AlignLeft)

        self.btnConfirm = QPushButton('确定')
        self.btnConfirm.setFixedSize(80, 30)
        self.btnConfirm.clicked.connect(self.over)
        self.vltMain.addWidget(self.btnConfirm, 0, Qt.AlignRight)

        self.setLayout(self.vltMain)
        self.setFixedSize(380, 200)
        self.setStyleSheet("background-color:lightblue;")
        self.setWindowTitle('游戏结束')
        self.show()

    def over(self):
        if self.isNewRecord:
            self.playerName = self.letName.text()
            if self.playerName:	# 姓名不为空
                self.gameover.emit(self.playerName)
                self.destroy()
            else:	# 姓名为空,提示用户输入
                QMessageBox.information(self, '提示', '请输入姓名!')
        else:
            self.gameover.emit('')
            self.destroy()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    gop = GameOverPage(50, 45, False)
    sys.exit(app.exec_())

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

C与Python实战

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值