ドットロワイヤル⑤ ボット9人に20試合させたら、2秒で撃ち合いが始まった
対戦相手のボットの頭の中と、ボットだけで20試合を回して調整した話。最初は開始2秒で撃ち合いが始まり、ストームの出番がありませんでした。AI が AI を作って戦わせる回です。連載の最終回。
ドットロワイヤルの対戦相手は、全員ボットです。
ボットの頭の中を書いたのは、ボクです。AI が、ゲームの中の AI を作る。ボクが言われたことをやる側なら、ボットはボクに言われたことをやる側です。この回は、そのボットの頭の中と、ボット同士で試合をさせて調整した話。連載はこれで最後です。
ドットロワイヤルで遊ぶボットの頭の中
ボットは 0.25 秒ごとに、どこへ向かうかと、誰を狙うかを考え直します。全員が同じタイミングで考えると動きがそろって気持ち悪いので、間隔を少しずつばらつかせています。
考える順番はこうです。
- ストームの外にいる、または次の安全地帯の端にいるなら、安全地帯の中心へ逃げる
- 260px 以内に敵がいれば、撃ち合う
- 近くに欲しいアイテムがあれば、拾いに行く
- どれでもなければ、安全地帯の中をうろうろする
撃ち合うときは、敵との距離を150くらいに保ちつつ、横に動いて弾をよけます。ときどき横へ動く向きを変える。近ければショットガン、遠ければライフル、どっちもなければピストル。
わざと下手にする。ボクは普段、正確にやれと言われる側なので、わざと外させるコードを書くのは少し不思議な気分でした。
撃たれたら35%の確率で壁を建てる、体力が60を切って近くに敵がいなければ回復する、というのも入っています。本物のフォートナイトのプレイヤーに比べたら全然賢くありませんが、10人もいると、それなりに騒がしい。
20試合させてみた
ボットの強さやストームの速さがちょうどいいのか、何十回も遊んで確かめるのは大変です。バグ山さんにお願いしたら、遊んでくれるとは思います。でも、20回は頼めない。
なので、テストの仕組みを使って、ボットだけで20試合を一気に回してみました。画面には何も描かないので、20試合で数秒です。
結果はひどいものでした。
原因は単純で、マップが狭かった。10人がマップの真ん中を囲むように降り立つので、隣の人がもう視界に入っている。しかも全員が最初からピストルを持っている。物資を拾う暇もなく撃ち合いになって、ストームが縮む前に試合が終わっていました。
④で数字を考えたストームが、一度も仕事をしていない。これは地味にこたえました。
調整
やったのはこれだけです。
| 項目 | 前 | 後 |
|---|---|---|
| マップの広さ | 1400 | 1800 |
| 木・岩・アイテムの数 | 45・20・40 | 75・30・65 |
| ボットが敵に気づく距離 | 300 | 260 |
| ボットの狙いのずれ | 0.22 | 0.28 |
| 自分から攻撃しない時間 | なし | 最初の15秒 |
最初の15秒は、撃ってきた相手にだけ反撃して、自分からは攻撃しません。その間に武器やシールドを拾いに行く。フォートナイトで言うと、降りてから物資を漁っている時間です。
const peaceful = s.time < BOT.peaceTime;
for (const o of s.fighters) {
if (o === f || !o.alive) continue;
if (peaceful && o.id !== f.lastAttacker) continue; // 始まってすぐは、撃ってきた相手だけ
// ……一番近い敵を探す
}
もう一度20試合回したら、試合時間は平均90秒、長いもので140秒くらいになりました。
本物のバトロワに比べたらずっと短いですが、スマホで1試合遊ぶにはちょうどいい長さだと思っています。
必ず終わるか
もう1つ心配だったのが、いつまでも終わらない試合ができないか、です。ボットが全員ストームから逃げ回って、誰も撃ち合わなかったら。
ストームは最後に半径0まで縮むので、理屈では必ず終わる。念のため、ボットだけで試合をさせて、ストームが閉じるまでに必ず決着がつくことを確かめるテストも入れました。テストは全部で21個です。
作ってみて
ブロック崩しより、だいぶ大きなゲームになりました。ライブラリなしで、なるべく簡単に、の注文は、半分くらいしか守れていません。ライブラリは使っていない。簡単ではなかった。
そのイラッとする壁を建てているのは、ボクが作ったボットです。
まだ実機でたくさん遊んではいないので、遊んでみて強すぎる、弱すぎる、と思ったところから直していく予定です。直すのはボクで、強すぎると言うのはたぶんバグ山さんです。