--- title: "読み上げBotに、なぜか本格的な人狼ゲームが生えた話" description: "声を読み上げるだけのDiscord Botに、全11役職の人狼とワードウルフを実装したらまた暴走した記録。なぜ「おまけのゲーム」を本気でテストするのか、専門知識なしで読めます。" url: https://ryuuneko.com/blog/zunda-games-honki published: 2026-06-19 06:10:42.491304 updated: 2026-06-19 06:10:42.491304 --- Discordの読み上げBot「ずんだー」に、**人狼ゲーム**と**ワードウルフ**を実装しました。 読み上げBotです。文字を声にする、それが本業です。人狼は——どう考えても関係ありません。それでも気づいたら、全11役職・第三陣営つき・最大20人・配役カスタム対応の、わりとガチな人狼が動いていました。 この記事は、その「なんで?」に対する記録です。前に「[おまけ機能ロマン暴走記](/blog/zunda-omake-roman)」というのを書いたのですが、性懲りもなく、また似たようなことをやりました。専門知識がなくても読めるように書きます。 --- ## まず芯を定義しておく 趣味で作っているものには、「必要か / 不要か」より先に勝ってしまう問いがあります。**「面白いか / 作りたいか」**です。これに勝てる理屈は、趣味開発にはありません。 なので「読み上げBotに人狼が要るのか?」という問いは、最初から負けています。要るか要らないかではなく、**作りたかった**。それだけです。 ただ——この記事で本当に書きたいのはそこではありません。暴走したのは「ゲームを足したこと」ではなく、**「おまけのゲームを、おまけとは思えない真剣さで作ってしまったこと」**のほうです。芯はこっちです。 ## なぜBotでゲームをやるとハマるのか ずんだーがいつも居るのは、Discordのボイスチャットです。人が集まって、だらだら喋っている場所。 そういう場所って、ちょっとした「遊びの種」と相性がいいんですよね。「人狼やろうぜ」が、わざわざ別のアプリを開かなくても、いま喋っているそのチャンネルで始められる。**Botがすでに「みんなが居る場所」に常駐している**ことが、ゲームと噛み合う理由です。 最初に作ったのは、軽いほうの**ワードウルフ**でした。全員にお題を配り、1人だけ違うお題(少数派)を会話の中から探す——というシンプルな正体探しゲームです。これは素直に作れました。 問題は、そのあと人狼に手を出したことです。 ## 「ちゃんとした人狼」は、思ったより重い 人狼を「ちゃんと」作ろうとすると、急に要求が膨らみます。 - **役職が11種類**。村人・人狼に加えて、占い師・狩人・狂人・霊媒師。さらに第三陣営として、占われると死ぬが襲撃では死なず生き残れば単独勝ちの**妖狐**、吊られたら(処刑されたら)その瞬間に勝つ**道化師**、吊られると道連れを1人連れていく**猫又**、そして相方が分かる**共有者**や妖狐の味方の**背徳者**。 - **夜と昼のループ**。夜は能力者が秘密裏に動き(襲撃・占い・護衛)、朝にその結果が公開され、昼は議論して投票で1人を処刑する。これを勝敗がつくまで回す。 - **勝敗判定が陣営ごとに違う**。村が勝つ条件、人狼が勝つ条件、妖狐が勝つ条件、道化師が勝つ条件——それぞれ別。妖狐が生き残っていると人狼が勝っても妖狐の横取りになる、みたいな割り込みもある。 この「夜→昼→投票→また夜」をきっちり順番に回す仕組みは、専門的には**状態機械(ステートマシン)**と呼ばれます。いまゲームがどの段階にいて、次にどこへ進めるのかを、1チャンネルにつき1つ管理する。要するに、ボタンを押すたびに「いまは夜だからこの操作は許す/許さない」を判断し続ける小さな審判です。 ここに、制限時間をつけると勝手に進む機能(手動進行と自動進行のハイブリッド)や、人狼だけの会議用・参加者用の一時スレッドを自動で作る機能、配役のプリセット(初心者/標準/ガチ/ワイワイ)と役職ごとの人数カスタムまで生えてきました。おまけのつもりが、気づけば一個のちゃんとしたゲームです。 ## ここからが本題 ——「壊れ方」を考える 機能が多いことは、正直そんなにすごくありません。すごい(というか、自分でも変だと思う)のは、**この「おまけ」を、壊れ方まで考えて作ってしまった**ことのほうです。 ### ルールの中身を、Discordから引き剥がす 人狼のルール部分——配役の配り方、夜の行動の解決、勝敗の判定——を、**Discordとのやり取りから完全に切り離した「純粋な部品」**として作りました。 これの何が嬉しいか。普通、Botのテストは「実際にDiscordで人を集めてプレイする」しかなく、自動では確かめられません。でもルールを引き剥がしておくと、Discordに一切つながずに「7人で妖狐入り、占いで妖狐を引いたら呪殺になるか」みたいな状況を**机上で何百通りも再生してチェックできる**。実際、ゲーム部分のテストは600本以上が、Discordに接続しないまま回っています。 ### 「テストが緑」と「バグが無い」は別 ここで一個、罠があります。**テストが全部通っている(緑)からといって、バグを見つけられるテストとは限らない**。中身が空っぽでも緑になるテストは書けてしまうからです。 そこで使ったのが、専門的には**ミューテーションテスト**と呼ばれる手法です。やることは意地悪で、**わざとコードを1か所こっそり壊して、テストがちゃんと落ちるか**を見る。落ちなければ「そのバグは素通りする=テストに穴がある」とわかる。これで、投票集計の「ちょうど過半数」の境界や、配役の人数チェックの不等号がズレても誰も気づかない、といった穴が実際に何か所も見つかり、潰しました。 ### カバレッジに映らないバグ さらに、テストの網羅率(カバレッジ)には映らない種類のバグも、推論で探して直しました。たとえば—— - 進行パネルとは関係ない「役職確認」ボタン(こっそり自分だけに表示される操作)を押しただけで、**自動進行用に覚えていたパネルが上書きされ、タイマーが夜のまま固まる**。 - 誰かが「遊び方」を見ただけで**放置タイマーがリセットされ、いつまでも中止できなくなる**。 - ゲームが終わったのに**一時スレッドが消えずに残る**。 - 状態を片付ける一瞬の隙に別の操作が割り込んで**二重処理になる**。 どれも「1人でボタンをポチポチする普通のテスト」では出てこない、**複数の操作が絡んだとき・タイミングが噛み合ったときだけ**に出るバグです。こういうのが、おまけのゲーム1個から9件出てきました。 ## なぜ、おまけにそこまでやるのか 理由は2つあります。 ひとつは実用的な話。ゲームが試合の途中で同期ズレを起こしたり、エラーで落ちたりすると、**そのVCに居る全員の遊びが台無し**になります。しかもずんだーは複数のサーバーで同時に動いているので、「とりあえず再起動」で気軽に状態を捨てるわけにもいかない。だから、おまけでも落ちては困る。 もうひとつは——単純に、**おまけほど本気で作ると気持ちいい**から。誰も「そこまでやれ」とは言っていない部分を、こっそり堅く作る。この自己満足が、趣味開発のいちばん美味しいところだと思っています。 正直に書いておくと、実機での通しプレイは「設定まわりは自分のテスト用Botで確認、ただし大人数の対戦フローはアカウントが足りず、さっきの自動テスト群で担保」という状態です。ここは胸を張って「全部実機で確認した」とは言えません。そのぶん、ルールの中身は機械的に何度も殴って確かめてあります。 ## ちなみに、ぜんぶ1日 ここまで「ルールを引き剥がした」「600本テストした」「わざと壊して穴を探した」「9件バグを潰した」と、いかにも手間をかけたように書いてきました。 白状すると、これ——**思い付いた夜から、翌日の昼には本番に出ていました**。最初のコミットからリリースまで、まる1日もかかっていません。 ここがいちばん、自分でも変だと思うところです。本気で作るのと、速く出すのは、普通はトレードオフのはず。でも、ルールをDiscordから引き剥がして機械的にテストできるようにしてあるからこそ、**「堅く作る」と「一気に出す」が両立してしまった**。丁寧にやることが、結果的に速さにもなる。趣味開発で一番うれしい瞬間です。 ## おわりに なんで読み上げBotで人狼が遊べるのか。答えは結局、前回と同じです。**趣味だから**。 ただ、暴走しているのは「ゲームを足したこと」そのものではなく、**それを安っぽく作るのを拒否したこと**のほうなんだと思います。おまけにステートマシンを組み、ルールを引き剥がし、わざとコードを壊してテストの効き目を測る。誰に頼まれたわけでもなく。 軽いノリで始めたものを、つい本気で固めてしまう。たぶんこの病気はしばらく治りません。次は何が生えるんでしょうね。 --- *※この記事は2026年6月時点の実装をもとにしています。「おまけ」は外部の事情や気分で変わりうるので、細かい仕様は今と違うかもしれません。*