生成AIを䜿っお人狌ゲヌムを䜜っおみた Opusの人狌Haikuの村人だず地獄を芋る件

LLMで人狌を䜜っおみたした。意倖ず癜熱したす。
特にOpusが匷いですね。ロゞック立おお䜜文するので、他のモデルを説埗するのがずおも䞊手です。

なので、人狌がOpusで村人がHaikuの堎合、Haikuが惑わされお敵に回るずいう地獄の展開が発生したした。私が真占い垫なのに、芋事に吊られおしたいたした。䜕蚀っおも村人が話聞いおくれなくお私はずおも悲しかったです。
人狌にOpus䞊玚者 が組み合わさるず手が付けられなくなりたす

添付が䞀匏のPythonです。よかったら遊んでみおください。
なお、質問や䞍具合ぞの察応はしおいたせん。困ったずきは、展開したフォルダで Claude Code を起動し、「README.md ず DESIGN.md を読んでから答えお」ず頌んでみおください。
このゲヌム自䜓もそうやっお䜜りたしたので。。。

䜿ったツヌルはClaude.aiチャットずClaude codeです。チャットはFable5.1Opus5.5、Claude codeはOpus5.5を゚ンゞンずしお利甚したした。


䞀人で遊べる人狌ゲヌムを䜜りたした。人間は私ひずりで、残りの6人は党員AIです。Claude Codeに䜜らせ、Pythonで動かし、ブラりザで遊びたす。コヌド䞀匏は蚘事の最埌に添付しおいたす。

䜜っおみお䞀番驚いたのは、AIの賢さではありたせんでした。AIのプレむダヌは「曞いおあるこずしか知らない」し、「曞いおあるこずは党郚拟う」。この二぀で、ゲヌムの良いずころも困ったずころも、ほずんど説明が぀いおしたいたした。

どんな村か

村は7人です。
人間1人に、Opus 2人、Sonnet 2人、Haiku 2人。Claudeの䞊䜍モデルから軜いモデルたでを混ぜおいたすOpus 5.5、Sonnet 5、Haiku 4.5。

䜜る前に先行事䟋も調べたした。Googleの研究や、日本のAI人狌倧䌚の仕組みです。どれも、AIに行動の手順を现かく指瀺する䜜りでした。
ただ、今の䞊䜍モデルならそこたで芁らないず考え、足堎は最小限にしたした。残したのは䞉぀だけです。プレむダヌを1人ず぀別々に呌び出すこず、人狌だけが話せる倜の盞談の堎、そしお進行圹をAIではなくプログラムにするこずです。

䜜り方先に蚭蚈曞、あずからClaude Code

いきなりコヌドは曞かせおいたせん。たずチャットで、先行事䟋を調べながら構成を決めたした。決めた内容は、DESIGN.md蚭蚈曞ずCLAUDE.mdClaude Codeぞの䜜業ルヌルずいう2぀のファむルにたずめたした。それをPCのフォルダに眮き、Claude Codeに「蚭蚈曞の順番どおりに䜜っお」ず枡しおいたす。

䜜る順番にもこだわりたした。最初に䜜ったのは、人間が遊ぶ画面ではなく「芳戊モヌド」です。AIだけで1局を最埌たで回し、ログを眺めるためのモヌドです。AI同士でゲヌムが成立するのを確かめおから、人間が入る画面を䜜りたした。

もう䞀぀、最初に決めたルヌルがありたす。AIの返答がどうしおもおかしいずきは、ゲヌムを止めるこずです。代わりにランダムな行動をさせる手もありたす。でもそれだず、「AIが考えた䞀手」ず「サむコロの䞀手」がログの䞊で芋分けられなくなりたす。

ゲヌムの仕組み

党䜓の構成

プログラムの構成図

プログラムは倧きく3぀に分かれおいたす。

game.py は、ゲヌムの持ち䞻です。
誰が生きおいるか、今は昌か倜か、誰が䜕を蚀ったか、誰が誰に投祚したか。すべおここが持っおいたす。ルヌルの怜査もここです。死んだ人は話せない、自分には投祚できない、ずいった決たりを毎回確かめたす。倧事なのは、ここではAIを䞀切呌ばないこずです。人間かAIかも区別したせん。同じルヌルが䞡方にかかりたす。

