🔥 ゲーム概要
焼肉テーマのオンラインマルチプレイ対応ターン制ボードゲーム。2〜4人がリアルタイムで同じ盤面を共有し、手札のみ各自に秘匿される。
プレイヤーは焼肉奉行となり、4×4マスの「網」の上で肉を焼き、最高のタイミングで自分の皿に取り込む。他人の肉を奪う「肉泥棒」や予期せぬ「ハプニング」が飛び交う中、最も多くのMP(Manpuku Point)を獲得したプレイヤーが勝利する。
最高の焼き加減で自分の小皿に肉を確保しつつ、他プレイヤーの戦略を妨害する——シンプルなルールの中に駆け引きが詰まったパーティゲーム。
🎮 ゲーム盤面
網(メインボード)
4×4マスの計16マス。中央2×2が強火エリア(焼き進行が2倍)。
| エリア | 位置 | ラウンド終了時の進行 |
|---|---|---|
| 通常エリア | 外周12マス | +1 |
| 強火エリア | 中央2×2の4マス | +2 |
強火エリアへの肉の配置は1ターンにつき1回まで。同じターン中に2枚目を強火エリアに置くことはできない。
大皿
肉カードの待機エリア。ゲーム開始時に通常肉から16枚を並べる。
ミスジ・イチボ・ザブトン・シャトーブリアンは大皿に並べない。ゲーム外に別置きし、「特別注文」「超特別注文」アクションカード使用時のみ網に直接配置される。
各プレイヤーの小皿
網から回収した肉を一時的に置く場所。ターン終了時に小皿の肉は全て強制的に食べる(MP計算される)。
🔥 焼き加減システム
肉は配置直後から6段階で焼き加減が進行する。
| レベル | 名称 | 状態 |
|---|---|---|
| 0 | 生 | 配置直後。食べられない・小皿に移せない |
| 1 | 生焼け | 1段階進行後。食べられない・小皿に移せない |
| 2 | レア | 一部の肉は食べられない(ホルモン/トントロ/ぼんじり) |
| 3 | ミディアム | 全ての肉で食べられる |
| 4 | ウェルダン | 全ての肉で食べられる |
| 5 | 焦げ | 全ての肉で-2MP。自分の焦げ肉は強制回収 |
「食べられない」状態の肉は、いかなる効果によっても小皿に移動できない。通常の回収、肉泥棒、肉奉行、網交換(ハプニング)、マスタートング——全て不可。
🔄 ターン進行
ラウンドの流れ
各プレイヤーの手番
アクション一覧
| アクション | AP | 説明 |
|---|---|---|
| 網に肉を置く | 1 AP | 大皿から通常肉を1枚選び、網の空きマスに配置。配置直後は「生」。置いたプレイヤーが所有者。 |
| 網の肉を小皿に移す | 1 AP | 網上の食べられる状態の自分が置いた肉を1枚、自分の小皿に移動。他人の肉は「肉泥棒」等のカードでのみ。 |
| アクションカードを使う | 1 AP | 手札からアクションカードを1枚プレイ。 |
| アクションカードを引く | 1 AP | 山札から1枚ドロー。手札上限4枚。 |
| パス | 0 AP | 何もしない。残りAPは持ち越し不可。 |
ラウンド終了処理
全員の手番終了後、以下を順番に処理:
- 焼き加減の進行 — 通常エリア+1、強火エリア+2。氷効果付きの肉は進行値-1(その後氷消滅)
- ハプニング発生 — 山札から1枚めくり効果を適用
- APリセット — 余ったAPは消滅
🍽️ 大皿と補充
大皿の残り枚数が8枚になった瞬間に以下が発生:
🏆 ゲーム終了と勝敗
終了条件
大皿の肉カードがなくなった(=肉山札も空で補充不能)状態で、次のラウンド(全員が1手番ずつ実行)終了後にゲーム終了。
最終スコア計算
最終MPが最も高いプレイヤーの勝利。
👁️ 情報公開範囲
| 情報 | 公開範囲 |
|---|---|
| 網の上の肉(種類・焼き加減・所有者) | 全員に公開 |
| 大皿の肉 | 全員に公開(けむりもくもく時は裏向き) |
| 各プレイヤーの獲得MP | 全員に公開 |
| 各プレイヤーの小皿の肉 | 全員に公開 |
| 各プレイヤーの手札枚数 | 全員に公開 |
| 各プレイヤーの手札内容 | 本人のみ |
| 各山札の残り枚数 | 全員に公開 |
🥩 肉カード
通常肉(40枚)
カルビ・ロース・タンはレアから食べられる。ホルモン・トントロ・ぼんじりはミディアム以降のみ。




































