前面已经把游戏的整体流程介绍完毕,接下来讲解游戏结束页面。
1. 页面流程图
话不多说,直接看图。
2. 代码讲解
接下来对上述流程图中的各个部分做详细说明。
2.1 GameOverPage类
GameOverPage 类继承自 QDialog 类,是弹出对话框。
成员变量:
- 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 布局
游戏结束了,那么游戏数据是必须要进行展示的,即游戏用时和游戏步数,这属于新纪录和不是新纪录展示的共同部分。
该部分实现代码:
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()
2.3 游戏结束
over()函数完成游戏结束时的操作:
- 是新纪录,获取用户输入用户名,如果用户名为空,则提示其继续输入,直至用户输入用户名,发送 gameover 信号,并销毁。
- 不是新纪录,发送 gameover 信号,并销毁。
2.4 最终效果展示
新纪录游戏结束页面:
不是新纪录游戏结束页面:
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_())