マガジン

敵のAI行動パターンをプロンプトで設計する方法

遊びをつくる

執筆にClaudeを使用しています。

同じ形の三つの迷路試作品を、砂時計とノートを添えて比較する卓上写真風イメージ
記事のテーマをもとに制作したAI生成の写真風イメージ。

ゲームの敵キャラクターは、行動が単調だとすぐに飽きられます。かといって複雑すぎるロジックをゼロから書こうとすると、コードよりも設計の言語化で詰まることが多いです。AIツールにプロンプトで依頼する場合、「敵を強くして」という指示では期待通りのコードが返ってきません。敵の行動パターンは、まず言葉で精密に定義してから実装に落とすという手順が必要です。 この記事では、敵AIの行動パターンをプロンプトで設計するための考え方と具体的な手順を説明します。シューティング・アクション・パズルなどジャンルを問わず使える汎用的な枠組みを中心に、失敗しやすい指示の書き方も合わせて解説します。

この記事の目次
  1. 「行動パターン」を言語化する前に決めること
  2. 状態遷移をプロンプトで記述する方法
  3. 失敗しやすい指示のパターンと修正方法
  4. 行動パターンに「個性」を加えるプロンプトの工夫
  5. 実装後の調整をプロンプトで進める方法
  6. 次の行動

「行動パターン」を言語化する前に決めること

AIツールへの指示を書く前に、設計者自身が三つの軸を整理しておく必要があります。

① 敵が何を「知覚」するか。 プレイヤーの位置、距離、体力、向き、攻撃中かどうか——どの情報を敵が参照できるかを先に決めます。知覚できない情報を行動の条件に含めてもコードには書けません。

② 状態の種類と遷移条件。 敵の行動を「巡回」「追跡」「攻撃」「退避」のような状態に分け、どの条件でどの状態に移るかを決めます。この状態遷移の設計こそが行動パターンの核です。

③ 理不尽にならない強さの上限。 反応速度・攻撃頻度・予測精度に上限を設けないと、プレイヤーが勝てない敵になります。「プレイヤーが対処できる隙間」を先に言葉で決めておくことが、後のプロンプト精度を上げます。

この三軸をメモに書いてからプロンプトを起こすと、AIツールが返すコードの品質が大きく変わります。

状態遷移をプロンプトで記述する方法

行動パターンをAIに伝えるもっとも確実な方法は、状態遷移を箇条書きで書き下すことです。自然文だけで渡すと、遷移条件の解釈が曖昧になりやすいです。

次のような形式が実用的です。

敵キャラクター「ガード」の行動パターンを以下の仕様でJavaScriptとして実装してください。

【状態一覧】
- PATROL(巡回):初期状態。決められたルートを往復する。
- ALERT(警戒):プレイヤーをx=300以内で発見した状態。移動を止め、プレイヤーの方向を向く。
- CHASE(追跡):警戒状態から1秒後に移行。プレイヤーに向かって移動する。速度は巡回の1.5倍。
- ATTACK(攻撃):プレイヤーとの距離がx=80以下になったら移行。0.8秒に1回ダメージ判定を行う。
- RETREAT(退避):自分のHPが30%以下になったら移行。プレイヤーから遠ざかり、距離がx=400以上になったらPATROLに戻る。

【遷移条件まとめ】
PATROL → ALERT:プレイヤーとの距離 ≤ 300
ALERT → CHASE:ALERT状態で1秒経過
CHASE → ATTACK:プレイヤーとの距離 ≤ 80
ATTACK → CHASE:プレイヤーとの距離 > 80
いずれの状態 → RETREAT:自分のHP ≤ 30%
RETREAT → PATROL:プレイヤーとの距離 ≥ 400

【知覚できる情報】
- playerX, playerY(プレイヤーの現在位置)
- playerHP(プレイヤーの体力)
- selfHP(自分の体力)

この書き方の利点は、AIツールが状態をif文やswitch文として直接コードに変換しやすい点です。「賢い敵にしてください」という曖昧な指示と比べると、返ってくるコードの構造が安定します。

