第二次C++实训报告
第二次实训工作报告
设计题目
华南理工大学:植此青绿
本周工作小结:
本周我主要进行了以下工作:
对第一周的练习页面,设置页面,竞赛页面,和排行榜页面设置了大体的框架,并为他们设计了一个返回主页面的按钮。
初步完成了对设置页面的实现。
设置了一个游戏成功跳转窗口
设置了一个游戏失败跳转窗口,以上两个窗口为下周即将实现的游戏逻辑做准备
环境与工具:
- 开发环境:Qt Creator 13.0.0
- 操作系统:Windows 11
前置工作
前置工作,初步思考了各个界面的布局应该如何设计,并准备从最简单也是最朴实无华的设置界面作为首先的设置页面。
思考了关卡功能应有的成功页面和失败页面的跳转。
后期预备开启功能:
- 游戏逻辑:准备开始实现游戏的主要逻辑,包括地图生成、游戏操作、状态判断等功能。
程序功能说明
各界面UI的设计(这里以PracticePage.cpp设计的)
效果一览:
一个简单的UML(统一建模语言)类图,描述了
PracticePage
类及其成员和方法:在这个UML图中:
+
表示公有成员或方法-
表示私有成员或方法:
表示成员的数据类型- 方法名后面的
()
表示该方法是一个函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23+---------------------------------------+
| PracticePage |
+---------------------------------------+
| - vLayout: QVBoxLayout* |
| - levelOnePa: LevelOnepa* |
| - stackedWidget: QStackedWidget* |
| - returnButton: QPushButton* |
| - levelOneButton: QPushButton* |
| - levelTwoButton: QPushButton* |
| - levelThreeButton: QPushButton* |
+---------------------------------------+
| + PracticePage(QWidget* = nullptr) |
| + ~PracticePage() |
+---------------------------------------+
| + returnToMainPage(): void |
+---------------------------------------+
| - on_ReturnButton_clicked(): void |
| - on_ReturnToPracticePage(): void |
| - showLevelOnePa(): void |
| - readlevelone(): void |
| - readleveltwo(): void |
| - readlevelthree(): void |
+---------------------------------------+关卡选择功能: 通过三个按钮(关卡1、关卡2、关卡3),用户可以选择不同的关卡进行游戏。每个按钮对应一个关卡文件,当按钮被点击时,相应的关卡文件会被读取和显示。
1 | void PracticePage::readlevelone() |
该地图会用于下周的地图判断,为判断胜负做准备。正是思考到了比赛的胜负,才会想着先把胜利界面和失败界面先实现了。
- 页面导航功能:
页面使用
QStackedWidget
进行管理,当用户点击关卡按钮时,会显示相应的关卡页面;点击返回按钮则返回到主页面。
1 | void PracticePage::showLevelOnePa() |
- 界面设计: 按钮样式和布局均已在代码中设置,以保证界面的美观和用户友好性。按钮样式采用透明背景、特定字体和大小,以提供清晰的可视效果。
1 | levelOneButton->setStyleSheet("font-family: \"Microsoft YaHei\"; font-size: 28px; font-weight: bold; color: white; " |
功能连接与信号槽
关卡选择与页面显示: 当关卡按钮被点击时,通过信号槽机制调用
showLevelOnePa()
方法,切换到相应的关卡页面。1
2
3connect(levelOneButton, &QPushButton::clicked, this, &PracticePage::showLevelOnePa);
connect(levelTwoButton, &QPushButton::clicked, this, &PracticePage::showLevelOnePa);
connect(levelThreeButton, &QPushButton::clicked, this, &PracticePage::showLevelOnePa);返回功能: 返回按钮连接到
returnToMainPage()
方法,该方法发出returnToMainPage
信号,用于返回主页面。
1 | connect(returnButton, &QPushButton::clicked, this, &PracticePage::returnToMainPage); |
关卡文件读取: 每个关卡按钮对应一个读取方法(
readlevelone()
、readleveltwo()
、readlevelthree()
),当按钮被点击时,会调用相应的方法读取对应的关卡文件并更新关卡页面内容。1
2
3connect(levelOneButton, &QPushButton::clicked, this, &PracticePage::readlevelone);
connect(levelTwoButton, &QPushButton::clicked, this, &PracticePage::readleveltwo);
connect(levelThreeButton, &QPushButton::clicked, this, &PracticePage::readlevelthree);关卡页面返回: 在关卡页面中,当用户完成关卡或者想要返回练习页面时,可以通过信号
returnToPracticePage
通知主页面返回。
1 | connect(levelOnePa, &LevelOnepa::returnToPracticePage, this, &PracticePage::on_ReturnToPracticePage); |
失败界面的设计
各模块功能
失败界面实现:(尚且比较简陋,争取后期美化)
当用户未能成功完成关卡时,会显示一个失败界面以提供反馈和鼓励。(希望能够使游戏有更多的人文气息哈)
界面设计
- 标题设置为“失败”。
- 使用
QDialog
作为主窗口,并设置背景颜色、边框和阴影效果。 - 主要内容包括日期标签、失败消息和随机鼓励语句。
代码示例
1
2QLabel *messageLabel = new QLabel("很遗憾,你失败了。请再试一次!", this);
QLabel *encouragementLabel = new QLabel(randomEncouragement, this);
日期和鼓励语句:
当界面加载时,会显示当前日期和随机生成的鼓励语句。
代码示例:
1
QLabel *dateLabel = new QLabel(QDate::currentDate().
一些细枝末节的实现:页面美化设计
1 | // 动态效果:淡入和旋转 |
代码稳健性的体现:
1 | // 检查背景图片是否加载成功,确保程序的稳健性 |
成功界面实现:与之类似
- 设置界面的全实现,后面有需要添加的功能会自行添加,暂时只写了帮助文档,不过单单是这个就调了快一天,怎么调都显示不完全,直到不使用html时候。
界面设计:
- 返回按钮:用于返回主页面。
- 帮助文档:提供了关于游戏规则和玩法的说明。
- 暗黑模式切换:用户可以切换界面的颜色主题。
代码示例:
返回按钮
1
QPushButton *returnButton = new QPushButton("返回", this);
帮助文档:
1
2
3
4
5
6QStringList texts = { /* 文本内容 */ };
for (const auto &text : texts)
{
QLabel *label = new QLabel(text, this);
// 设置文本样式和布局
}
暗黑模式切换:
1 | void SettingsPage::on_darkModeSwitch_changed(int state) |
动画按钮:
为按钮添加了鼠标悬停和点击效果。
代码示例
1
2
3
4class AnimatedButton : public QPushButton
{
// 构造函数和样式设置
};
一些细节的设计就是布局的设计了,大体样式如下:
寄语
这周主要还是在继续研究QT和思考游戏逻辑,对整个项目的推进较为缓慢,希望下周能够实现大致游戏逻辑。