マガジン

AIにゲームのルールを数式で説明させると設計が早くなる話

遊びをつくる

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

定番の盤面に一つだけ赤い通り道を加え、選択が変わる様子を描いた版画風イラスト。
記事のテーマをもとに制作したAI生成イラスト。

「プレイヤーが敵に当たったらライフを減らす」と書いてAIに設計を頼むと、返ってくるコードは曖昧な部分を補完した「AIの解釈」です。一方、同じルールを HP_new = HP_old − damage × (1 − guard_rate) のように書くと、AIは補完する余地を失い、式の通りに実装します。この差が、仕様のズレを防ぐ最短の手段です。 数式といっても高校数学の知識は必要ありません。必要なのは「変数名」「演算子」「条件分岐の記号」だけで、むしろゲームロジックを言葉で書くより短く済む場面がほとんどです。以下では、なぜ数式がAIへの指示として有効なのかを整理したうえで、実際にどう書けばよいかを具体的に示します。

この記事の目次
  1. なぜ「自然言語だけ」だとズレが生まれるのか
  2. 数式で書くべき4つの場面
  3. 実際のプロンプトの書き方
  4. 式を書く手順:ゲームルール→数式の変換練習
  5. 式の書き方でよくある失敗と対策
  6. 次の行動

なぜ「自然言語だけ」だとズレが生まれるのか

AIは自然言語の曖昧さを埋めるとき、学習データに含まれる「よくあるゲームの実装」を参照します。「ダメージを受けたらHPを減らす」という文だけでは、最小値を0にクランプするかどうか、浮動小数点か整数か、ガード中の扱いはどうか、といった詳細がすべて「AIの常識」で埋められます。自分の意図と一致する保証はどこにもありません。

数式で書くと、AIが補完できる部分がほぼゼロになります。式に書いていない条件はAIも推測できないため、「ここはどう扱いますか」と聞き返すか、素直に式の通りだけ実装します。後者のほうが圧倒的に多く、結果として最初の1回で意図した挙動に近いコードが出てきます。

数式で書くべき4つの場面

すべてのルールを数式にする必要はありません。以下の場面では効果が高く、それ以外は自然言語で補足するほうがかえってバランスがよいです。

状態変化の計算

キャラクターのHP・スコア・速度など、値が変わるルールはすべて式で書けます。

  • ダメージ計算:HP = max(0, HP − (ATK − DEF × 0.5))
  • スコア加算:score += base_point × combo_multiplier
  • 加速:v(t+1) = v(t) × 0.95 + input × accel

max・min・floor・ceil などの関数はゲーム開発者なら馴染み深く、AIも正確に解釈します。

条件分岐の判定

「特定の条件のとき〜する」というルールは、自然言語だと「どの順序で判定するか」が曖昧になりがちです。

if combo >= 10 → multiplier = 3
else if combo >= 5 → multiplier = 2
else → multiplier = 1

このような擬似コードに近い記法でも、AIは優先順位を正確に読み取ります。「コンボが5以上または10以上のとき倍率を変える」という文よりも短く、誤解の余地もありません。

確率と乱数の扱い

「低確率でクリティカルが出る」という表現だと、確率の値も判定タイミングもAIが決めます。

  • critical = (rand() < crit_rate)
  • drop_item = (rand() < 0.05) のように書けば、確率値・真偽値として扱うことまで一度に伝わります。

時間・物理に絡む挙動

ジャンプの弧・弾の軌道・タイマーなど、フレームごとに値が変わる処理は特に式が有効です。y(t+1) = y(t) + vy(t) vy(t+1) = vy(t) − gravity のように書くと、AIはそのまま更新ループとして実装できます。

実際のプロンプトの書き方

プロンプトの構造は「ゲームの概要(自然言語)→ 変数の定義 → ルールの式 → 実装の要件(言語・フレームワーク)」の順が機能します。

変数の定義を先に書く

変数:
- HP : プレイヤーの体力(整数、初期値100、最小0)
- ATK : 攻撃力(整数)
- DEF : 防御力(整数)
- guard : ガード中かどうか(真偽値)

これを省略すると型・初期値・範囲をAIが決めてしまいます。変数定義はコメントとしてもコードに残るため、後の保守にも役立ちます。

ルールを式で列挙する

ルール:
1. ガードなしのダメージ:HP = max(0, HP − ATK)
2. ガードありのダメージ:HP = max(0, HP − floor(ATK × 0.5))
3. HP が 0 になったら game_over = true

箇条書きで番号を振ると、AIが「3番のルールだけ修正してください」という指示に確実に対応できます。番号なしだと修正時に特定が難しくなります。

曖昧な部分を意図的に残さない

floor か round か、0.5 か 0.3 か、といった細部を省いた式はほぼ意味がありません。決めきれない部分は「ここは未定なので DEF_RATE という定数にして後から調整できるようにしてください」と明示するほうが、AIが勝手に値を埋めるよりも安全です。

式を書く手順:ゲームルール→数式の変換練習

慣れないうちは次の3ステップで変換すると整理しやすいです。

  1. ルールを一文で書く 「連続でコインを取るとスコアが増えやすくなる」
  2. 変わる値と変わらない値を分ける 変わる値:score、combo。変わらない値:coin_base(コイン1枚の基本点)
  3. 変化の関係を式にする score += coin_base × (1 + combo × 0.1)、combo += 1(コイン取得時)、combo = 0(ミス時)

この3ステップを繰り返すと、自然言語で書いた仕様書が式の集合に変わります。式を並べた段階でゲーム全体のバランスがすでに見えるため、実装前に数値を調整できるという副次的なメリットもあります。

式の書き方でよくある失敗と対策

変数名が揺れる:プロンプトの中で HP・health・hitpoint が混在すると、AIは別の変数として扱うことがあります。定義した名前を最後まで一貫して使ってください。

単位を書かない:速度が「ピクセル/フレーム」なのか「ピクセル/秒」なのかで実装が変わります。単位は変数定義のコメントに含める習慣をつけると混乱が減ります。

式だけでなくコンテキストを省きすぎる:式は正確ですが、「なぜそうなのか」の背景をまったく書かないと、AIが最適化と称して式の構造を変えることがあります。「この式は変えずにそのまま実装してください」の一言を添えると安全です。

整数演算と浮動小数点演算を混在させる:floor(ATK × 0.5) のように明示しないと、言語によって結果が変わります。計算結果が整数であってほしい箇所には floor か int() を明記してください。

次の行動

手元にあるゲームの仕様書か、頭の中にあるルールを一つ選び、まず「変わる値」だけを書き出してみてください。変数が揃えば式に変換するのは難しくありません。完成した式の集合をプロンプトに貼って、AIに実装させたコードと以前の実装を比べると、この方法の効果が実感できます。式で設計したゲームはアソバースにHTMLまたはZIPで投稿できます。