为东方风格弹幕游戏设计 AI Agent
· 技术 · Python / PyTorch / Reinforcement Learning / DQN / Q-Learning
我给之前做的东方风格游戏模拟加入了避弹算法和一个简单的 Q-learning 控制器。
为什么不用纯强化学习
完整状态空间太大,简单 Q-learning 无法处理。我也尝试过 Dueling DQN,把周围子弹、敌人和自机位置作为输入,但模型规模太大,训练时间也远超这个项目能接受的范围。
缩小状态空间
控制器只考虑三类信息:
- 附近子弹的威胁;
- 敌人的位置和血量;
- 自机位置。
游戏中既有直线弹幕,也有按复杂函数运动的弹幕。直接把轨迹规则告诉控制器并不公平,因此威胁预测统一假设子弹沿直线继续移动,实际游戏中的子弹仍按原轨迹运行。
我把自机周围划成九个区域。在固定范围内,例如 500 像素,检查可能进入各区域的子弹,并根据速度和距离估计命中时间,换算成威胁权重。控制器优先选择威胁最低的区域。
当多个方向都安全时,它会靠近优先级最高的敌人,并持续攻击直到目标被击破。屏幕边缘会附加惩罚,理想活动区域位于水平中间、纵向约 70% 的位置。只有当多个选项的总权重接近时,才由 Q-learning 做最后决定。
卡在角落的问题
弹幕密集时,第一版会卡在角落,因为屏幕外的区域看起来没有子弹。解决办法是给边缘和角落设置很高的威胁值,越靠近边界,惩罚增长越快。
另一个问题是,安全路线有时只差几像素,控制器却不会选择。后来加入更大的辅助观察区域,按方向统计弹幕密度:先避开眼前的子弹,再从可行方向中选择更空的路线。