皇室战争
本人闲暇时也会玩一些游戏,其中就有supercell开发的clash royale
最近,我开始尝试做一个能够自主游玩《皇室战争》的 AI 项目。
项目暂时叫作 RanchoCR。我也考虑过类似 KataCR 的名字,因为它在定位上确实受到 KataGo 的启发:不是为游戏编写一套固定脚本,而是尝试构建一个能够理解局面、评估决策,并通过训练逐步变强的智能体。
不过,这个项目和围棋 AI 有一个很明显的区别。
围棋是一个规则完全明确、状态完全可见、行动空间离散的回合制游戏;《皇室战争》则是一个实时、部分可观测、多单位并行行动的策略游戏。玩家不仅要决定“下一步做什么”,还要决定“什么时候做”“放在哪里”“是否继续等待”。
这让它成为了一个很有意思的 AI 问题。
为什么选择《皇室战争》
表面上看,《皇室战争》只是一个操作相对简单的手游。
玩家拥有八张卡牌,每次从当前四张手牌中选择一张,将其部署在竞技场中的某个位置。单位随后自动移动和攻击,最终目标是在规定时间内摧毁对方的皇家塔。
但真正进入游戏以后,会发现它包含了很多复杂因素:
- 双方的圣水会随时间恢复;
- 手牌按照特定顺序循环;
- 玩家无法直接看到对方的全部手牌;
- 不同卡牌之间存在复杂的克制和配合关系;
- 同一张卡牌放置位置不同,结果可能完全不同;
- 玩家需要同时考虑进攻、防守、节奏和资源交换;
- 当前决策的影响可能在十几秒后才真正体现出来。
因此,一次出牌并不是孤立的动作。
AI 必须根据当前场面,推测对方可能拥有的卡牌,判断双方的圣水差,预测场上单位接下来的运动,并评估不同决策对未来局面的影响。
从这个角度看,《皇室战争》可以被视为一个小型的实时战略决策环境。
我想做的不是一个脚本
最简单的游戏自动化方案,是提前写好大量规则:
对方出野猪骑士,就在某个位置放建筑。 对方沉底放大型单位,就去另一路进攻。 圣水达到十点,就按照预设顺序出牌。
这种系统可能在特定卡组和特定环境中有效,但它并没有真正理解局面。一旦版本变化、卡组改变,或者遇到规则没有覆盖的情况,系统就很容易失效。
我更感兴趣的问题是:
能不能让模型从游戏状态中学习决策,而不是由人类写出全部决策规则?
理想情况下,系统接收到的应该是普通玩家能够获得的信息,例如游戏画面、当前手牌、圣水数量、场上单位和剩余时间,然后输出一项合法操作:
- 暂时不行动;
- 选择一张卡牌;
- 决定部署的位置和时机。
它不应该依赖读取游戏内存、提前获知对方手牌,或者使用普通玩家无法获得的信息。
我希望研究的是一个在相同信息条件下进行决策的游戏智能体,而不是一个依靠信息优势运行的外挂。
这个问题可以怎样建模
从强化学习的角度看,一局《皇室战争》可以被描述为一个连续进行的决策过程。
在每个时刻,智能体需要获得对当前局面的表示:
[ s_t = \text{当前手牌、圣水、场上单位、防御塔状态、时间和历史信息} ]
随后选择一个动作:
[ a_t = \text{卡牌、部署位置、部署时间} ]
环境根据双方行动继续演化,最终产生胜利、失败或平局。
但这里存在几个困难。
首先,游戏并不是完全可观测的。AI 无法直接看到对方尚未打出的卡牌,也无法准确知道对方当前拥有多少圣水。因此,模型不能只处理单帧画面,还需要利用历史信息维护对对手状态的估计。
其次,动作空间非常大。一张卡牌可以被放置在竞技场中的许多位置,而且“不出牌”本身也是一种重要决策。很多时候,错误并不是出了错误的牌,而是出牌过早,浪费了圣水或者暴露了自己的防守。
再次,奖励十分稀疏。一局游戏持续数分钟,但最直接的训练信号通常只有最后的胜负。模型需要判断,究竟是几十秒前的哪一个决策导致了当前结果。
这意味着项目可能同时涉及:
- 计算机视觉;
- 时序状态建模;
- 对手状态估计;
- 行为克隆;
- 强化学习;
- 自博弈;
- 搜索与局面评估;
- 实时智能体系统。
第一阶段:先让系统看懂游戏
在训练决策模型之前,首先需要让程序把游戏画面转换成结构化状态。
例如:
- 当前四张手牌分别是什么;
- 玩家拥有多少圣水;
- 双方防御塔还剩多少生命值;
- 场上出现了哪些单位;
- 每个单位位于什么位置;
- 单位属于哪一方;
- 当前处于正常时间还是加时阶段。
这一步看起来只是视觉识别,但它决定了后续系统能够获得多可靠的信息。
最初版本不必追求理解游戏中的全部细节。可以先固定分辨率、卡组和竞技场,只处理有限数量的卡牌,逐步建立一个能够稳定运行的最小环境。
相比一开始就追求覆盖完整游戏,我更希望先跑通一个闭环:
读取画面 → 提取状态 → 模型决策 → 执行动作 → 记录结果。
只要这个闭环能够稳定运行,后续的识别模型、决策模型和训练方法都可以逐步替换。
第二阶段:从人类对局中学习
直接通过强化学习从零探索,成本可能非常高。
随机智能体甚至很难完成基本的出牌和防守,更不用说理解卡牌之间的组合关系。因此,一个更现实的起点是收集人类玩家的对局数据,进行行为克隆。
模型观察某个时刻的局面,并学习人类玩家接下来选择的卡牌、位置和出牌时间。
这一阶段的目标不是立刻超过人类,而是让智能体先获得最基础的游戏常识:
- 不要让圣水长期溢出;
- 对方进攻时需要进行防守;
- 不要把远程单位放到敌方单位脸上;
- 根据场上威胁选择合适的卡牌;
- 理解常见卡组的基本进攻节奏。
行为克隆也存在明显局限。模型只能模仿数据中的行为,可能同时学到人类玩家的错误,而且在进入训练数据没有覆盖的局面后,误差会不断积累。
但它可以为后续的强化学习提供一个远好于随机策略的起点。
第三阶段:建立可训练的简化环境
真正困难的部分,可能不是模型结构,而是训练环境。
如果每一次训练都必须在真实游戏客户端中进行,那么采样速度会受到动画、网络、匹配机制和游戏时长的限制。训练数百万局几乎不可行。
因此,长期来看,可能需要构建一个简化的《皇室战争》模拟环境。
这个环境不必在最初阶段完整复现游戏,但至少需要描述:
- 圣水恢复;
- 卡牌轮转;
- 单位生成;
- 移动和索敌;
- 攻击距离与攻击间隔;
- 伤害和生命值;
- 建筑与防御塔机制;
- 胜负判断。
有了可以高速运行的环境,才可能进行大规模自博弈、策略搜索和强化学习实验。
当然,模拟环境与真实游戏之间一定存在差异。因此,最终还需要解决从模拟环境迁移到真实画面环境的问题。
第四阶段:自博弈与持续进化
项目更长期的目标,是让不同版本的智能体相互对战。
每个版本都可以和历史策略进行比赛,根据胜率进入新的训练迭代。模型不再只模仿固定的人类数据,而是通过对抗不断发现新的策略。
理想情况下,整个训练过程会形成一个循环:
[ \text{自我对局} \rightarrow \text{收集数据} \rightarrow \text{更新策略} \rightarrow \text{评估新模型} \rightarrow \text{进入下一轮对局} ]
这也是我从 KataGo 等项目中最想借鉴的部分。
真正值得研究的,不只是某一个最终模型,而是如何建立一套能够自动产生数据、评估策略并持续迭代的训练系统。
先限制问题,而不是无限扩大目标
完整解决《皇室战争》是一个很大的目标。
游戏中存在上百张卡牌、不同等级、不同卡组和持续变化的版本环境。如果一开始就试图解决全部问题,项目很可能长期停留在基础设施建设阶段。
因此,初期应该主动限制问题:
- 固定一套或少量卡组;
- 固定卡牌和等级;
- 暂时忽略部分特殊机制;
- 使用统一分辨率和设备环境;
- 先完成单局决策闭环;
- 先让 AI 达到“会玩”,再讨论“玩得强”。
最小可行目标不是击败职业玩家,而是让一个不依赖硬编码出牌顺序的智能体,能够独立完成一局游戏,并且表现显著优于随机策略。
这已经足以验证整个系统是否成立。
关于项目名称
目前我还没有完全确定项目名称。
RanchoCR 更像一个个人项目名称,能够和我的个人主页及其他项目保持一致;KataCR 则更容易让人联想到 KataGo,直接表达项目的自博弈和游戏 AI 属性。
不过,名字并不是当前最重要的问题。
一个项目最终是否能够被记住,取决于它是否真正做出了结果。与其花太多时间寻找一个完美名称,不如先完成第一个能够识别画面、作出决策并实际出牌的版本。
在那之后,名字自然会逐渐确定下来。
接下来准备做什么
目前,这个项目仍然处于早期探索阶段。
接下来最重要的工作,不是直接训练一个巨大的模型,而是逐步明确和验证下面几个问题:
- 如何稳定获取并记录对局数据;
- 如何将游戏画面转化为结构化状态;
- 如何表示卡牌、位置和时间组成的动作空间;
- 是否能够用行为克隆训练出最基础的策略;
- 如何建立一个足够快的简化训练环境;
- 如何客观评估不同版本智能体的强弱。
我会把整个项目拆成一系列尽可能小的实验,每次只验证一个关键环节。
它最终可能成为一个真正有竞争力的游戏 AI,也可能在某个阶段证明现有方案并不可行。但无论结果如何,这个项目都会涉及从视觉感知、模型训练到智能体工程部署的一整套流程。
对我来说,这正是它最有价值的地方。
我并不只是想让程序自动打一局《皇室战争》。
我想知道的是:
在一个实时、部分可观测并且存在复杂长期策略的环境中,我们究竟应该怎样构建一个能够感知、判断、行动并通过对抗持续变强的智能体?