• 24点游戏开发实例(Qt含源码)


    目录

     游戏介绍

    类关系设计

    MainWidget类

    LevelMainWidget类

    LevelWidget类

    LevelButton类

    NumButton类

    GameWidget类

    LNum类

    关键算法说明

    点击数字按钮

    点击操作符按钮

    数字计算以及结果判断

    源码地址


     游戏介绍

    有关卡设置,24点的题库是根据算法计算出来的可以先查看文章:

    《24点游戏题库算法分析

    玩家获取4张1-10点的牌,可以通过点击数字以及运算计算出最终的结果,如果结果等于24那么游戏获胜。

    游戏的玩法以及界面如下:

     

    类关系设计

    MainWidget类

    • 主页面,使用m_ptrStackWidget切换游戏界面以及关卡界面。

    LevelMainWidget类

    • 关卡主页面类,由于关卡有多个,因此可能需要进行翻页,该类包含多个LevelWidget页面表示需要翻页。
    • m_ptrBtnPre:向上翻页按钮
    • m_ptrBtnNext: 向下翻页按钮
    • unlockLevel:解锁关卡UI,1.计算当前关卡在第几页int((level - 1) / 25);

    LevelWidget类

    • 关卡页面,一个levelWidget页面中包含25个关卡。
    • unlockLevel:解锁关卡UI,更新当前关卡的解锁状态。

    LevelButton类

    • 关卡按钮类,用于显示当前关卡的状态,以及关卡号码,点击按钮后显示对应的GameWidget

    NumButton类

    • 游戏关卡中数字按钮类,用于存储数字信息,以及设置按钮被选中。

    GameWidget类

    • 游戏界面类,从数据库中获取当前游戏的数据,将其内容展示到界面中。
    • 24点游戏的主要游戏逻辑。

    LNum类

    • 分数计算类,由于24点计算过程中可能出现分数计算,因此使用该类,重载操作符进行分数计算。

    关键算法说明

    计算24点是游戏的核心,游戏的玩法是点击“数字+运算符+数字计”或者点击“数字+数字+运算符”计算出最终结果。点击按钮的算法以及游戏获胜算法是游戏的关键。

    存储点击状态主要由以下两个变量完成

    1. typedef struct num_item_stu {
    2. LNum num = LNum(-1);
    3. int type = -1; // 选中的按钮编号
    4. bool operator==(const num_item_stu &p)
    5. {
    6. return (this->num == p.num) && (this->type == p.type);
    7. }
    8. NumButton *btn;
    9. } NumItem;
    10. typedef struct option_item_stu {
    11. int option = -1; // 操作符号 0:加,1:减,2:乘,3:除法
    12. int type = -1; // 选中的按钮编号
    13. } OptionItem;
    14. // 存储点击的数字,注意数字的选中不能超过两个
    15. QList m_listNumSelect;
    16. // 存储点击的操作符, 操作符的选中不能超过1个
    17. QList m_listOptionSelect;

    点击数字按钮

    逻辑图如下:

    大致逻辑如下:

    1. 判断按钮是否被选中如果被选中那么剔除选哪种按钮列表

    2. 判断选中数字列表中的数字是否为2,

    3. 判断操作符列表中是否有选中的操作符,如果有那么计算结果。

     

    点击操作符按钮

    逻辑图如下图:

     

    数字计算以及结果判断

    逻辑如下:

    1. 根据选择的数字以及操作符进行计算。

    2. 隐藏第一个按钮。

    3. 设置第二次选中的按钮的值为最终计算值

    4. 修改按钮为未选中状态

    5. 统计所有按钮的隐藏状态,如果只有一个按钮显示并且计算结果等于24那么游戏获胜,否则游戏失败

    6. 如果游戏获胜那么解锁下一关卡,并且自动加载下一个关卡的数据。

    代码逻辑如下:

    1. void GameWidget::jisuan()
    2. {
    3. LNum num =
    4. Tools::jisuan(m_listNumSelect.first().num, m_listNumSelect.last().num,
    5. m_listOptionSelect.at(0).type);
    6. m_listNumSelect.first().btn->hide();
    7. m_listNumSelect.last().btn->setVale(num);
    8. m_listNumSelect.last().btn->setSelectStatus(false);
    9. m_listNumSelect.clear();
    10. m_listOptionSelect.clear();
    11. int s1 = m_ptrBtnNum1->isHidden() ? 0 : 1;
    12. int s2 = m_ptrBtnNum2->isHidden() ? 0 : 1;
    13. int s3 = m_ptrBtnNum3->isHidden() ? 0 : 1;
    14. int s4 = m_ptrBtnNum4->isHidden() ? 0 : 1;
    15. int s = s1 + s2 + s3 + s4;
    16. bool isWin = false;
    17. if (s == 1) {
    18. if (1 == s1 && m_ptrBtnNum1->getValue() == LNum(24)) {
    19. isWin = true;
    20. } else if (1 == s2 && m_ptrBtnNum2->getValue() == LNum(24)) {
    21. isWin = true;
    22. } else if (1 == s3 && m_ptrBtnNum3->getValue() == LNum(24)) {
    23. isWin = true;
    24. } else if (1 == s4 && m_ptrBtnNum4->getValue() == LNum(24)) {
    25. isWin = true;
    26. }
    27. if (isWin) {
    28. QMessageBox::information(this, "恭喜", "通关");
    29. m_iCurrentLevel++;
    30. DBManager::getInstance()->unlockLevel(m_iCurrentLevel);
    31. initGame();
    32. emit sigUnlockLevel(m_iCurrentLevel);
    33. } else {
    34. QMessageBox::information(this, "提示", "重新来吧");
    35. }
    36. }
    37. }
    38. LNum Tools::jisuan(LNum num1, LNum num2, int x)
    39. {
    40. switch (x) {
    41. case 0:
    42. return num1 + num2;
    43. case 1:
    44. return num1 - num2;
    45. case 2:
    46. return num1 * num2;
    47. case 3:
    48. return num1 / num2;
    49. }
    50. return LNum(0);
    51. }

    源码地址

    24PointGame/24PointGame · master · 三雷科技 / QT博客案例 · GitCode

  • 相关阅读:
    代码随想录算法训练营第六十天丨 单调栈03
    国产API管理工具Eolink太好用了,打造高效的研发利器
    并查集の进阶用法
    zero-shot, one-shot和few-shot
    JS高级 之 Promise 详解
    生成requirements.txt
    《信息学奥赛一本通》最小花费
    《Improved Techniques for Training GANs》-论文阅读笔记
    智汇华云 | 集群日志动态采集方案
    Android12源码编译报错ninja: build stopped: subcommand failed.解决
  • 原文地址:https://blog.csdn.net/arv002/article/details/125830829