XMuli / ChineseChess

Cross-platform and online battle platform game based on Qt: Chinese Chess. Also known as:『Xiangqi』『中国象棋』
https://www.bilibili.com/video/av45509758
GNU General Public License v3.0
709 stars 186 forks source link

用不到1分钟的时间就赢了AI,有地方设置难度吗? #29

Closed venliong closed 2 years ago

XMuli commented 2 years ago

当时重点只是模拟一种可行的 AI 算法,作为整个项目的一小部分,所以构思比较简单。

当时大致思路:对每个棋子赋不同的权值;每一步都会模拟计算 (仅) 当前每一枚棋子的所有下棋的可能,从而取出最优解作为 AI 方的下棋步骤;若想要达到更 “聪明” 的 AI 下棋策略,则可以计算可以模拟多级步所有下棋的模拟遍历(在如下位置去优化);从而取出最优解即可;当时对应的中间过程存储也会以爆炸函数增长。

https://github.com/xmuli/chinessChess/blob/24f9a67f86285a3c37747fe1cc52142a8d7fe6f5/MachineGame.cpp#L243-L290


附带一些其它思路:

calcitem commented 2 years ago

中间过程不需要存储,在深度遍历的期间函数会压栈和弹栈,内存消耗不大。

XMuli commented 2 years ago

@calcitem 若遍历第一次的最优解作为遍历第二步的最优解(循环往下);但最终整体可能并不是最优解(如贪心);若是想要很“智慧”所有中间过程的存储还是很有必要的。

calcitem commented 2 years ago

呃,没懂。不是通常使用 minimax 算法吗?一边深度优先搜索一边剪枝,剪枝也不需把所有节点都存下来。需要保存的主要是局面,需入栈和出栈,不过一般情况下能搜索20-30层就挺强了,存储的局面也不需要每个字段都存,可以只存必要的状态信息,这样的话算30层,估计也就占500字节不到的空间。

calcitem commented 2 years ago

我看您更专注于 Qt,Qt 水平相当高。AI 方面我建议直接集成现成的引擎,如 https://github.com/ianfab/Fairy-Stockfish ,不用重复造轮子。当然如果对 AI 感兴趣想自己从头写的话也不错😊

XMuli commented 2 years ago

术业有专攻,集成进现有的 AI 轮子会是一个比较容易的操作;以及上面提到的 minimax 这种算法,也会考虑一番的;两种思路和可行性都比较高。甚是感谢,先 Mark 一下,然先手上现有的坑完成了后,腾出手后可以加入此,奶思~ ; 应该不会 🕊🕊🕊,

calcitem commented 2 years ago

您对技术的追求和热情令人印象深刻!如果愿意的话,诚邀您加盟我们的 Sanmill 项目,有Qt的部分哦,未来还有无限可能!

XMuli commented 2 years ago

@calcitem 可以哒~;

WangPengZhan commented 2 years ago

@calcitem 可以哒~;

求安装壳代码,不想自己写了

calcitem commented 2 years ago

什么是壳?