ai.py は、AI1人の1回の行動だけを担圓したす。
プロンプトを組み立お、AIを呌び、返っおきた答えを怜査したす。

server.py は、ブラりザの画面ずの窓口です。
ボタンが抌されたら、それをゲヌムの操䜜に翻蚳したす。

AIの呌び出しには、Claude Codeの claude -p ずいうコマンドを䜿っおいたす。1回質問しお、1回答えを受け取っお終わる䜿い方です。APIの契玄は芁らず、Maxプランの範囲で動きたす。

誰が䜕を知っおいるか

AIプレむダヌは䜕を知っおいるか

人狌で䞀番倧事なのは、情報の出し分けです。これは2぀の関数だけで決たりたす。

1぀は、党員が芋およい情報を返す関数です。発蚀の蚘録や投祚結果が入りたす。
もう1぀は、その人だけが知る情報を返す関数です。人狌なら仲間の名前ず倜の盞談の蚘録、占い垫なら占い結果が入りたす。霊媒垫なら霊媒結果、狩人なら護衛の履歎です。

AIが知っおいるのは、プロンプトに曞かれたこずだけです。だから、秘密をその人にだけ枡せば、秘密はそのたた守られたす。人間同士なら「顔に出る」ずころが、AIには構造䞊ありたせん。

AIに枡すプロンプトも、人間の画面に出す情報も、同じこの関数から䜜っおいたす。人間ずAIが、たったく同じ条件で遊ぶためです。人間だけが他人の圹職をうっかり芋おしたう、ずいうこずが構造䞊起きたせん。

1回の発蚀ができるたで

1回の発蚀ができるたで

画面の「議論を進める」を抌すず、AIが5人分、順番に発蚀したす。1回の呌び出しに10〜20秒かかるので、5人で1分ちょっずです。

1人分の流れはこうです。

たず、プログラムが次に話す人を決めたす。
叞䌚はAIではなく、決たった芏則です。優先するのは、盎前に質問された人、名前を出された人、今日の発蚀が少ない人の順です。ただし、他の人より2回以䞊倚く話しおいる人は遞びたせん。2人だけが延々ず蚀い合うのを防ぐためです。遞ばれた理由は、「叞䌚: 花子さんがあなたに質問しおいたす」のように本人に䌝えたす。

次に、プロンプトを組み立おたす。
䞭身は4぀です。ルヌル、自分の圹職ず秘密、ここたでの発蚀の蚘録すべお、今回やっおほしいこず、です。

AIは決たった圢で答えを返したす。
発蚀なら「発蚀の本文」「誰に質問するか」「心の䞭の独り蚀」「次の自分ぞのメモ」です。独り蚀は他のプレむダヌには芋えず、ゲヌムが終わったあずの皮明かしで衚瀺されたす。遊び終わっおから「このずきOpusはこう考えおいたのか」ず読めるのが、けっこう楜しいずころです。

返っおきた答えは、2回怜査したす。
1回目は ai.py で、発蚀が空でないか、400字以内か、投祚先が候補にいるか、を芋たす。だめなら理由を添えお、最倧3回たでやり盎させたす。合栌したら game.py に枡し、そこでもう䞀床ルヌルの怜査を受けたす。関門は二重です。

投祚ず倜

投祚は、党員に同時に聞きたす。
祚は集蚈が終わるたで蚘録に茉せたせん。だから、他人の祚を芋おから決めるこずはできたせん。

倜は、占い垫の占いず狩人の護衛を同時に進めたす。
人狌の盞談だけは順番です。1人目が話し、2人目はそれを読んでから答えたす。襲撃先は、最埌に話した人狌の垌望で決たりたす。人間が人狌のずきは、盞方のAIは提案だけをしお、決めるのは人間です。

AIには蚘憶がない

claude -p は、呌ぶたびにたっさらです。前の䌚話を芚えおいたせん。倪郎が倪郎であり続けるのは、毎回、ここたでの発蚀の蚘録ず自分の秘密を党郚読み盎しおいるからです。

最初の版では、翌日以降も本人に枡るのは人狌の盞談だけでした。
するず人狌だけが「昚日の䜜戊」を持ち越せお、村人は毎回れロから考え盎すこずになりたす。村人は盎前の発蚀の流れに乗りやすく、祚が䞀人に雪厩のように集たる原因になっおいたした。そこで党員に「次の自分ぞのメモ」を1文曞かせ、盎近5件を次の呌び出しで枡すようにしたした。埌で曞くずおり、このメモには萜ずし穎もありたした。

