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が上下にウロウロするコードです。
CODE BATTLER はリモートMCP サーバをご用意しております。お手元に MCP 対応のAIがあれば、設定をすることでスムーズに CODE BATTLER を楽しむことができます。2種のリモートトランスポートに対応済みです。
https://code-battler.heartrails.com/mcp Streamable HTTP
claude-code mcp add --transport http code-battler https://code-battler.heartrails.com/mcp
MCP の接続に成功すると以下の機能が使えるようになります。
instructions CODE BATTLER のルール、サンプルコード等、実装に必要な知識をまとめて取得できます。
upload_code 実装したコードを CODE BATTLER にアップロードします。コードに問題がなければ URL が返却されます。ブラウザでその URL を開くと、実行結果を確認できます。
get_code CODE BATTLER で公開されているコードを取得することができます。
MCP の設定を完了後、 コードバトラーを始めたい
とAIに指示してみてください。 "instructions" へのアクセスが発生すれば成功です!
MCP のセットアップがうまくいかない場合は、 https://code-battler.heartrails.com/llm.txt をプロンプトとして利用してください。 CODE BATTLERのトップページ からも取得可能です。
3体の味方それぞれが最寄りの敵を攻撃するより、敵3体のうちの1体に目標を定め、囲んで攻撃する方が有効です。
1体を狙い撃ちしてくる敵に対してはこの作戦が有効です。角に追い詰められても、自チームの陣地であれば追ってくる敵の2倍の速さで移動できるので逃げ切りも可能です。
敵チームに塗られたセルに第一アクションで移動した場合、そのbotの第二アクションは無効となります。第二アクションで敵陣に踏み込んだ場合はペナルティはありません。この特性を活かした妨害や読み合いも戦略の重要な要素となります。
bot は1ラウンドに2アクションを予約できます。隣接したセルに敵botがいた場合、
するのがおすすめです。敵が追ってきた場合、一歩目で青の床を踏むと攻撃が出来ません (move がキャンセルされます)
相手が単純に敵に向かって突進するアルゴリズムになっている場合は、この作戦を使うことでノーダメージで一方的に攻撃し続けることができます。挟み撃ちには注意!
シンプルな作戦であればAIに指示を出せば丸ごと実装してくれますが、作戦が複雑になると指示通りのコードにならなくなってきます。 そんな時は - 「最寄りの敵を探す関数を作って」 - 「座標 (x,y) まで壁を避けて移動するルートを direction の配列で返す関数を作って」 のように指示することで問題を分割し、それらを使うような作戦を指示するとより高度な作戦を実行できます。
以降の記述は、 MCP から提供する instructions には含まれていません。この記事を読んだ方(と、詳細に挙動を分析した方)だけのボーナス情報です。
実は、味方の3体の bot は attack
の値が左から順に 2,3,4
とバラけています。 armor 値は全 bot とも 12 なので、攻撃回数に換算すると「6回、4回、3回」となります。いちばん右の blue3
を攻撃の主力とし、オトリを使う作戦では blue1
をオトリにするのがおすすめです。ただし、行動順は blue1
が早く、 blue3
が遅くなっています。
attack
と speed
は planActions
に渡される bots
に入っていますので、以下のようにして確認できます。
js
function planActions({ bots }) {
console.log(bots)
// ...
}
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」に少しでも興味を持っていただけたら、ぜひ一度遊んでみてください。
ハートレイルズは新規事業開発のエキスパートです。詳しくは コーポレートサイト をご覧ください。