游戏智能系列之二:再次进行准备

      上次准备用 AIsteroids 和 0.A.D 平台去学习游戏中的人工智能,现在换成 Clashjs。 AIsteroids 和 0.A.D 作模拟平台碰到了一个严重问题:1)AIsteroids 平台太简单了,只要让飞机不停右转同时发射子弹,就能很大概率赢得胜利;0.A.D 则太复杂了,复杂的即时策略游戏 AI 不适合初学者学习,陷入特定游戏的细节也不符合我们学习的本意。

aisteroids_win

学习会有反复和曲折,我们需要拥抱变化。因此,我在网上搜寻,找到了一个新平台来实践我们学习的知识。

1. Clashjs 游戏

      Clashjs 是我在 GitHub 上找到开源项目。从下图可以看出来,Clashjs 也是一个飞机对战游戏。

clashjs

      Clashjs 比 AIsteroids 复杂。在 Clashjs 游戏中,有多台飞机参与战斗,最后只有一家获胜。并且参与战斗的飞机必须先吃到红色的镭射包,才能发射镭射打击敌人。这两点让 AI 设计者需要考虑更精细的策略才能取胜。

2. Clashjs 游戏简明教程

      对一款模拟平台,我们要做的第一件事就是把它启动起来。启动 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/you.js 写入自己的算法,然后在 $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 表示前景。

3. 总结

      游戏智能系列文章会以 Clashjs 为平台介绍游戏智能算法,比如有限状态机和行为树。之前选用的两个游戏平台 AIsteroids 和 0.A.D,一个太简单一个太复杂,重新选择 Clashjs 作为模拟平台。学习过程出现了曲折和反复,只能拥抱变化~

      欢迎关注我的公众号,每周日的更新就会有提醒哦~

weixin_saomiao

      

游戏人工智能系列系列文章

此条目发表在游戏人工智能分类目录,贴了, , 标签。将固定链接加入收藏夹。