複数人で遊ぶWebアプリでは、
- 1台の端末を回す
- 1人が画面を読み上げる
- サーバーでリアルタイム通信する
といった方法があります。
ただ、簡単なパーティーゲーム程度なら、共有用URLを使うだけでも複数人プレイを実現できます。
例:正体隠匿系ゲーム
例えばワンナイト人狼のようなゲームです。
通常は、
田中さんが役職を見る
↓
端末を鈴木さんへ渡す
↓
鈴木さんが役職を見る
という形でも遊べます。
ここでゲーム情報をURLに入れて、
https://example.com/game?share=XXXXXXXX
のような共有URLを発行します。
これをLINEなどで参加者へ送ります。
各プレイヤーはURLを開き、自分の名前を選択します。
あなたの名前を選択
・田中
・鈴木
・佐藤
田中さんを選んだ場合は、
あなたは「占い師」です。
鈴木さんは村人判定です。
のように、その人に必要な情報だけを表示します。
これなら端末を回す必要がありません。
パスワードの設定
各プレイヤーに任意のパスワードを設定したい場合は、パスワードのハッシュ化処理を実装し、共有する側が各プレイヤーからハッシュ値を受け取る形式が望ましいです。
各プレイヤー自身がパスワードを生成する場合は、パスワードをランダムに生成してIndexedDBに保存し、保存と同時にコピーされるハッシュ値をGMに送信します。そのハッシュ値を、共有する側の入力画面で入力する形式が望ましいです。
この仕組みを実装する場合、実際に会って遊ぶ程度ならば、Base64を解析している暇がないため、秘匿すべき情報はパスワードそのものだけになると考えられます。
そのため、適切に実装されていれば、実際のプレイ時に必要とするパスワードに関しては、現時点で知られている技術では突破することは困難なはずです。
カジュアルな対面プレイでは参加者がURLを意図的に解析しないことを前提とする簡易方式ではあるものの、「そこまで不審な動きができるかどうか」「知識があるかどうか」「不正が軽い気持ち程度ならば、そこまでやるか」等を考慮すると、効果は高いと推測されます。
一方で、共有する側が5桁のパスワードを設定し、個別チャットで伝えたり、紙に書いて渡したりして入力してもらえるように、手動設定にも対応しましょう。
確かに、セキュリティ面では強固とは言えませんが、「隣の参加者にちょっと覗かれるのを防止する」程度であれば、一定の有効性があります。そのため、この方式も用意しておくことで、共有する側がより簡単に運営できるようになると考えます。
URLにゲーム情報を入れる
例えばゲーム状態をJSONにして、
const game = {
players: [
{
name: "田中",
role: "占い師"
}
]
};
Base64URL形式などに変換し、クエリパラメータへ入れます。
?share=eyJwbGF5ZXJzIjpb...
受け取った側ではURLからデータを復元し、自分用の画面を表示します。
プレイヤーから結果を返すこともできる
逆方向にも使えます。
例えばプレイヤーが、
鈴木さんを占う
という行動を選んだ場合、その結果を再びURL化します。
https://example.com/game?result=XXXXXXXX
そのURLをホストへ送り返し、ホスト側のアプリへ貼り付けて読み込めば、ゲーム状態へ反映できます。
つまり、
ホスト
↓
共有URL
↓
プレイヤー
↓
行動
↓
結果URL or 結果Text
↓
ホストへ反映
という流れです。
サーバーなしでも使える
この方法なら、GitHub Pagesなどの静的サイトでも実装できます。
WebSocketやデータベースを用意せずに、簡易的な複数人プレイを作れるのがメリットです。
まとめ
小規模な複数人ゲームなら、
ゲーム情報
↓
JSON
↓
Base64URL
↓
LINEなどで共有
という方法でも十分遊べます。
特に、
- 正体隠匿ゲーム
- カード配布
- 秘密のお題
- 個別ミッション
- 投票ゲーム
- TRPGの秘密情報
などと相性が良いです。
端末を回すゲームを、共有URLで各自のスマホ対応にするという考え方は、個人開発でも使いやすいアイデアだと思います。