失敗しやすい指示のパターンと修正方法

「ランダムに動く」だけでは単調になる

「ランダム性を持たせてください」という指示は、ただのランダム移動になることが多いです。意図したいのは「行動の予測をある程度つきにくくする」ことのはずです。その場合は次のように言い換えます。

  • ×「ランダムに移動してください」
  • ○「攻撃のタイミングに±0.3秒のばらつきを持たせ、攻撃後に左右どちらかにランダムで30ピクセルずらす動きを加えてください」

数値とタイミングで具体化することで、実装と調整が両方しやすくなります。

「プレイヤーを追いかける」だけだと壁に詰まる

単純な追跡ロジックを指示すると、壁や障害物に引っかかったまま動けなくなるケースがよく起きます。地形のある環境では「壁に x フレーム以上ぶつかり続けたら追跡を一時中断し、左右にランダムで移動して回避を試みる」という逃げロジックを合わせて指示する必要があります。これを初期プロンプトに含めないと、後から追加で修正指示を出すことになり、コードの整合性が崩れやすくなります。

難易度切り替えを後から追加するのは手間がかかる

難易度別の強さ変更を後から指示すると、定数がコードの各所に散在してしまうことがあります。最初のプロンプトに「難易度をeasy / normal / hardで切り替えられるよう、速度・反応時間・攻撃頻度の定数を一か所にまとめてください」と入れておくと、後の調整コストが大幅に下がります。

行動パターンに「個性」を加えるプロンプトの工夫

状態遷移だけでは敵キャラクターの個性が出にくく、どの敵も似た動きになりがちです。個性を出すためには、特定の状態での「癖」を言葉で加えます。

たとえば「遠距離タイプ」の敵に個性を与えたい場合、次のような指示が有効です。

  • プレイヤーとの距離がx=200〜300の範囲を「適正距離」と定義し、それを維持するよう移動する(近づきすぎたら下がり、遠ざかりすぎたら近づく)
  • 攻撃後に必ず一歩引く動作を入れる
  • プレイヤーが静止したら攻撃をためらい、1秒後に強攻撃に切り替える

このように「どんな状況でどんな判断をするか」をシナリオとして書くと、AIツールはロジックに翻訳しやすくなります。また、プレイヤーが「敵の癖を読む」楽しさが生まれ、戦闘の読み合いが深くなります。

複数種類の敵を設計する場合は、状態遷移のテンプレートを共通化してから、個性の部分だけ差し替える指示にするとコードの重複が減ります。「前の敵のコードをベースに、ATTACK状態の動きだけ次の仕様に変えてください」という形の指示が整理しやすいです。

実装後の調整をプロンプトで進める方法

コードができてからの「強すぎる」「弱すぎる」という調整も、プロンプトの書き方次第でスムーズになります。ただ「もう少し弱くして」と伝えるのではなく、観察した事実を言葉にして渡すことが重要です。

  • ×「もう少し弱くしてください」
  • ○「ATTACK状態での攻撃頻度が高すぎて回避が不可能です。攻撃間隔を現在の0.5秒から1.2秒に変更し、攻撃前の予備動作として0.3秒の硬直を加えてください」

「どの状態の、どのパラメーターが、どう問題か」を数値で示すことで、修正箇所が特定でき、意図しない変更が発生しにくくなります。

また、デバッグ用に現在の状態を画面に表示する処理を最初から組み込んでおくと、どの状態で問題が起きているかを目視で確認でき、調整プロンプトの精度が上がります。「現在の敵の状態(PATROL / ALERT / CHASEなど)を画面左上にデバッグ表示する処理を追加してください」と最初の実装時に入れておくことをお勧めします。

次の行動

まず自分が作りたい敵の「状態一覧」と「遷移条件」を紙かメモアプリに書き出し、本記事の書式に当てはめてプロンプトを作ってみてください。完成したゲームはHTMLやZIPとしてアソバース(https://aso-verse.com)に投稿・公開できますので、設計から完成まで一続きの流れで試してみてください。