上次准备用 AIsteroids 和 0.A.D 平台去学习游戏中的人工智能,现在换成 Clashjs。 AIsteroids 和 0.A.D 作模拟平台碰到了一个严重问题:1)AIsteroids 平台太简单了,只要让飞机不停右转同时发射子弹,就能很大概率赢得胜利;0.A.D 则太复杂了,复杂的即时策略游戏 AI 不适合初学者学习,陷入特定游戏的细节也不符合我们学习的本意。
学习会有反复和曲折,我们需要拥抱变化。因此,我在网上搜寻,找到了一个新平台来实践我们学习的知识。
Clashjs 是我在 GitHub 上找到开源项目。从下图可以看出来,Clashjs 也是一个飞机对战游戏。
Clashjs 比 AIsteroids 复杂。在 Clashjs 游戏中,有多台飞机参与战斗,最后只有一家获胜。并且参与战斗的飞机必须先吃到红色的镭射包,才能发射镭射打击敌人。这两点让 AI 设计者需要考虑更精细的策略才能取胜。
对一款模拟平台,我们要做的第一件事就是把它启动起来。启动 Clashjs 很简单。
1)安装 node 和 npm;
2) 把 Clashjs 项目从 Github 上克隆下来;
3) 进入 Clashjs 项目运行 npm install && npm run dev;
4) 在浏览器地址栏输入 http://127.0.0.1:8080
项目地址。值得注意的是,如果您不是在本地运行 Clashjs,在您输入 npm install && npm run dev 之前,您需要 package.json 中的 “webpack-dev-server –progress –profile –colors –hot” 语句中加入 “–host 0.0.0.0” 从而允许通过 IP 访问。如果您对 Docker 了解,也可以下载我做的镜像 /lietal/game_ai,配置好的 clashjs 放在主目录下。
模拟平台运行起来之后,我们要做的第二件事就是加入自己的 Bot。您可以在
clash_home/src/Players.js 引入,重新运行 npm run dev。这样就把自己的 Bot 加入模拟平台啦,是不是很方便。
当然了编写 Bot 的时候,我们需要遵守一定的规范。Bot 写出了如下所示,其中最关键的就是 ai 函数。这个 ai 函数输入玩家信息、敌人信息和游戏信息,输出要采取的动作。
{
info: {
name: 'javierbyte',
style: 2 // one of the 6 styles (0 to 5)
},
ai: function(playerState, enemiesStates, gameEnvironment) {
// think...
return 'move';//
}
}
玩家信息都用 PlayerState 表示,敌人信息则用 PlayerState 的数组表示。游戏信息则用 GameEnvironment 表示。
PlayerState:
{
position: `[<number>, <number>]`,
direction: `<string>`, // One of 'north', 'east', 'south' or 'west'
ammo: `<number>`,
isAlive: `<bool>`
}
GameEnvironment:
{
gridSize: [<number>, <number>],
ammoPosition: <array of [<number>, <number>] arrays>
}
输出的动作一共有 6 个。其中四个是 north、east、south 和 west,表示转向的方向。另两个则是 shoot 表示射击和 move 表示前景。
游戏智能系列文章会以 Clashjs 为平台介绍游戏智能算法,比如有限状态机和行为树。之前选用的两个游戏平台 AIsteroids 和 0.A.D,一个太简单一个太复杂,重新选择 Clashjs 作为模拟平台。学习过程出现了曲折和反复,只能拥抱变化~