第二次实训工作报告

设计题目

华南理工大学:植此青绿

本周工作小结:

本周我主要进行了以下工作:

  1. 对第一周的练习页面,设置页面,竞赛页面,和排行榜页面设置了大体的框架,并为他们设计了一个返回主页面的按钮。

  2. 初步完成了对设置页面的实现。

  3. 设置了一个游戏成功跳转窗口

  4. 设置了一个游戏失败跳转窗口,以上两个窗口为下周即将实现的游戏逻辑做准备

环境与工具

  • 开发环境:Qt Creator 13.0.0
  • 操作系统:Windows 11

前置工作

前置工作,初步思考了各个界面的布局应该如何设计,并准备从最简单也是最朴实无华的设置界面作为首先的设置页面。

思考了关卡功能应有的成功页面和失败页面的跳转。

后期预备开启功能:
  • 游戏逻辑:准备开始实现游戏的主要逻辑,包括地图生成、游戏操作、状态判断等功能。

程序功能说明

  1. 各界面UI的设计(这里以PracticePage.cpp设计的)

    效果一览:

    image-20240424230523306
  • 一个简单的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
2
3
4
5
6
7
8
9
10
11
12
13
14
void PracticePage::readlevelone()
{
levelOnePa->update("C:/cat/qqzl.txt");
}

void PracticePage::readleveltwo()
{
levelOnePa->update("C:/cat/qqzlx.txt");
}

void PracticePage::readlevelthree()
{
levelOnePa->update("C:/cat/qqzlt.txt");
}

该地图会用于下周的地图判断,为判断胜负做准备。正是思考到了比赛的胜负,才会想着先把胜利界面和失败界面先实现了。

  • 页面导航功能: 页面使用QStackedWidget进行管理,当用户点击关卡按钮时,会显示相应的关卡页面;点击返回按钮则返回到主页面。
1
2
3
4
5
6
7
8
9
void PracticePage::showLevelOnePa()
{
stackedWidget->setCurrentIndex(1);
}

void PracticePage::on_ReturnToPracticePage()
{
stackedWidget->setCurrentIndex(0);
}
  • 界面设计: 按钮样式和布局均已在代码中设置,以保证界面的美观和用户友好性。按钮样式采用透明背景、特定字体和大小,以提供清晰的可视效果。
1
2
3
levelOneButton->setStyleSheet("font-family: \"Microsoft YaHei\"; font-size: 28px; font-weight: bold; color: white; "
"border-radius: 10px; padding: 10px; min-width: 100px; min-height: 50px;"
"background-color: transparent;");

功能连接与信号槽

  • 关卡选择与页面显示: 当关卡按钮被点击时,通过信号槽机制调用showLevelOnePa()方法,切换到相应的关卡页面。

    1
    2
    3
    connect(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
    3
    connect(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);
  1. 失败界面的设计

各模块功能

失败界面实现:(尚且比较简陋,争取后期美化)
image-20240424230638745

当用户未能成功完成关卡时,会显示一个失败界面以提供反馈和鼓励。(希望能够使游戏有更多的人文气息哈)

  • 界面设计

    • 标题设置为“失败”。
    • 使用QDialog作为主窗口,并设置背景颜色、边框和阴影效果。
    • 主要内容包括日期标签、失败消息和随机鼓励语句。
  • 代码示例

    1
    2
    QLabel *messageLabel = new QLabel("很遗憾,你失败了。请再试一次!", this);
    QLabel *encouragementLabel = new QLabel(randomEncouragement, this);
日期和鼓励语句:
  • 当界面加载时,会显示当前日期和随机生成的鼓励语句。

  • 代码示例

    1
    QLabel *dateLabel = new QLabel(QDate::currentDate().

一些细枝末节的实现:页面美化设计

1
2
3
4
5
6
// 动态效果:淡入和旋转
QPropertyAnimation *animation = new QPropertyAnimation(this, "windowOpacity");
animation->setDuration(1000);
animation->setStartValue(0);
animation->setEndValue(1);
animation->start();

代码稳健性的体现:

1
2
3
4
5
6
7
8
// 检查背景图片是否加载成功,确保程序的稳健性
QPixmap backgroundImage(":/new/images/gdyg1.png");
if (backgroundImage.isNull())
{
qDebug() << "Failed to load gdyg.png.";
}
else
{}

成功界面实现:与之类似

  1. 设置界面的全实现,后面有需要添加的功能会自行添加,暂时只写了帮助文档,不过单单是这个就调了快一天,怎么调都显示不完全,直到不使用html时候。
  • 界面设计

    • 返回按钮:用于返回主页面。
    • 帮助文档:提供了关于游戏规则和玩法的说明。
    • 暗黑模式切换:用户可以切换界面的颜色主题。

    代码示例

    返回按钮

    1
    QPushButton *returnButton = new QPushButton("返回", this);

    帮助文档:

    1
    2
    3
    4
    5
    6
    QStringList texts = { /* 文本内容 */ };
    for (const auto &text : texts)
    {
    QLabel *label = new QLabel(text, this);
    // 设置文本样式和布局
    }

暗黑模式切换:

1
2
3
4
5
6
7
void SettingsPage::on_darkModeSwitch_changed(int state)
{
QString darkModeCSS = R"(
/* 暗黑模式下的样式 */
)";
setStyleSheet(darkModeCSS);
}
动画按钮:

为按钮添加了鼠标悬停和点击效果。

  • 代码示例

    1
    2
    3
    4
    class AnimatedButton : public QPushButton
    {
    // 构造函数和样式设置
    };

一些细节的设计就是布局的设计了,大体样式如下:

image-20240424230912454

寄语

这周主要还是在继续研究QT和思考游戏逻辑,对整个项目的推进较为缓慢,希望下周能够实现大致游戏逻辑。