Skip to content

面对对象程序设计课程设计作业,使用人机博弈剪枝算法生成 AI 行为树

Notifications You must be signed in to change notification settings

super999/ChineseChess

Repository files navigation

项目名称

中国象棋

制作缘由

学校的课程要求制作一份课程设计,由于所给的题目实用性不大,故而和老师商量后开始准备写这个项目,一方面是可以理解刚学不就的数据结构,另一方面是可以接触 C++ 的 QT 界面库,可以多学到点东西

程序制作思路

主要将程序分为四种模式:

  • 本地的 PVP 对战
  • 本地的 PVE 对战
  • 基于 Socket 通讯的 PVP 对战(服务端)
  • 基于 Socket 通讯的 PVP 对战(客户端)

遇到的问题

关于悔棋操作的实现

初始方案

一开始打算使用数据库存储,但是发现数据库涉及的东西实在不少,并且总是结束程序清空数据库的话可能出现 BUG,如:出现异常错误退出,清空数据库操作没能执行等

最终方案

使用链栈来做,每移动一次就将移动的棋子的坐标、移动后棋子的坐标、是否击杀棋子等数据添加到栈中

不足之处

从逻辑上看理论上是不能无限悔棋的,但是由于设计原因,如果将步数清空可能导致性能不高(毕竟多了几个判断和移动数据),并且步数的临界值并不好取,所以就保留原状,还是使用链栈而不是队列

关于 PVE 模式的机器走法

初始方案

使用数据库记录棋谱,在数据库中查询下一步该如何走,但是首先是棋谱的完整性,不能保证每一步都能在棋谱中找到对应的步骤,其次就是数据录入太过繁琐,再者每一步的水平都不一样,不符合实际情况

最终方案

采用二叉博弈树,使用剪枝算法优化,每次都动态计算下一步怎么走,根据难度级别调整二叉博弈树的高度

不足之处

无法控制时间,当电脑达到普通人平均水平(差不多高度为 5 左右),每一步的计算都需要数秒之多,更别说提高难度了

About

面对对象程序设计课程设计作业,使用人机博弈剪枝算法生成 AI 行为树

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published