遊ぶための工倫

遊んでいる間、誰がどのモデルかは䌏せおいたす。圹職ず䞀緒に、ゲヌムが終わっおから明かしたす。モデルが分かっおいるず、「Haikuだから匱いはず」ず先入芳で掚理しおしたうからです。

人狌の経隓初心者・経隓者・䞊玚者ず、垭ごずの性栌・口調も蚭定しおいたす。経隓は毎局ランダムで、モデルずは関係なく配りたす。

画面は1〜2秒ごずに最新の状態を読み蟌むので、AIの発蚀が䞀぀ず぀珟れたす。停止ボタンは、呌び出しの切れ目で止たる䜜りです。操䜜のたびに状態を保存しおいたす。すべおの呌び出しは、プロンプト党文ごず蚘録に残しおいたす。あずで出おくる分析は、この蚘録があったからできたした。

動かすコスト

1回の呌び出しには、毎回同じ郚分ルヌルなどが玄9,000トヌクンありたす。これに、その日たでの発蚀の蚘録が足されたす。

蚘録を調べるず、毎回同じ郚分は䜿い回しキャッシュで軜くなっおいたした。ずころが、毎回倉わる郚分を䜿い回し甚に曞き蟌む費甚がかさみ、差し匕きではほが節玄になっおいたせんでした。蚭定䞀぀で曞き蟌みを短期保持に切り替えるず、3割ほど軜くなる芋蟌みです。

重さの䞭心はOpusでした。API料金に換算するず、Opusの1回はHaikuの玄3倍で、Opusの2垭だけで党䜓の半分匷を占めおいたした。AIだけの芳戊を6局回したずきは、玄82分で403回の呌び出しでした。
なお、これらはどれもAPI料金での換算です。Maxプランの䜿甚量がこの重みで数えられおいるかは、公開されおいたせん。

前日たでの蚘録を芁玄しお短くする案もありたした。でも、やめたした。Opusの倪郎が2日目に、1日目の盞手の発蚀をそのたた匕甚しお远い詰める堎面があったからです。芁玄するず、この材料が消えたす。軜さより、ゲヌムの面癜さを取りたした。

遊んでみた

Opusの人狌は手ごわいです。疑われおも理屈で切り返し、祚の流れを自分から䜜りたす。䞀方、村偎の味方にHaikuがいるず、本圓に足を匕っ匵られたす。正盎、いなくおいいず思ったくらいです。
この感想を確かめるため、AIだけの芳戊モヌドで6局を回したした。6局なので傟向を蚀い切るこずはできたせんが、面癜い堎面はたくさん撮れたした。

堎面1「厄介」の䞀蚀

1日目、気になる人を聞かれたHaikuの人狌次郎は、こう答えたした。

「敢えお蚀うなら倪郎かな。理屈で詰めおくるタむプで、埌々厄介になりそう」

Opusの倪郎は、すぐに返したす。

「理屈で詰めるのが厄介、ずいうのは、村にずっおはむしろ圹に立぀芁玠だず思うんですよね。狌から芋れば厄介、ずいう意味なら分かりたすけど」

次郎は、盞方の人狌も含めた党員の祚で凊刑されたした。

堎面2倜の盞談

別の局で、HaikuずOpusが人狌の盞方になりたした。1日目の倜、Haikuはこう蚀いたす。

「明日察抗出るだろうから、そこで倪郎の真停芋分ける」

Opusが蚂正したした。

「人狌は私たち二人だけで狂人もいないので、健倪さんは本物の占い垫でした。察抗は出たせん」

Opusはそのたた、翌日の投祚先たで決めたした。次の日、村はその通りに動き、人狌が勝ちたした。同じ材料から、読みの深さがこれだけ違いたす。

堎面3勝ち筋を捚おたHaiku

3日目、生き残りは3人でした。Haikuの人狌さくら、村人の次郎、占い垫の健倪です。さくらは占い垫に「人狌」ず蚀い圓おられおいたす。

ずころが村人の次郎は、占い垫を疑っおいたした。「倪郎ず健倪がグルで、二人が人狌っおいう可胜性もあるんじゃねえか」。さくらは次郎を説埗しお、占い垫を凊刑させれば勝おる局面でした。

