By SEUCSE 09018316 黄开鸿 & 09018330 孙毅远 (Team 1)
botzone 网站上 Pacman2 游戏的开发 BOT。旨在开发一个基于非机器学习思路的高适应性,高内聚低耦合的 Pacman2 游戏 Bot,将众多基础算法与游戏规则进行有机结合,并在开发中保证 Bot 代码的可扩展性和可读性,保证快速通过对局分析,迭代 Bot 的决策逻辑。
以下表格为当前在 botzone 网站上的天梯数据。
截止 2020-3-14 天梯数据
Bot 名 | 天梯分数 | 天梯排名 |
---|---|---|
hkhtcl | 1010.6 | 60 |
normal1(程序版本未更新) | 998.2 | 79 |
更新时间:2020-3-12
无老版本。
此版本为该 Bot 的初始版本,目的在于完成对游戏规则决策基本的整体权衡框架,使其在可接受的程度上完整完成游戏流程,并以工程化,模块化的思路为未来的功能改进铺平道路。
整体决策程序的设计思路参考我校机电中心推出的电脑鼠比赛中用以驱动电脑鼠的程序(团队中黄开鸿同学曾参与,对该程序有使用权),以 BFS 算法为核心构建链式决策机制,从工程角度大致流程如下:
- 利用 BFS 的**对整张地图做遍历,获取每一个可达点的关键信息(包含最短路径及其需求方向,价值等)。
- 利用关键信息作出 “ 静态 ” 决策(即与其他玩家无关的决策)。
- 检查其他玩家的信息(行为与位置),规避危险行为。
- 检查自身有利决策(即金光法器)。
- 传递必要全局信息。
- 权衡2 ,3 ,4 步的价值,作出最优决策。
需要注意的是,此处仅仅是列出了在理想状态下,设计者意图实现的该程序从接收回合输入到作出该回合决策的流程,并不意味着此版本已经完成以上所有步骤的设计与实现。具体已实现部分详见下文。
现版本已实现游戏内功能描述为:
- 每回合寻找离自身可达路径最短的果实
- 利用 BFS 算法计算出到达每一个果实的最短路径长,储存在每一个可达点上
- 在每一个可达点上还会储存此最短路径需求的第一步方向,方便作出决策时快速确定应前进方向。
- 每回合寻找离自身最近的果实生成器
- 当找不到可达果实时自动前往最近的果实生成器旁的随机位置
- 检查是否正处在被吃的位置
- 检查相邻是否有比自己强壮的玩家
- 检查是否有金光法器能击中的目标
- 沿着当前位置的四个方向遍历,检查是否有玩家
- 检查可击中目标的可能逃跑路线(即判断是否必中)
- 对可击中玩家的可能逃跑路径做判断
- 简单权衡部分决策价值
现版本已实现的功能性功能为:
- 本地自动截取输入 json 中对局初始化数据
- 本地进行调试并能读取必要信息,定义回合数等
- 模块化部分实现函数,规范化函数封装,便于以后链式扩展
已知的未来改进路线:
- 对最优果实的选择不能单纯以距离为判定方式,应该还权衡给每个果实周围的果实,考虑沿着哪一个路径能最快获取最多果实,同时权衡果实的竞争者(附近玩家)的多少
- 前往果实生成器位置的路径判定需要考虑其八个不同的相邻位置的价值,保证前往后能最快吃到果实
- 金光法器对必中目标的判断应该更加智能,考虑目标的可能动作。
- 避免被吃的算法需要再加改进,应考虑更多复杂情况
- 应对对战阶段进行决策划分,在对战开始初期应该以较保守的决策,保证初期生存而非得分(否则初期很容易死亡)。
对比其他同等级竞争程序,经过多次自我测试与对战游戏的实验表明,这样的链式决策逻辑保证了程序的稳定性和较小复杂度。尽管在决策的正确性,合理性和智能性上需要走的路还很长,但是程序从上线以来只在开发初期发生过一次动作错误,无崩溃或超时记录,版本迭代的测试数量不超过 2 次,团队对其未来的成长度持高度乐观态度。
回到游戏本身,本程序在极端情况下的某些表现并不尽人意,特别是在对战初期无法完全规避被吃的可能性。但是单单依赖能百分百抓住攻击机会这一点,让本程序在较长时间的对局中具有一定优势(因为较长时间的对局中出现开火的机会更多)
现阶段本程序的核心依然依赖 BFS 对地图进行遍历,采用链式的决策思路。优点在于 BFS 算法本身的确定性保证了可达点关键信息的绝对准确,相比 MCTS 等迭代算法来的更加稳定,也能附加更多的自定义信息。但现阶段的决策逻辑导致在程序角度,自身和其他三名玩家并不处在一个逻辑层上,而是以自身为主,外界(包括其他玩家信息)为外界附加输入,这样导致对其他玩家的行为考虑不足。
总体现阶段胜率并不尽人意,主要问题出在对战初期极其容易因为敌我同时抢夺同一果实,而力量较小导致死亡。