観戦モード フローチャート

4人プレイ(A,B,C,D)+観戦者 S。S の最初の挙動からゲーム終了・ロビーに戻るまで。利用者のアクション/プログラムの反応/画面表示を段階ごとに示す。

観戦者 部屋(待機) ゲーム中 ロビー
段階
観戦者 S
A
B
C
D
① ロビー
(観戦準備/部屋待機)
S(観戦者)
ロビー(部屋一覧)
【アクション】部屋IDを入力し「観戦する」ボタンを押す
【送信】spectate_room(room_id)
A
部屋画面(参加者 4人)
「ゲーム開始」可能
B
部屋画面(参加者 4人)
C
部屋画面(参加者 4人)
D
部屋画面(参加者 4人)
↓ S が「観戦する」実行
② 観戦参加
(プログラム反応)
S
【表示】ゲーム未開始→部屋画面(参加者リストのみ・操作不可)/ゲーム中→盤面・ポイント・現在ターン
【受信】room_id, players, spectators/playing なら board, taken, vanished, points, current_turn をまとめて受信
A
部屋 or ゲーム開始直後
変化なし(S 参加は room_updated で「観戦者 1人」出せる)
B
部屋
C
部屋
D
部屋
↓ A が「ゲーム開始」→ 4人でゲーム開始
③ ゲーム進行中
S
観戦画面(盤面・カード・ポイント・誰のターンか)
【アクション】カードクリック不可。操作は「観戦をやめる」のみ
【受信】pair_taken, turn_ended, tribe_effect, cards_revealed 等を room 宛で同じく受信→表示更新
A
ゲーム画面(自分のターンで2枚選択)
B
ゲーム画面(待機)
C
ゲーム画面(待機)
D
ゲーム画面(待機)
↓ ゲーム終了(残り1人 or ペアなし)
④ ゲーム終了
S
終了表示(勝者名・ポイント・ペア数)。「観戦をやめる(ロビーへ)」ボタン表示
【受信】game_ended(points, pairs, winner_indices)。YOU WIN は出さない
A
終了オーバーレイ「再戦しますか?」(はい・いいえ)
B
終了オーバーレイ「再戦しますか?」
C
終了オーバーレイ「再戦しますか?」
D
終了オーバーレイ「再戦しますか?」
↓ 再戦選択中(S は「観戦を続ける」or「ロビーに戻る」)
⑤ 再戦選択中
S
「観戦を続ける」/「ロビーに戻る」の選択
【ロビーに戻る】→ leave_room(room_id) 送信。観戦者なので spectators から削除
A
カウントダウン or 「参加者を待っています…」
B
再戦選択オーバーレイ
C
再戦選択オーバーレイ
D
再戦選択オーバーレイ
↓ S が「ロビーに戻る」を選択
⑥ S が観戦をやめる
S
【アクション】「ロビーに戻る」クリック
【送信】leave_room(room_id)。サーバーは players にいなければ spectators から sid 削除
A
変化なし(S 退出で room_updated で観戦者数減らす場合あり)
B
再戦選択中
C
再戦選択中
D
再戦選択中
↓ サーバー処理後
⑦ 最終(S ロビー)
S
ロビー(部屋一覧)。観戦前と同じ画面
【表示】部屋一覧を再取得。他プレイヤーに影響なし
A
再戦カウントダウン or 2回目ゲーム開始後はゲーム画面
B
再戦選択 or ゲーム中
C
再戦選択 or ゲーム中
D
再戦選択 or ゲーム中

段階ごと:利用者のアクション/プログラムの反応/画面表示

段階 利用者のアクション プログラムの反応 画面に表示する内容
観戦者 S:ロビーで部屋IDを入力し「観戦する」を押す。プレイヤー A,B,C,D:部屋で待機または「ゲーム開始」を押す。 (S が送信するまでサーバー側の変化なし) S:ロビー(部屋一覧・部屋ID入力欄・「観戦する」ボタン)。A,B,C,D:部屋画面(参加者 4人・ゲーム開始ボタン)。
S:「観戦する」送信済み。A:ゲーム開始押下で全員ゲーム画面へ。 spectate_room 受信→部屋が存在し参加可能なら room["spectators"] に S を追加、socket を room_id の Socket.IO ルームに join。ゲーム中なら現在の game 状態(board, taken, vanished, points, current_turn, players)を S に返却。 S:ゲーム未開始なら部屋画面(参加者・観戦者数のみ、操作不可)。ゲーム中なら盤面・ポイント・現在ターン。A,B,C,D:ゲーム画面 or 部屋。
S:カードをクリックしない(不可)。「観戦をやめる」のみ可能。A,B,C,D:通常プレイ(2枚選択・ペア取得・ターン終了)。 pair_taken / turn_ended / tribe_effect 等を room 宛に emit → S も同じルームにいるため受信。S には flip_cards 送信権なし。カードクリックはクライアントで無効化。 S:プレイヤーと同じ盤面・ポイント・「○のターン」表示。カードはクリック不可・「観戦中」のラベル。A,B,C,D:通常のゲーム画面。
全員:ゲーム終了の結果を見る。S:勝者・ポイントを確認し、続けて観戦するかロビーに戻るか選ぶ準備。 game_ended を room 宛に emit(points, pairs, winner_indices)。S も受信。プレイヤーには「再戦しますか?」、観戦者には「観戦を続ける/ロビーに戻る」用の payload または同じイベントでクライアントが役割で分岐。 S:終了オーバーレイ(勝者名・各プレイヤーのポイント・ペア数)。「観戦を続ける」「ロビーに戻る」ボタン。A,B,C,D:終了オーバーレイ「再戦しますか?」(はい・いいえ)。
S:「観戦を続ける」→ 再戦開始まで待ち、2回目も観戦。「ロビーに戻る」→ leave_room 送信。A,B,C,D:はい/いいえ選択。 S が leave_room 送信→サーバーは players に該当 sid がなければ spectators から削除。socket を room から leave。S に「ロビーに戻しました」等のレスポンス。room_updated で観戦者数が減ったことを配信するかは任意。 S(ロビーに戻る選択後):ロビー画面(部屋一覧)。A,B,C,D:再戦カウントダウン or 「参加者を待っています…」。
⑥〜⑦ S:ロビーで他部屋を観戦したり、自分で部屋を作成・参加できる。A,B,C,D:再戦 or 人数不足でロビーへ。 disconnect 時も players にいなければ spectators から削除(_fantasy_leave_room_by_sid)。部屋が解散(0人)になったら S がまだ観戦中なら部屋が消えるので、クライアントで check_room 等で無効と分かればロビー表示に切り替える。 S:ロビー。A,B,C,D:再戦でゲーム再開 or ロビー。

補足:観戦モードで送受信するイベント

種別 イベント 観戦者 S の扱い
観戦参加spectate_room(room_id)S が送信。サーバーが spectators に追加し、playing なら game 状態を返却。
配信(受信のみ)game_started, pair_taken, turn_ended, tribe_effect, cards_revealed, game_ended, turn_timeout, player_eliminatedroom 宛 emit のため S も同じ room にいれば受信。表示更新に利用。
観戦退出leave_room(room_id)S が送信。サーバーは players にいなければ spectators から削除。
送信しないflip_cards, start_game, rematch_ready, rematch_declineS はプレイヤーではないため送信不可。UI でボタンを出さない/無効化。