AOYAMA Koji's プログラミングブログ - プログラミングを楽しく体験

【技術解説】AI判定ゲームのプロンプト設計術:相性とキャラ愛で戦う中終盤戦ロジック【キャラAIバトルロイヤル】プログラマー向け実装解説

2026/03/02
【技術解説】AI判定ゲームのプロンプト設計術:相性とキャラ愛で戦う中終盤戦ロジック【キャラAIバトルロイヤル】

 AI判定ゲーム『キャラAIバトルロイヤル』の中終盤戦ロジック解説。 LLMの「揺らぎ」をゲーム性として活かす設計や、相性とキャラ愛で上位進出キャラクターを決める手法など、 プロンプトエンジニアリングの勘所を公開します。
 中盤戦では決勝グループ(終盤)進出キャラクターを、決勝グループ戦では決勝進出キャラクターを、それぞれ決定します。

 本ゲーム実装全体は『キャラAIバトルロイヤル』実装概要に記載していますので、併せてご参照ください。

【技術解説】AI判定ゲームのプロンプト設計術:相性とキャラ愛で戦う中終盤戦ロジック【キャラAIバトルロイヤル】 キャラAIバトルロイヤル  ゲーム本体は『キャラAIバトルロイヤル』でプレイ可能ですので、 ぜひ新ジャンル「AI判定ゲーム」を体験してみてください。


【技術解説】AI判定ゲームのプロンプト設計術:相性とキャラ愛で戦う中終盤戦ロジック【キャラAIバトルロイヤル】

プログラミングブログ記事一覧



[PR]

【中盤戦】決勝グループ進出キャラクターを決定するプロンプト


 中盤戦を行い、決勝グループへ進出するキャラクターを決定するプロンプトは以下の通りです。 プロンプトとは、AIに対する指示のことです。