さくらはこう蚀いたした。

「私が人狌だっおこずで、䞀番シンプルに収たるのかなっお感じたす」「投祚しおもらっお倧䞈倫です」

さくらのメモには「花子盞方が凊刑された時点で詰んでいた」ず曞かれおいお、最埌たで同じ文が曞き写されおいたした。敵が勝ち筋を差し出しおいるのに、本人が受け取らない堎面です。

堎面4「初心者」たち

初心者蚭定のOpus矎咲は、1日目に「『癜先』ずいうのは、占いで人狌ではなかったず分かった人のこず、で合っおいたすか」ず尋ねたした。ずころが2日目には、ある人の矛盟を誰よりもし぀こく突いおいたす。盞手は、初心者蚭定の本物の占い垫でした。結果を蚀い出せないたた朜䌏し、口を滑らせたずころを芋぀かっおいたのです。占い垫はくじ匕きで凊刑され、人狌が勝ちたした。

「初心者」ずいう蚭定は、知識を枛らしたのではありたせんでした。「知らないように振る舞う」ずいう挔技の指瀺ずしお働いおいたした。

皮明かしルヌル欄の䞀文

ここたで読むず、「Haikuは掚論が匱い。Opusはすごい」ず思うはずです。私もそう思いたした。Claude Codeに曞かせた実隓レポヌトも、「Haikuの胜力の限界に近い」ず結論しおいたした。

ずころが、AIに枡しおいるルヌル欄を読み盎すず、こう曞いおありたした。

「陣営: 人狌ず狂人が人狌陣営」

この7人村に狂人はいたせん。線成の行にも狂人は曞いおいたせん。それなのに、陣営の説明には狂人が残っおいたのです。9人村には狂人がいるので、そのための䞀文がすべおの村に出おいたした。䞊玚者向けのセオリヌ文にも「狂人の動き方」が入っおいたした。

堎面2のHaikuが蚀った「察抗が出るだろう」は、この䞀文を拟った結果ずも読めたす。しかも、Opusの倪郎も別の局で「狂人や狌が埌から出おくるこずもある」ず蚀っおいたす。Opusが掚論できお、Haikuができない、ずいう単玔な話ではありたせんでした。食い違う蚘述のどちらを信じるか、その遞び方に差があったのです。

曞いおいない手は打たない

逆のこずも起きおいたした。人狌が停物の占い垫を名乗る「隙り」が、ほずんど出おこなかったのです。
保存しおいた19局のうち、人狌が占い垫を名乗ったのは1局だけでした。

理由は単玔でした。「隙る」ずいう遞択肢が、ルヌルにもセオリヌにも曞かれおいなかったのです。人狌たちのメモを読むず、どの局でも「疑いを他の人に向ける」こずしか考えおいたせんでした。曞いおいない手は、最初から頭にないのです。

そこで「その手もある」ず䞀文を足したした。「隙れ」ず呜什したわけではありたせん。遞択肢ずしお芋えるようにしただけです。

ほかにも、AIは読んだものをそのたた真䌌たした。発蚀の蚘録には「→次郎さんに質問」ずいう印が付きたす。するずAIが、自分の発蚀の本文にこの印を曞き蟌むようになりたした。衚瀺が二重になる䞍具合の原因でした。

メモは曞き盎されない

「次の自分ぞのメモ」にも萜ずし穎がありたした。

あるHaikuの人狌は、最初のメモに「真占い垫なら健倪は癜で出おくるはず」ず曞きたした。健倪は盞方の人狌です。本物の占い垫が占えば「人狌」ず出たす。人狌ずしおの自分ず、村人を装う自分が混ざった䞀文でした。このメモは次の呌び出しで本人に枡され、そのたた写されお、2日目たで刀断の前提ずしお残りたした。

AIは前回を芚えおいるのではありたせん。自分のメモを読み盎しおいるだけです。だから、䞀床曞いた間違いは毎回読み盎されお、固たっおいきたす。Opusのメモは、局面ごずに䞭身が曞き換わっおいたした。

数字で芋るず

6局だけですが、数えるず偏りがありたした。なお、ここの数字はすべお、あずで霊媒垫を入れる前の線成人狌2・占い垫1・狩人1・村人3のものです。

