• 完整数字华容道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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

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

    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()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    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_())
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
  • 相关阅读:
    【Java+SpringBoot】原材料管理系统_仓库管理系统(源码+远程部署+项目定制开发+代码讲解+答辩教学+计算机毕业设计+计算机毕设)
    MTK安卓开发板_联发科开发板评估套件_安卓主板硬件开发
    SQL必需掌握的100个重要知识点:使用视图
    【含面试题】MySQL表字段值转换为小写(或大写)的java代码实现
    用DIV+CSS技术设计的体育篮球主题 校园体育网页与实现制作(web前端网页制作课作业)
    中国石油大学(北京)-《 油气田开发方案设计》第二阶段在线作业
    苹果开发者证书申请流程
    给电脑加硬件的办法 先找电脑支持的接口,再买相同接口的
    FreeRTOS教程3 中断管理
    【动手学深度学习-Pytorch版】序列到序列的学习(包含NLP常用的Mask技巧)
  • 原文地址:https://blog.csdn.net/yaoyefengchen/article/details/125490959