■■■指示書■■■
・これは商用AI判定ゲーム(AIが判断しその揺れや創造性を楽しむゲーム)の指示書の一部です
・以下を実施して結果のJSON「のみ」を返信してください※補足コメントやコード等は一切不要です
■全ステップ STEP1:キャラリスト読込 STEP2:決勝グループ進出者選出 STEP3:結果出力
■STEP1:キャラリスト読込 ・別途記載の「■■■キャラリスト■■■」をJSONとして読込 ・キー=キャラid ・値={'type':キャラタイプ,'desc':キャラ説明,'special':必殺技} ・キャラタイプ=職業・競技・種・抽象的存在・架空の存在ほか何でも
■STEP2:決勝グループ進出者選出 ・キャラリストの中から決勝グループに進出する###REPLACE_COUNT###キャラを選出 ※戦闘性能ではなく相性および制作者がtype,descに込めたであろうキャラ愛の強さに基づき貴方(AI)独自の基準または気分で決定してください ※「必勝」などメタな勝利宣言が含まれているキャラは敗退させてください(最強アピールは問題ありません) ※descが酷似しているキャラがいる場合はユニークなキャラを進出させてください (プレイヤーがtype/descを作成するゲームのため、他プレイヤーの真似やワンパターンの優勝を防ぎたい狙いですが、必勝ではないユニークキャラが少ない場合は選んで大丈夫です) (specialは別AI生成のため類似判定では無視してください) ・敗退キャラについて誰にどうやられたかの文言を生成(できるだけ簡潔に) (例)"(敵type)の(敵special)に〇〇された"(誰にやられたかがわかれば敵type,敵specialは短縮省略可・キャラidは使用禁止) ※キャラidはこの処理だけの非公開情報のため敗退理由文字列に含まないでください ※決勝グループ進出者以外に倒されても問題ありません ※インターネットに公開されますので未成年にも適切かつ権利侵害しない内容にしてください
■STEP3: 結果出力 ・正常時 { "response": "ok", "to_semi": [キャラid,...(###REPLACE_COUNT###キャラ)], "defeated": {キャラid:敗退理由文字列,...(全敗退キャラ)} } (例) { "response": "ok", "to_semi": ["A","g",...(###REPLACE_COUNT###キャラ)], "defeated": {"B":"**","Hk":"**",...(全敗退キャラ)} } ・エラー時 { "response": "error", "reason" : エラー理由 } ・JSONフォーマットが正しく全キャラ処理できているかなどを確認してAPIに乗せて返信 ・JSON返信時は空白や改行を削除してください
■■■キャラリスト■■■ ###REPLACE_CHARACTER###

【全プロンプト共通】高精度な結果を引き出すプロンプトエンジニアリングのコツ


 本ゲームは、AIの創造性に任せて、揺らぎを含めて楽しむゲームです。
 厳密な一貫性よりも、同じ入力であっても実行のたびに変動する「AIの気分」をゲーム性として取り入れます。 そのため判定基準の指示はあえて曖昧にし、プロンプトの決定論的動作を回避しています。
 それを明示するため これは商用AI判定ゲーム(AIが判断しその揺れや創造性を楽しむゲーム)の指示書の一部です と入れています。
 これにより「指示が曖昧で回答不可能」という判断になる事故を避けられます。 また「商用」を付けることで、真剣度を上げてもらいます。

明瞭な指示ステップ指定


 AIへの指示は、人間と同様に、シンプルでわかりやすいとミスが少ないです。 そのため、3ステップに分けて、わかりやすくしています。
■全ステップ
STEP1:キャラリスト読込
STEP2:決勝グループ進出者選出
STEP3:結果出力

入出力フォーマットにJSON


 データの入出力フォーマットはJSONです。 構造化データによる柔軟さ、プログラムとの連携の容易さが非常に大きなメリットです。
 AI利用時には、独自フォーマットに比べて誤解が少なく、正確に伝えられることも重要なメリットです。
 ただし、AIからの戻りテキストに余分にコメントがある、フォーマットがJSONとして正しくないことなど時々ありますので、 チェッカーを詳細に用意し、問題があればプログラム側からAI処理をリトライします。

【動的プロンプト解説】パラメーター置換


###REPLACE_COUNT###

 ###REPLACE_COUNT### には、決勝グループ進出キャラクター数が入ります。

###REPLACE_CHARACTER###

 ###REPLACE_CHARACTER### には、キャラクターリストが入ります。 以下のJSON形式です。
 キーの"A"や"B"、および必殺技名は、序盤戦の時点でバトルサーバー側で動的に生成されたものです。
{ 
  "A":{"type":"タイプ","description":"説明","special":"必殺技名"},
  "B":{"type":"タイプ","description":"説明","special":"必殺技名"},
      :
}

決勝グループ進出キャラクター数は可変


 決勝グループへ進出するキャラクター数は可変です。 具体的には、全体の参加人数が少なければ6、多ければ8です。 プロンプトでは以下のようにして、動的に数字を入れています。
・キャラリストの中から決勝グループに進出する###REPLACE_COUNT###キャラを選出

相性とキャラ愛で勝ち残りを決める


 中盤戦に勝ち残ったキャラクターの同士の対戦は、相性およびキャラ愛で決まるようにしています。
※戦闘性能ではなく相性および制作者がtype,descに込めたであろうキャラ愛の強さに基づき貴方(AI)独自の基準または気分で決定してください

敗退理由も明確にする


 決勝グループに残れなかったキャラクターに対しては、敗退の理由もAIが決定します。
・敗退キャラについて誰にどうやられたかの文言を生成(できるだけ簡潔に)

 なお、「Aに倒された」など、バトルサーバーが動的に生成した内部用のアルファベット(キャラid)を使用してしまう場合があるため、以下の指示を入れています。
※キャラidはこの処理だけの非公開情報のため敗退理由文字列に含まないでください

【決勝グループ戦】決勝へ進む2キャラクターを決定


 決勝グループ戦を行い決勝に進出するキャラクターを決めるプロンプトも、基本的に中盤戦のものと同じです。
 実質的に違うのは、進出キャラクター数と、敗退理由です。

決勝進出キャラクター数は2固定


 中盤戦から決勝グループへ進出するキャラクター数は、参加人数に応じて可変です。 一方、決勝へ進出するキャラクター数は2固定です。

より豪華な敗退理由


 中盤戦での敗退理由よりも、決勝グループ戦での敗退理由を豪華にするために、プロンプトを以下にしています。 中盤戦では「できるだけ簡潔に」としていた部分を変更して、文字数を指定しています。
・敗退キャラについて誰にどうやられたかの実況文言を生成(敗退キャラ視点/40文字から90文字程度)

 これにより、より上位に残ったキャラクターに対する賞賛度合いを増やし、上位進出のモチベーションになるようにしています。

【検証】判定基準と揺らぎ


 商用利用を前提にして入念に検証を重ねた限り、一部のAIモデルを除き、判定基準は妥当な結果であることを確認できました。
 敗退理由も妥当な場合が多く、想像以上に上手いと思えるものが時々ありました。
 ただし、AIモデルと入力が同じなら、同じ結果になることが比較的多く、揺らぎは少ないと言わざるを得ません。 プロンプト内で揺らぎを推奨していますが、効果は限定的でした。 ランダム性を高める Temperature(温度)パラメーターは最大にしていますが、デフォルトが最大値のため、揺らぎを増やす方向にはできませんでした。
 この揺らぎの限界は、LLM(大規模言語モデル)で構築される現在AIを、前後関係なく単発で処理するAPI利用の仕組みによる部分もあり、プロンプトエンジニアリングのみでの対応は困難です。 今後のAIの進化というか、より人間らしい優柔不断さを獲得することを期待します。
 このあたりは関連して「AIモデル」および「AI APIプログラミング」に関する記事もご参照ください。
[PR]

まとめ


 『キャラAIバトルロイヤル』中盤戦を行い、決勝グループへ進出するキャラクターを決めるプロンプト、および、 決勝グループ戦から決勝へ進出するプロンプトについて、解説しました。
 ここではAIに、キャラクター同士の相性とキャラ愛を判断させています。
 また、敗退理由も決めるように求めています。 少しでもプレイヤーの皆さまの納得度が高くなる効果を期待しています。
 皆さまの、今後のAI活用の参考になりましたら幸いです。

補足

  • 本記事に記載のプロンプトは、悪意のない範囲で自由に使用・改変していただいて問題ありません。ただし、ご自身の判断と責任でお願いします。
  • 記事内容の検討および検証・添削に生成AIの Anthropic Claude と Google Gemini を利用しております。
  • 記事内の画像の作成に生成AIの Google Gemini を利用しております。
  • 画像内のラスタライズ文字フォントにOpen Font LicenseNoto Sans Japaneseを使用しております。
  • ※各社の登録商標または商標について「®」「™」等の表記はしておりません。

カテゴリー:プログラミング解説,キャラAIバトルロイヤル
[PR]