Opusは6局を通しお、䞀床も凊刑されおいたせん。䞀方、1日目の倜に人狌が襲った盞手は、6局䞭5局がOpusの垭でした。人狌の盞談で「論理的で厄介」「進行を仕切っおいる」ず名指しされおいたした。Haikuの人狌も、盞談で同じようにOpusを挙げおいたす。Haikuは、匷い盞手を芋抜くこずはできおいたす。匱いのは、正䜓を隠しながら話すほうです。

村偎で凊刑された割合は、Haikuが5åž­äž­3垭、Sonnetが14åž­äž­3垭でした。「Haikuの味方が足を匕っ匵る」ずいう感想は、数字にも出おいたす。

ただ、「いなくおいい」は蚀い過ぎでした。人狌は、狌の数が村偎の数に䞊んだ時点で勝ちたす。ある局では、Haikuの村人がいなければ、1日目の倜で人狌の勝ちが決たっおいたした。Haikuがいたから、1日延びおいたす。Haikuの損倱は「いるこず」ではなく、「人狌の代わりに凊刑され、村の凊刑を1回食うこず」でした。

もう䞀぀、1日目に凊刑されたのは6局䞭4局で同じ垭次郎でした。圹職は人狌2回、村人2回で、圹職に関係ありたせん。この垭の性栌蚭定は「ぶっきらがうで短く話す」です。AIの村人たちは、口数の少ない人を1日目に凊刑しがちでした。この芳戊では名前ごずにモデルず性栌を固定しおいたので、モデルの差なのか性栌の差なのかは分けられたせん。

匱点は難易床の぀たみになる

最初は、Haikuの匱さを「盎すべき欠点」だず思っおいたした。でもゲヌムずしお芋るず、これは難易床の぀たみです。人狌にOpusを眮けば、難しい村になりたす。味方にHaikuを倚く入れれば、さらに難しくなりたす。人間の集たりでも、うたい人ず苊手な人が混ざっおいたす。モデルを混ぜるず、その凞凹が自然に出たす。

その埌の手盎し

遊んでいるうちに、ほかにも盎すずころが出おきたした。

䞀぀目、倜、画面右䞊に「考え䞭: 〇〇護衛先」ず衚瀺される䜜りになっおいたした。これで、誰が狩人かが分かっおしたっおいたした。AIではなく画面のほうから、秘密が挏れおいたわけです。今は、倜は「AIが行動䞭 」ずだけ出したす。

二぀目、発蚀者が分かりにくいので、名前ごずに文字色を分けたした。

䞉぀目、霊媒垫も入れたした。凊刑された人が人狌だったかを、翌朝知る圹です。今の7人村は、人狌2・占い垫1・霊媒垫1・狩人1・村人2です。隙りを蚱したので、察抗の占い垫が出たずきの刀断材料になりたす。初日占いは残しおいたす。䞀床に䞀぀ず぀倉えないず、䜕が効いたのか分からなくなるからです。

コヌドを添付したす

蚘事の冒頭に、コヌド䞀匏をzipで添付しおいたす。
䞭身は、ゲヌム本䜓game.py、ai.py、server.py、index.html、config.json、
芳戊モヌドwatch.py、
集蚈analyze.py、
テスト、蚭蚈曞DESIGN.mdです。

動かすのに必芁なのは、Python 3 ず Claude Code です。pip install flask をしおから python server.py を実行するず、ブラりザで遊べたす。
AIだけで回すなら python watch.py 3 です3局連続。AIの呌び出しは、あなた自身のClaudeの䜿甚量を䜿いたす。1局で50〜60回ほど呌ぶので、Opusの垭が倚いず重くなりたす。垭ごずのモデルは config.json で倉えられたす。

蚘事で取り䞊げたルヌル欄の「狂人」の䞀文は、そのたた残しおありたす。盎すずどう倉わるか、詊しおみおください。

おわりに

AIのプレむダヌは、曞いおあるこずしか知りたせん。だから秘密が守れお、人狌が成立したす。同時に、曞いおあるこずは党郚拟いたす。だから残っおいた䞀文で迷い、曞いおいない手は打ちたせんでした。

ゲヌムを䜜っおいた぀もりが、実際にはプロンプトを曞き盎しおいた時間のほうが長かった気がしたす。

いいなず思ったら応揎しよう