Implement Texas Hold'em play: dealing, betting, side pots, showdown
- Hand engine (server/hand.js): crypto-shuffled deck kept server-side, blinds (heads-up button = SB), min-raise rules incl. incomplete all-in, uncalled bet refunds, side pots, split pots, all-in runout - Hand evaluator (server/cards.js) and node:test suite (npm test) - Table flow: hands auto-continue after host START, 30s action clock (timeout = check/fold + sit out), sit out / sit in, rebuy, mid-hand leave folds and keeps the seat reserved until the hand ends, pause freezes all clocks - Only each player's own hole cards are sent until a showdown/runout reveal; all actions validated server-side - Play UI: board, hole cards, bets, action tags, turn timer, raise panel with presets, showdown results with winning cards highlighted, compact 7+ layout - Remove the host crown and the temporary "next phase" control Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
b2c91062f1
commit
8de55f7ca5
12 files changed
+1648
-167
No files matched your search
+45
-9
@@ -20,7 +20,6 @@
|
||||
|
||||
<div class="host-controls" id="host-controls" hidden>
|
||||
<button class="btn btn-green" id="start">START ▶</button>
|
||||
<button class="btn btn-dark" id="next-phase" title="プレイ未実装のため手動でフェーズを進めます">次へ(仮)</button>
|
||||
<button class="btn btn-dark" id="pause">一時停止</button>
|
||||
</div>
|
||||
<div class="host-spacer" id="host-spacer"></div>
|
||||
@@ -39,22 +38,59 @@
|
||||
<div class="felt">
|
||||
<div class="pot-label">POT</div>
|
||||
<div class="pot" id="pot">$0</div>
|
||||
<div class="phase" id="phase">WAITING</div>
|
||||
<div class="hand-no" id="hand-no"></div>
|
||||
<div class="board" id="board"></div>
|
||||
<div class="phase"><span id="phase">WAITING</span><span class="hand-no" id="hand-no"></span></div>
|
||||
<div class="result" id="result" hidden></div>
|
||||
</div>
|
||||
<div id="seats"></div>
|
||||
</div>
|
||||
|
||||
<div class="spectator-note" id="spectator-note" hidden>満席のため観戦中です</div>
|
||||
<div class="spectator-note" id="spectator-note" hidden>
|
||||
<span id="spectator-text">満席のため観戦中です</span>
|
||||
<button class="btn btn-orange btn-sm" id="take-seat" hidden>空席に座る</button>
|
||||
</div>
|
||||
</main>
|
||||
|
||||
<div class="action-bar" id="action-bar" hidden>
|
||||
<div class="turn-progress" id="turn-progress" hidden><i id="turn-bar"></i></div>
|
||||
<div class="inner">
|
||||
<div class="my-stack"><span class="wallet">👛</span><span id="my-stack">$0</span></div>
|
||||
<div class="actions">
|
||||
<button class="btn" disabled>Fold</button>
|
||||
<button class="btn" disabled>Check</button>
|
||||
<button class="btn" disabled>Raise</button>
|
||||
<div class="me-row">
|
||||
<div class="my-cards" id="my-cards"></div>
|
||||
<div class="me-info">
|
||||
<div class="my-stack"><span class="wallet">👛</span><span id="my-stack">$0</span></div>
|
||||
<div class="me-sub"><span class="my-hand" id="my-hand"></span><span id="my-net"></span></div>
|
||||
</div>
|
||||
<button class="btn btn-ghost btn-sm" id="sit-out" title="次のハンドから参加しません">離席</button>
|
||||
</div>
|
||||
|
||||
<div class="status-line" id="status-line"></div>
|
||||
|
||||
<div class="raise-panel" id="raise-panel" hidden>
|
||||
<div class="presets" id="presets">
|
||||
<button class="btn btn-dark btn-sm" data-preset="min">Min</button>
|
||||
<button class="btn btn-dark btn-sm" data-preset="half">½</button>
|
||||
<button class="btn btn-dark btn-sm" data-preset="threeq">¾</button>
|
||||
<button class="btn btn-dark btn-sm" data-preset="pot">Pot</button>
|
||||
<button class="btn btn-dark btn-sm" data-preset="max">All-in</button>
|
||||
</div>
|
||||
<div class="raise-row">
|
||||
<input type="range" id="raise-range" aria-label="レイズ額">
|
||||
<input type="number" id="raise-amount" inputmode="numeric" aria-label="レイズ額">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="actions" id="actions">
|
||||
<button class="btn act-fold" id="act-fold" disabled>Fold</button>
|
||||
<button class="btn act-call" id="act-call" disabled>Check</button>
|
||||
<button class="btn act-raise" id="act-raise" disabled>Raise</button>
|
||||
</div>
|
||||
<div class="actions raising" id="raise-actions" hidden>
|
||||
<button class="btn btn-dark" id="raise-cancel">戻る</button>
|
||||
<button class="btn act-raise" id="raise-confirm">Raise</button>
|
||||
</div>
|
||||
<div class="actions single" id="alt-actions" hidden>
|
||||
<button class="btn btn-orange" id="sit-in">復帰する</button>
|
||||
<button class="btn btn-blue" id="rebuy">リバイ</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
Reference in new issue
Block a user