ミニゲ!の紹介:4 桁のコードで集まってスマホで遊ぶミニゲーム集と、手札を覗かせない作り
ミニゲ!は、ルームを作って 4 桁のコードで集まり、みんなのスマホでミニゲームを遊ぶ Web アプリだ。アプリのインストールは要らず、ブラウザで開いて「ゲストで始める」を押せば、ログインしなくても遊べる。飲み会や集まりで「何かやろう」となったとき、その場でスマホを出してすぐ始められるように作った。
この記事では、始め方と、ワードウルフ・大富豪・ito風がどう進むか、それから「手札や役職を覗かれない」ための作りをまとめる。ゲームごとの細かいルールと人数・時間の目安は、ミニゲ!の中のゲーム一覧から 1 本ずつ読める。
遊べるゲーム(21 種類)
1 つのルームに入れるのは 10 人まで。ゲームごとの人数は次のとおり。
| 分類 | ゲーム(人数) |
|---|---|
| ボード | 三目並べ・リバーシ・四目並べ・五目並べ・将棋・チェス(どれも 2 人) |
| カード | ブラックジャック(1〜7 人)・インディアンポーカー(2〜10 人)・大富豪(3〜6 人)・ポーカー(テキサスホールデム、2〜10 人)・ババ抜き(2〜8 人)・花札(こいこい、2 人)・カラーマッチ(2〜10 人)・ジンラミー(2 人) |
| パーティ | 王様ゲーム(3〜10 人)・ワードウルフ(3〜10 人) |
| 協力 | ito風(2〜10 人) |
| 道具 | 共有乱数・数字くばり・カードくばり(1〜10 人)・順番決め・チーム分け(2〜10 人) |
ゲームの一覧では、名前での検索(ひらがなでも当たる)、分類での絞り込み、「今の人数で遊べるものだけ」の切り替えができる。人数が合わないゲームも一覧から消えず、「あと1人必要」のように遊べない理由が出る。
始め方
- https://minige.takushio2525.com/ を開き、「ゲストで始める」か「Googleでログイン」を押す。
- ホームの「はじめる」で、次のゲームの決め方(ホストが選ぶ / みんなで投票)を選び、「ルームを作る」を押す。決め方はあとからロビーの「設定」で変えられる。
- ロビーに出る 4 桁のコードを伝えるか、「参加リンクをコピー」でリンクを送るか、「QRを表示」で QR を見せる。
参加する側は、ホームの「4桁のコード」欄にコードを入れて「参加」を押すか、送られたリンクを開くだけでいい。ログインしていなければ、リンクを開いた時点でゲストとして入れる。
LINE で受け取ったリンクを LINE の中で開くと、Safari か Chrome で開き直すよう案内が出る。LINE のアプリ内ブラウザは Cookie の置き場所が別なので、そのまま進むと、ふだんのブラウザでログインしていても別の人として始まってしまうためだ。
ロビーで次のゲームを決める
ロビーは「集まる → 決める → 遊ぶ → ロビーに戻る」を繰り返す場所になっている。次のゲームの決め方は 2 通りある。
- ホストが選ぶ(最初の設定): ホストが一覧から選んで始める。
- みんなで投票: 1 人 1 票。つながっている全員が入れた時点で決まり、ホストは先に締め切ることもできる。同票のときは、最多票のゲームの中からホストが選ぶ。誰がどれに入れたかは全員に見える。今の人数で遊べないゲームには投票できない。
ホストはほかに、遊んでいるゲームを終えてロビーに戻す、メンバーを外す(外された人は 10 分間入り直せない)、ホストを譲る、コードでの参加を止める、といった操作ができる。ホストの接続が 30 秒切れたままになると、つながっている人の中でいちばん前から席にいる人へ、ホストが自動で移る。
代表的な 3 つのゲームの進み方
どのゲームにも「ルール」ボタンがあり、スマホでは下から出るシート、PC ではダイアログでルールを読める。ゲーム中は画面に「いま何をする番か」が 1 行で出続ける。
ワードウルフ(3〜10 人)
全員に似たお題が配られるが、1 人(人数が多いときは 2 人)だけ違うお題を持っている。それが「ウルフ」で、話し合いながらウルフが誰かを探す。
- ホストが「配る」を押すと、自分のお題だけが表示される。自分がウルフかどうかは、本人にも分からない。
- ホストが話し合いの時間(3 分・5 分・7 分)を選んで始めると、残り時間が全員の画面に出る。
- ホストが「投票へ」を押したら、あやしいと思う人の席をタップして投票する(自分には入れられない)。全員が入れると自動で開票される。同票ならホストが「再投票」でやり直す。
- 指名されたのがウルフでも、そのウルフが市民のお題を当てれば逆転勝ちになる。当たっているかどうかは市民の側が判定する。
お題の組は 103 組ある。ウルフの人数は、7 人以上のときに 1 人か 2 人を選べる(最初は 2 人)。同票のときの再投票や、ウルフが逆転できる条件まで含めたルールは、ワードウルフのルールと遊び方にまとめてある。
大富豪(3〜6 人)
ジョーカー 2 枚を入れた 54 枚を全員に配り、♠3 を持っている人から始める。強さは 3 がいちばん弱く、A・2・ジョーカーの順に強くなる。出せるのは 1 枚、同じ数字の複数枚、同じスートの 3 枚以上の連番(階段)だ。
手札をタップして選び、「出す」か「パス」を押す。いま出せる組み合わせの札だけが押せるようになっているので、ルールがうろ覚えでも間違った出し方にはならない。上がった順に称号が付き、ポイント(大富豪 3・富豪 2・平民 1)はゲームをまたいで積み上がる。次のゲームの前にはカード交換がある(大富豪と大貧民は 2 枚、富豪と貧民は 1 枚)。
ローカルルールは、8 切り・革命・都落ち・スペ 3 返しが最初から入っていて、しばりと 11 バックは切ってある。ホストが配る前に「設定」で切り替えられる。それぞれのローカルルールが何をするかは、大富豪(大貧民)のルールと遊び方に一覧がある。
ito風(2〜10 人・協力)
1〜100 の数字が、重ならないように 1 人 1 枚ずつ配られる。見えるのは自分の数字だけだ。お題に沿った言葉で自分の数字の大きさを表現し合い、全員で小さい順に並べられたら成功、という協力ゲームになっている。数字をアプリに入力することはなく、伝え合うのは言葉だけ。
- ホストが「配る」を押す。お題は用意してある 115 件から出るほか、ホストが「お題を自分で決める」を ON にすれば、40 文字までの好きなお題で配れる。
- 話し合って並び順が決まったら、ホストが上下のボタンで並べ替えて「この並びで確定」を押す。
- 全員の数字が公開され、順番が逆になっている境目には赤い線が出る。「次のお題」で続ける。
1 人 2 枚ずつで遊ぶこともできる(5 人まで。2 人で遊ぶときは最初から 2 枚)。数字を言葉で表すときの例と、並びを揃えやすくするコツは、ito風の遊び方に書いてある。
スマホが寝ても、同じ席に戻れる
集まって遊んでいると、画面を消したりリロードしたりは普通に起きる。ミニゲ!はつなぎ直すと同じ席に戻り、ゲーム中ならその続きの画面が届く。開き直したときはホームのいちばん上に「前回のルーム」が出て、ゲームの途中だった場合はそのまま自動で戻る。
誰かの接続が切れても、その人の手番を勝手に飛ばすことはしない。ほかの人の画面に「接続が切れています」と出るので、戻ってくるのを待つか、戻ってこなければホストが「ロビーに戻る」で終える。
使われなくなったルームは自動で消える。誰もつながっていない状態が 60 分続いたとき、操作が 3 時間なかったとき、作ったあと誰も席に着かないまま 10 分たったとき、のどれかだ。
ゲストと Google 連携の違い
ゲストで始めると、形容詞と動物を組み合わせた名前が自動で付く。名前はあとで 16 文字まで自由に変えられ、色は 8 色から選べる。
ゲストのままでも遊べるが、ホームで「Google と連携する」を押すと、同じ名前・同じ色・同じ席のまま、別の端末やブラウザからも同じ人として遊べるようになる。ログインしていれば、フレンド、よく遊ぶゲームと最近遊んだゲーム、前回のルームが残る。ゲストのフレンドは、そのブラウザのログインが消えると失われる。
料金はかからない。扱う情報はミニゲ!のプライバシーポリシーに書いてある。
手札や役職を覗かれないための作り
ここからは作りの話をする。
ブラウザで遊ぶゲームで問題になりやすいのが、相手の手札や役職のような「見えてはいけない情報」だ。いったんブラウザにデータとして届いてしまえば、開発者ツールを開くだけで読めてしまう。画面の上で隠していても意味がない。
そこでミニゲ!では、ゲームの状態をサーバー側だけに置いている。Cloudflare の Durable Objects を 1 ルームに 1 つ割り当て(4 桁のコードから直接引ける)、状態はそこにしか持たない。各プレイヤーに送るのは、ゲームごとの view(state, viewerId) を通した「その人に見えてよい形」だけで、見えないものはフラグで隠すのではなく、データのキーごと落としている。
これはテストでも確かめている。送る中身を JSON にして、ワードウルフでは「市民に届くデータにウルフの正体もウルフのお題も入っていない」「ウルフ自身にも自分がウルフだとは書かれていない」、大富豪では「他人の手札は枚数だけで、中身は入っていない」、ito風では「他人の数字が JSON に一切現れない」ことを見ている。
ゲームのルールは、時刻と乱数を外から受け取る「純関数の状態機械」(init / reduce / view / isOver)として書いた。ゲームのコードの中では Date.now() と Math.random() を使わず、乱数はシード付きにしてある。同じ入力なら必ず同じ結果になるので、テストで検算しやすい。チェスの合法手の生成は perft(局面数の数え上げ)で確かめていて、開始局面から深さ 3 で 8,902 局面になること、よく使われる 4 つのテスト局面でも既知の値と一致することを見ている。
WebSocket は Durable Objects の Hibernation API で受けていて、待っている間はコストがかからない。接続にはどのユーザーかの情報を付けてあるので、スマホがスリープから戻ってつなぎ直しても、同じ席に戻せる。サーバーは Cloudflare Workers と Hono、データは D1 と Drizzle ORM、ログインは Better Auth、画面は React・Vite・Tailwind CSS で、運用は無料枠の範囲で回している。
複数人で遊ぶ流れは、Playwright でブラウザを人数分立てて同じルームに入り、最後まで通しで確かめている。
いまできないこと
- ゲームの途中からの参加と観戦(途中で入ろうとすると「ロビーに戻るまで待ってください」と出る)
- コンピューター相手の対戦
- 手番の時間制限
- 一部のルール(ブラックジャックのスプリット、将棋の千日手と持ち時間、チェスの 50 手ルールなど)
どれも、遊んでみて要るものから足していく。記事を書いた時点ではこの一覧に戦績も入れていたが、10 月 9 日から勝ち・負け・引き分けの数を残すようにして、ホームでゲームごとの勝率まで見られるようになった。
- ミニゲ!: https://minige.takushio2525.com/
- ゲームごとのルール: ゲーム一覧
- 作った背景と使った技術: ミニゲ!の解説