带AI的2048和华容道小游戏
2048 Gameplay & AI Demo
华容道 Gameplay Demo
实现细节总结
AI
-
针对4*4的2048游戏,把棋盘压缩为一个64位整数,使其在现代64位处理器中能够储存在一个寄存器内,提高效率
-
使用Expecimax算法,为Minimax算法的一种变体,最大搜索深度为8层,每秒能计算5到20步
-
胜率
达成的格子最大值 概率 2048 100% 4096 100% 8192 100% 16384 94% 32768 36%
总体设计
-
2048和华容道游戏本体使用统一的基类,该基类可以扩展到其他格子游戏
-
游戏本体和GUI解耦,方便debug和添加功能
GUI设计
-
制作了格子滑动和消除的动态效果
-
窗口大小可以改变,棋盘元素会根据窗口大小动态调整
-
两个游戏共用官方2048游戏的配色,使用QSS实现,方便增加新配色
const QString COMMON_STYLE = "qproperty-alignment: AlignCenter; font-family: Menlo; font-weight: bold;"; const QStringList LABEL_STYLES = { "background: #cdc1b4; color: #776e65;", // 0, 1 "background: #eee4da; color: #776e65;", // 1, 2 "background: #eee1c9; color: #776e65;", // 2, 4 "background: #f3b27a; color: #f9f6f2;", // 3, 8 /* ...... */ "background: #3c3a33; color: #f9f6f2;" // 15, 32768 };
其他
-
可以撤销操作,最多撤销256步
-
退出游戏或返回主菜单时会自动保存当前游戏状态,下次打开时自动加载
-
2048游戏可以自由选择棋盘大小
-
华容道游戏可自定义棋盘
const map<QString, QStringList> GameKlotski::GameSetData = { // wid hei number, row, col, wid, hei | ... win condition - num, (at) row, col {"横刀立马",{"4", "5", "1,0,0,1,2|4,0,1,2,2|1,0,3,1,2|1,2,0,1,2|2,2,1,2,1|1,2,3,1,2|3,3,1,1,1|3,3,2,1,1|3,4,0,1,1|3,4,3,1,1", "4,3,1"}}, {"指挥若定",{"4", "5", "1,0,0,1,2|4,0,1,2,2|1,0,3,1,2|3,2,0,1,1|2,2,1,2,1|3,2,3,1,1|1,3,0,1,2|3,3,1,1,1|3,3,2,1,1|1,3,3,1,2", "4,3,1"}}, {"数字华容道",{"4", "4", "NUMBERRAND", "1,0,0|2,0,1|3,0,2|4,0,3|5,1,0|6,1,1|7,1,2|8,1,3|9,2,0|10,2,1|11,2,2|12,2,3|13,3,0|14,3,1|15,3,2"}}, /* ...... */ {"捷足先登",{"4", "5", "1,3,0,1,2|4,0,1,2,2|1,3,1,1,2|1,3,2,1,2|1,3,3,1,2|2,2,1,2,1|3,0,0,1,1|3,1,0,1,1|3,0,3,1,1|3,1,3,1,1", "4,3,1"}} };
技术栈
- C++
- Qt
关于
本项目为东北大学计算机学院C++课程设计,完成于2022年5月。