CODE BATTLER で俺のコードと勝負だ!

2025年春の合宿中のモブプロでガッとゲームを作りました!

https://code-battler.heartrails.com/

『CODE BATTLER』は、JavaScript のコード同士で対戦する戦略バトルゲームです。2人のプレイヤーがそれぞれ3体のロボットを操り、9×9のマス目フィールドで戦います。

JavaScript の初心者でも楽しめるように、ルールはシンプルに設計されています。また、AIによる支援を受けやすいように MCP サーバをご用意しておりますので、プログラミングをこれから始めてみたい、という方もぜひ挑戦してみてください。

本記事では、ゲームをプレイする観点からの、ヒントや戦略を紹介します。 内部実装についての技術紹介は、別途記事がありますので、ご興味ある方はそちらもどうぞ。

https://zenn.dev/heartrails/articles/6915c0c2c2cb3d

ルール

プレイヤーは、 Javascript 関数 planActions を実装します。コードはゲームの進行中には修正できません。敵側も planActions のコードを内部に持っており、全く同じ条件でアクションプランを立ててきます。双方の planActions が繰り返し呼び出され、その戻り値をゲームエンジンが処理することでゲームが進行していきます。

function planActions({ bots }) {
  const plans = [];

  for (const bot of bots) {
    plans.push({
      botId: bot.botId,
      actions: [
        { type: "move", direction: "n" },
        { type: "move", direction: "s" },
      ],
    });
  }
  return plans;
}

これは、3体の味方botが上下にウロウロするコードです。

AI にコードを書かせてみよう

MCP をセットアップする

CODE BATTLER はリモートMCP サーバをご用意しております。お手元に MCP 対応のAIがあれば、設定をすることでスムーズに CODE BATTLER を楽しむことができます。2種のリモートトランスポートに対応済みです。

MCP の接続に成功すると以下の機能が使えるようになります。

  • instructions CODE BATTLER のルール、サンプルコード等、実装に必要な知識をまとめて取得できます。

  • upload_code 実装したコードを CODE BATTLER にアップロードします。コードに問題がなければ URL が返却されます。ブラウザでその URL を開くと、実行結果を確認できます。

  • get_code CODE BATTLER で公開されているコードを取得することができます。

MCP の設定を完了後、 コードバトラーを始めたい とAIに指示してみてください。 "instructions" へのアクセスが発生すれば成功です!

MCP を使わずに始める

MCP のセットアップがうまくいかない場合は、 https://code-battler.heartrails.com/llm.txt をプロンプトとして利用してください。 CODE BATTLERのトップページ からも取得可能です。

作戦の立て方

敵1体を3体で追う

3体の味方それぞれが最寄りの敵を攻撃するより、敵3体のうちの1体に目標を定め、囲んで攻撃する方が有効です。

1体をオトリにして残り2体で塗り広げる

1体を狙い撃ちしてくる敵に対してはこの作戦が有効です。角に追い詰められても、自チームの陣地であれば追ってくる敵の2倍の速さで移動できるので逃げ切りも可能です。

ヒット&アウェイ

敵チームに塗られたセルに第一アクションで移動した場合、そのbotの第二アクションは無効となります。第二アクションで敵陣に踏み込んだ場合はペナルティはありません。この特性を活かした妨害や読み合いも戦略の重要な要素となります。

bot は1ラウンドに2アクションを予約できます。隣接したセルに敵botがいた場合、

  • 1アクション目で攻撃 (敵の方向へ move)
  • 2アクション目で退避 (empty cell へ move)

するのがおすすめです。敵が追ってきた場合、一歩目で青の床を踏むと攻撃が出来ません (move がキャンセルされます)

相手が単純に敵に向かって突進するアルゴリズムになっている場合は、この作戦を使うことでノーダメージで一方的に攻撃し続けることができます。挟み撃ちには注意!

部品を作って組み立てる

シンプルな作戦であればAIに指示を出せば丸ごと実装してくれますが、作戦が複雑になると指示通りのコードにならなくなってきます。 そんな時は - 「最寄りの敵を探す関数を作って」 - 「座標 (x,y) まで壁を避けて移動するルートを direction の配列で返す関数を作って」 のように指示することで問題を分割し、それらを使うような作戦を指示するとより高度な作戦を実行できます。

ルールの詳細

以降の記述は、 MCP から提供する instructions には含まれていません。この記事を読んだ方(と、詳細に挙動を分析した方)だけのボーナス情報です。

bot のパラメータは同じではない

実は、味方の3体の bot は attack の値が左から順に 2,3,4 とバラけています。 armor 値は全 bot とも 12 なので、攻撃回数に換算すると「6回、4回、3回」となります。いちばん右の blue3 を攻撃の主力とし、オトリを使う作戦では blue1 をオトリにするのがおすすめです。ただし、行動順は blue1 が早く、 blue3 が遅くなっています。 attackspeedplanActions に渡される bots に入っていますので、以下のようにして確認できます。 js function planActions({ bots }) { console.log(bots) // ... }

results の詳細

planActions に渡される results には、直前のラウンドの結果が入っています。 例えば以下のようにすると、「攻撃された」ことを検知できます。

function planActions({ bots, field, results, team }) {
  const plans = [];

  for (const bot of bots) {
    if(results.find((x)=> x.botId == bot.botId && x.type === "damaged")) {
      // 攻撃されたので逃げる!
    }
// ...

move_failed action_cancelled attack_success はいずれも「予定通りに移動できなかった」ことを意味します。フォーメーションを組むなど、移動の成否が重要な作戦ではこれらの result をチェックしましょう。

おわりに

もし「CODE BATTLER」に少しでも興味を持っていただけたら、ぜひ一度遊んでみてください。

https://code-battler.heartrails.com/