希少部位(4枚・ゲーム外別置き)
























希少部位は肉泥棒の対象にならない。「特別注文」で3種から選択、「超特別注文」でシャトーブリアンを配置。
⚡ アクションカード
全12種・40枚。全てAPコスト1。手札上限4枚。












💥 ハプニングカード
全9種・各1枚。ラウンド終了時に山札から1枚めくって効果を適用。









👤 キャラクター
全12種。ゲーム開始前にランダムで2枚配布され、1枚を選択。各キャラクターは固有スキルを持つ。
🏅 称号
ゲーム終了時にプレイ内容に応じて称号が付与される。同率の場合は両方に適用。
| ID | 称号名 | 条件 | 効果 |
|---|---|---|---|
| X_0001 | アクションキング | アクションカード使用枚数が最多 | +3MP |
| X_0002 | お肉マスター | 肉を食べた枚数が最多 | +3MP |
| X_0004 | 焦がし大臣 | 肉を焦がした枚数が最多 | -3MP |
| X_0005 | ルパン29世 | 肉泥棒カード使用枚数が最多 | +3MP |
称号の内容は今後変更予定。肉貧民は現在無効化しており、焦がし大臣など残る称号も継続してバランス調整する。
⚙️ 技術スタック
| 項目 | 技術 | 理由 |
|---|---|---|
| フロントエンド | HTML/CSS/JavaScript(Vanilla) | ブラウザゲーム。フレームワーク不要。 |
| リアルタイム通信 | Socket.IO | ターン制+リアルタイム同期に最適 |
| バックエンド | Node.js + Express | Socket.IOとの親和性 |
| ゲーム状態管理 | サーバーサイド一元管理 | チート防止、整合性担保 |
| デプロイ | Railway | GitHub連携自動デプロイ |
| データ形式 | JSON | カードデータ等の静的定義 |
Phaser.jsは使用しない。物理演算やスプライトアニメーションは不要なカードゲームUIのため、DOM/Canvas操作で十分。
🏗️ アーキテクチャ
全体構成
設計原則
- サーバーが権威(Authoritative Server): 全てのゲーム状態はサーバーが管理。クライアントはUIの表示とアクション送信のみ。
- アクション検証: クライアントはアクションを送信し、サーバーが検証して結果をブロードキャスト。
- 手札の秘匿: 手札は該当プレイヤーにのみ送信。他プレイヤーには枚数のみ通知。
サーバーコード構成
| ファイル | 行数 | 役割 |
|---|---|---|
| server/index.js | ~870行 | Express + Socket.IOハブ、全イベントハンドラ |
| server/game/GameState.js | ~1,800行 | ゲーム状態管理、全ルールロジック(コア) |
| server/game/GameManager.js | ~160行 | ルーム管理、プレイヤー管理 |
| server/config/constants.js | ~65行 | ゲーム定数、ヘルパー関数 |
クライアントコード構成
| ファイル | 行数 | 役割 |
|---|---|---|
| public/js/socket.js | ~1,920行 | ゲームUI描画 + Socket.IO通信 |
| public/js/layout-editor.js | ~520行 | カスタムレイアウトエディター |
| public/js/main.js | ~140行 | ロビーUI |
| public/js/admin.js | ~280行 | 管理画面ロジック |
📡 Socket.IO イベント設計
クライアント → サーバー
SEND| イベント名 | データ | 説明 |
|---|---|---|
create_room | { playerName, password } | ルーム作成 |
join_room | { roomId, playerName, password } | ルーム参加 |
select_character | { characterId } | キャラクター選択 |
start_game | {} | ゲーム開始(ホストのみ) |
action_place_meat | { platterIndex, gridIndex } | 大皿→網に肉配置 |
action_pickup_meat | { gridIndex } | 網→小皿に肉回収 |
action_play_card | { cardId, targets } | アクションカード使用 |
action_draw_card | {} | アクションカードを引く |
action_pass | {} | パス |
use_character_skill | { targets } | キャラスキル発動 |
respond_to_prompt | { choice } | 割り込み応答 |
end_turn | {} | ターン終了 |
サーバー → クライアント
RECEIVE| イベント名 | データ | 説明 |
|---|---|---|
room_created | { roomId } | ルーム作成成功 |
player_joined | { players } | プレイヤー参加通知 |
character_options | { characters: [2枚] } | キャラクター選択肢配布 |
game_started | { initialState } | ゲーム開始、初期状態送信 |
game_state_update | { state, privateHand } | 状態更新(手札は個別送信) |
turn_started | { playerId, ap } | ターン開始通知 |
action_result | { success, action, changes } | アクション結果 |
round_end | { cookProgress, happening } | ラウンド終了処理結果 |
prompt_player | { type, data } | 割り込み選択要求 |
game_over | { rankings, titles } | ゲーム終了、最終結果 |
error | { message } | エラー通知 |
🗃️ データ構造
GameState(サーバー側・ゲーム全状態)
JSONデータファイル
| ファイル | 内容 | 件数 |
|---|---|---|
server/data/meat.json | 肉カード定義(通常6種+希少4種) | 10種 |
server/data/action.json | アクションカード定義 | 12種 |
server/data/happening.json | ハプニングカード定義 | 9種 |
server/data/character.json | キャラクター定義 | 12種 |
server/data/title.json | 称号定義 | 5種 |
焼き加減定数
📁 ファイル構成
🗺️ 開発ロードマップ
- ✓ プロジェクト初期構成(Express + Socket.IO)
- ✓ ルーム作成・参加(合言葉認証)
- ✓ JSONデータファイル作成
- ✓ GameState初期化(山札シャッフル、大皿配置、手札配布)
- ✓ 網の描画(4×4グリッド、強火エリア)
- ✓ 大皿の描画
- ✓ 基本ターン進行(AP管理、ターン切り替え)
- ✓ アクション:網に肉を置く / 網の肉を小皿に移す
- ✓ 焼き加減の進行(ラウンド終了処理)
- ✓ 実食フェーズ(小皿→MP計算)
- ✓ ゲーム終了判定+スコア表示
- ✓ アクションカードを引く(手札上限4枚)
- ✓ 肉泥棒 / 肉奉行 / 氷 / 炎上
- ✓ ライス / サンチュ / 柚子胡椒
- ✓ マスタートング / がぶ飲み / 黄金のタレ
- ✓ 特別注文 / 超特別注文(希少部位配置)
- ✓ ハプニングカード処理基盤(9種全実装)
- ✓ キャラクター選択画面(2枚から1枚選択)
- ✓ パッシブスキル(炭谷氏、ジャイアン、早川、希美さん)
- ✓ 開始時スキル(米田、ニック、氷室)
- ✓ アクティブスキル(お奉行、焔ジョー、ラム)
- ✓ 割り込みスキル(麦島、不動ちゃん)
- ✓ 称号システム(5種)
- ✓ 手札の秘匿送信
- ✓ ターン制御の堅牢化(90秒タイムアウト)
- ✓ 焦げ肉の強制回収フロー
- ✓ デンモク移動(大皿8枚トリガー)
- ✓ 割り込みUI(不動ちゃん/麦島さん)
- ✓ カード画像の組み込み(AI生成アセット全種)
- ✓ 焼き加減のビジュアル表現(6段階の肉カード画像)
- ✓ サウンド実装(27種SFX)
- ✓ カスタムレイアウトエディター
- ✓ カットイン演出(肉泥棒/焦げ肉/スキル)
- ○ アニメーション(カード移動、MP獲得)
- ○ BGM実装
- ○ レスポンシブ対応の強化
📝 特殊ルール・エッジケース
氷と炎上の同時処理
氷はラウンド終了時の進行値を1減少させる。炎上は即座に進行させる(ラウンド終了処理ではない)。よって、氷が付いた肉に炎上を使った場合、炎上は通常通り効果発動し、氷は次のラウンド終了時に消費される。
七輪大炎上と氷
七輪大炎上は「即座に1段階進行」なのでラウンド終了処理ではない。氷の効果は「次のラウンド終了時」なので、七輪大炎上では氷は消費されない。
不動ちゃんの無効化タイミング
対戦相手がアクションカードを使用宣言した直後に割り込みで発動。カードの効果自体が無効になり、使用されたカードは捨て札になる。
がぶ飲みの最終ターン使用
「次のターンのAP-1」ペナルティは最終ターンに使えばデメリットなし。
ライスの効果期間
使用したターンを含めて自分の手番3回分。期間中に食べた肉全てに+1MP。
デンモク移動と補充の同時処理
大皿が8枚になった瞬間にトリガー。まず補充(山札→大皿に8枚追加)を行い、デンモクを移動。同一ターン内で複数回トリガーした場合は最後にトリガーしたプレイヤーがデンモクを受け取る。