1台で遊ぶカードゲームを3〜8人オンライン対応にした話|ウソつきギャラリー開発記
Mopuru Gamesの「ウソつきギャラリー」を3〜8人オンライン対戦に対応。ルームコード、秘密情報の管理、3分再接続、ホスト移譲、再戦など、ブラウザパーティーゲームのオンライン化について紹介します。
Mopuru Gamesで公開している「ウソつきギャラリー」を、3〜8人で遊べるオンライン対戦に対応しました。
もともとは、1台のスマホやPCをみんなで回しながら遊ぶパーティーゲームとして作った作品です。
今回はそこから、
「それぞれが自分のスマホやPCを使って、同じルームに参加して遊べる形」
まで作り直しました。
アプリのインストールは必要ありません。
ブラウザでルームを作り、ルームコードや招待リンクを共有すれば、そのまま参加できます。
ウソつきギャラリーってどんなゲーム?
ウソつきギャラリーは、お題とイラストカードを使った会話・推理系のパーティーゲームです。
各プレイヤーにはお題が配られ、そのお題に合いそうなカードを1枚選びます。
全員のカードが公開されたら、自分が選んだカードについて順番に説明します。
ただし、プレイヤーの中には他の人と違うお題を渡されている「少数派」がいることがあります。
会話を聞きながら、
「この人、ちょっと説明がおかしくない?」 「もしかして自分がお題を勘違いしている?」
と考え、最後に少数派だと思うプレイヤーへ投票します。
3人プレイでは、そもそも少数派が存在しないラウンドもあります。
そのため、
「本当にウソつきがいるのか?」
まで考えるのがこのゲームの特徴です。
最初は「1台で遊ぶゲーム」でした
最初に作ったバージョンは、1台の端末をプレイヤー同士で回して遊ぶ方式でした。
自分のお題を確認したら次の人へスマホを渡す。
全員が確認したらカードを選ぶ。
この形でも遊べますが、3〜8人で遊ぶゲームなので、人数が増えるほど端末を回す時間も増えます。
そこで、1台プレイ版を残したまま、オンライン版を追加することにしました。
現在は、
- オンラインで遊ぶ
- 1台で遊ぶ
の2つから選べます。
オンライン化で一番気を使ったのは「秘密情報」
ウソつきギャラリーでは、他人に見えてはいけない情報がかなりあります。
たとえば、
- 自分のお題
- 各プレイヤーの手札
- 結果発表前の少数派情報
- 投票中の他人の投票先
などです。
オンライン版では、サーバー側にゲーム全体の状態を持たせながら、各プレイヤーには「その人が見てもいい情報だけ」を送る設計にしました。
カード選択中なら、自分には「自分のお題」と「自分の手札」が届きます。
一方、他のプレイヤーについて分かるのは「カードを提出したかどうか」だけです。
他人が選んだカードそのものは、全員が提出するまで送られません。
投票も同じで、結果が確定するまでは他人の投票先を送りません。
ブラウザ側で見えないようにするだけではなく、
「そもそも見せてはいけないデータをブラウザへ送らない」
という形にしています。
ルームコード方式にしました
オンライン版では、ホストがルームを作ると6文字のルームコードが発行されます。
他のプレイヤーは、そのコードを入力するか招待リンクから参加できます。
3〜8人が参加でき、全員がREADYになったらホストがゲームを開始します。
通信部分には Cloudflare Workers、Durable Objects、WebSocket を使っています。
サーバー側で、
- ゲームの進行
- プレイヤー
- カード
- 得点
- 投票
- 切断状態
などを管理しています。
クライアント側は操作を送るだけで、重要なゲーム判定はサーバー側で行うようにしています。
スマホゲームなので「切断」は避けられない
オンライン化してから特に重要だったのが再接続処理です。
スマホでは、
- 画面をロックする
- 別のアプリを見る
- 通信環境が変わる
- Safariが一時的に通信を切る
といったことが普通に起こります。
一度切断しただけでゲームから追い出される仕様では遊びにくいため、通信が切れても3分間は席を保持するようにしました。
3分以内に戻れば、
- 同じプレイヤー
- 同じ席
- 同じ手札
- 同じゲーム状態
に復帰できます。
3分を超えた場合は不在として扱います。
不在者が出ても3人以上残っていればゲームを続けられ、2人以下になった場合は試合中止になります。
ホストがいなくなった場合は、別のプレイヤーへ自動でホスト権限を引き継ぎます。
再戦も同じルームで
最終結果のあとには再戦機能も入れました。
参加者が「もう一度遊ぶ」を押し、対象プレイヤー全員が再戦を希望すると、同じルームコードのままロビーへ戻ります。
プレイヤー名やゲーム設定は維持し、
- 得点
- READY状態
- ゲーム状態
などをリセットします。
何試合か続けて遊ぶ場合でも、毎回ルームを作り直す必要はありません。
かなりテストしました
今回のオンライン化は、一気に全部作るのではなく段階を分けて進めました。
ロビー → ゲーム開始 → カード選択 → 一斉公開 → スピーチ → 投票 → 得点 → 次ラウンド → 最終結果 → 再接続 → 不在処理 → 再戦
という形で、少しずつ機能を追加しました。
特に重点的に確認したのが、
「結果発表前に秘密情報が漏れていないか」
という部分です。
画面表示だけではなく、実際にWebSocketで送られるデータも確認し、
- 他人のお題
- 他人の手札
- 少数派情報
- 未公開の投票先
などが混ざっていないことをテストしました。
3人・4人・8人や、1・3・5ラウンドでも確認しています。
既存の1台プレイ版も残しています
オンライン対応したからといって、以前の遊び方をなくしたわけではありません。
友達が同じ場所にいて、
「スマホ1台あれば十分」
という場合は1台プレイ版を使えます。
一方で、
「各自のスマホで秘密のお題を見たい」 「Discordなどで通話しながら遊びたい」
という場合はオンライン版が向いています。
遊ぶ状況に合わせて選べる形にしました。
AI開発支援もかなり使いました
今回の開発では、CodexなどのAI開発支援も使っています。
ただ、一度に全部作るのではなく、
実装 → テスト → 確認 → commit
を機能ごとに繰り返しました。
オンラインゲームの場合、
「画面上では正常に見えるけれど、実は他人の秘密情報まで通信されている」
といった問題も起こり得ます。
そのため、見た目だけではなく通信内容やサーバー側の状態までテストするようにしました。
AIを使うことで実装速度はかなり上がりますが、
- どこまでをサーバーで管理するか
- どの情報をプレイヤーへ送るか
- どこをテストするか
といった設計は重要だと感じました。
正式公開しました
ウソつきギャラリーは、Mopuru Gamesで正式公開しました。
現在は3〜8人で、
- オンラインで遊ぶ
- 1台で遊ぶ
のどちらかを選べます。
オンライン版はスマホ・PCのブラウザだけで遊べます。
友達と集まったときや、Discordなどで通話しているときに遊んでもらえたら嬉しいです。
今後もMopuru Gamesでは、短時間で遊べるブラウザゲームを少しずつ増やしていく予定です。