Skip to content

Latest commit

 

History

History
140 lines (110 loc) · 12 KB

File metadata and controls

140 lines (110 loc) · 12 KB

提案:記録と掲示をひとつにした CHroS

作成日: 2026-09-18。対人戦の得点・勝因を入力すると、2戦の勝敗、予選順位、本戦への 勝ち上がり、会場の掲示までつながる試作です。画面のモックだけでなく、保存と集計まで実装しています。

今回の確認用サーバーは 運営画面 と 会場掲示 で起動します。 サーバーを停止した場合の再起動方法は下記を参照してください。

まず5分で試す

初期サンプルは、架空の参加者8名・A/Bの2グループです。 予選12試合のうち10試合が終了し、「B-05」の第1戦まで記録された状態から始まります。

  1. 運営画面と会場掲示を別タブ、または別のモニターで開きます。
  2. 運営画面の下側にある第2戦で、大地れん 15点、高原ゆう 18点、勝因「得点比較」を保存します。 大地れん 54点、高原ゆう 42点となり、試合の勝者は大地れんになります。
  3. 「試合結果」ボタンを押すと、会場に勝者を掲示します。「予選順位」では順位が更新されています。
  4. 「掲示対象の試合」をB-06に変え、じゃんけんで決めた先攻を選んで開始します。 第1戦を若葉ひなた 12点/高原ゆう 20点、PUTで若葉ひなた勝利、 第2戦を 5点/35点、得点比較として保存すると、合計17対55でも特殊P1対0で若葉ひなたが勝ちます。 この例が、特殊ポイントの優先順位を確認していただくための例です。
  5. 「対戦・記録 → 順位・トーナメント」で進出者とシード順を確認し、本戦を作ります。 A1-B2、B1-A2の準決勝と、その勝者を受け取る決勝ができます。
  6. 「コントロール」の進行表で「本戦の組み合わせ」を選び、本戦表を掲示します。 「次へ」で本戦の対戦表示へ進みます。対戦用の表示は、選択中の掲示対象を使います。

確認が終わったら「設定・履歴 → サンプルに戻す」で初期状態を再作成できます。 それまでの大会はサーバー内に退避されます。実データを入力する場合は「空の大会を作成」を選びます。

操作できること

操作場所 実装した内容
コントロール 会場のプレビュー、6画面の切替、進行区分、掲示対象の選択、得点入力
表示の進行表 項目の追加・編集・並べ替え・削除、任意項目の表示、「次へ」
対戦・記録 全試合と状態、各戦の得点・勝因・先後、訂正理由、再試合、勝者・順位、本戦作成
参加者 氏名・所属・グループ、総当たりの組み合わせ生成
設定・履歴 大会名、計算方式、各組の進出人数、幕間ロゴ、操作履歴、CSV・JSON出力
会場掲示 開会式等の案内、対戦途中の確定値、勝者、予選順位、本戦表、幕間ロゴ

得点はゲーム終了時に更新します。画面の切り替えは運営が行い、結果保存だけで自動切り替えはしません。 全結果はサーバーに保存し、ブラウザーを閉じても残ります。

判断記録 — 確認してほしいこと

「未確定だから実装を止める」のではなく、以下の判断で試作しました。 ユーザーから明示された要件、一次資料、自主判断を混同しないように分けています。

ID 採用した判断 根拠・理由 確認時の見どころ
D01 特殊勝利1回を1特殊Pとし、2戦の特殊P→得点で試合判定。PUT・切断等に種類別の重みは付けない 特殊Pが勝因の抽象化であることは依頼者の明示。1Pの付与と合計の比較順は実装者の判断 上記17対55でも特殊Pで勝つ例が、実際の運用と一致するか
D02 釧路の予選順位は試合勝数→特殊P→合計得点 予選順位の詳細は未指定のため自主判断。確定試合だけで順位を計算 順位基準に直接対決等を加える必要があるか
D03 全比較が同じ試合は新マップで2戦とも再試合。予選の完全同順位は主催者が理由を付けて進出を裁定 再試合の運用資料と、勝者を推測しない記録設計 じゃんけん・抽選・再試合など裁定の実際の手順が記録しやすいか
D04 先攻の選択は手入力。第2戦は自動反転。A/Bの入力欄の人物は固定 じゃんけん・先後交代は依頼者の明示。入力欄を移動させないのは取り違えを防ぐ判断 COOL/HOT表示と実機側の運用が対応しているか
D05 2グループの上位2名ならA1-B2/B1-A2。不足枠は上位シード側の不戦進出 本戦の具体的な配置が未指定のため標準的なシード配置を採用 組み合わせ抽選や同組の再戦回避に別のルールが必要か
D06 画面切替は手動。表示順も手動の「次へ」。進行区分・掲示対象・表示内容を別々に選べる OBS型操作と事前の順番という依頼者の希望。入力途中の意図しない掲示を避ける ボタンの数と操作順が大会当日の担当者に合うか
D07 表示順の対戦画面は現在の掲示対象を参照。時刻指定や項目ごとの試合固定は今回含めない 同じ対戦画面を何試合にも再利用する基本形を優先 試合単位の細かな台本を事前登録する必要があるか
D08 得点訂正は理由必須。本戦確定後の予選修正、後続試合開始後の進出者変更は拒否 進行済みの対戦表を黙って書き換えないための自主判断 実運用で必要な取消・巻き戻しの範囲が足りるか
D09 PostgreSQL・任意式のノード編集を今回の試作から外し、計算方式2つとJSONファイル保存を使う 基本操作を一続きに評価できる成果物を優先。既存のNext.jsは継続 操作評価後にDB・規則編集のどちらを先に広げるか
D10 旭川向けは対人戦の計算のみ。Botなし。総当たり順位は試合勝数→換算得点 北海道v3.1.0の対人ルールと、対人限定という依頼者の明示。旭川の総当たり順位は試作判断 大会全体の正式再現ではないことを前提に、方式の差し替えが役立つか
D11 通信切断は「参加者に起因する敗北」の裁定後に選ぶ。タイムアウトやサーバー障害は手動で仕切り直す 自動連携はまだないため、運営判断を勝手に代行しない 勝因の選択肢に足りないものがあるか
D12 会場LAN・単一サーバー・認証なし。外部フォント等を使わず動作する 既存のネットワーク要件を継続。公開ホスティングは行わない 実際の会場接続にこの運用形態が合うか
D13 大きな順位表・本戦表はページ切替。自動巡回は行わない 投影時に文字を過度に小さくしないため 全体図と個別ページの使い分けが足りるか

最初に確認していただきたいのは D01の試合判定、D02の予選順位、D05の本戦配置 です。 決定後はこの表に採否を記録し、計算方式の規則版を更新して実装へ反映します。

確認して改善した点

  • ダミーの足し算を、素点・特殊P・勝因・各戦勝数を区別する計算に置き換えました。
  • 第1戦だけで試合勝者を確定することや、再試合待ちの得点が順位に混ざることを防ぎました。
  • 入力欄は空欄から始め、未入力のまま0対0として保存しにくくしました。
  • 記録を訂正すると順位も再計算され、後続の試合が変わる危険な修正は拒否します。
  • 入力と別タブの掲示が連動すること、画面選択と表示順が保存されることを確認しました。
  • ブラウザー標準の確認ダイアログがアプリ内ブラウザーで停止したため、画面内の確認ダイアログに置き換えました。
  • 長い表はページ化し、CSVでは文字列が数式として解釈されないようにしています。
  • 外部Google Fontsへの依存を取り除き、会場LANでの動作を優先しました。

検証結果

2026-09-23に可読性改善後の型検査・テスト・本番ビルド・API結合テスト・ブラウザー操作を再確認しました。 書き方と実装の入口は 開発ガイド にまとめています。

検証 結果
計算・進行のユニットテスト 29件通過。通常得点、特殊勝利、旭川換算、左右反転、訂正、再試合、同順位、勝ち上がり、不戦枠等
TypeScript アプリ・shared・scoringで型検査と未使用変数・引数の検査を通過
整形 Prettierで書式を統一し、整形・型・テストのPR自動検査を追加
可読性改善前後の比較 採点・大会操作705件、掲示HTMLとページ分割90件、CSV24件を一時検証スクリプトで比較し、一致を確認
Next.js本番ビルド 成功
API結合テスト 参加者6名→2組の予選6試合→本戦3試合→決勝まで通過
SSE 初期状態、更新通知、別掲示画面への得点・結果・順位・表示順反映を確認
ブラウザー操作 得点入力、先後交代、特殊勝利、別画面への結果反映、設定保存、順位表示、表示順の編集・再生・「次へ」を確認。画面内確認のキャンセル・実行と本戦生成も確認済み
更新競合 古い更新番号の保存を409で拒否し、最新状態を返すことを確認
エクスポート CSVの各戦結果・数式対策、JSONの全記録・履歴を確認
永続化 別のテスト用サーバーを停止・再起動し、更新番号40・決勝2戦・結果掲示状態の保持を確認
Docker 永続化volumeを設定。Dockerでのビルド・起動は未検証

API結合テストは scripts/smoke-prototype.mjs に残しています。 対象サーバーの大会を切り替えるテストのため、必ず別の CHROS_DATA_DIR とポートで実行してください。

起動と保存

通常の開発:

pnpm install
pnpm dev

本番形式:

pnpm build
pnpm start

この環境で用意した3100番ポートの試作を再起動する場合:

cd chros
./node_modules/.bin/next start --hostname 0.0.0.0 --port 3100

既に依存関係が入っている環境では上記の直接起動が可能です。 Node.js 22以降を使います。ファイル保存は chros/.chros、または CHROS_DATA_DIR の指定先です。 各種の詳細は 技術要件 にまとめています。

今回の限界

  • 試合サーバーとの連携、Bot戦、マップ管理、全国固有の採点方式は実装していません。
  • 会場で複数コートを同時進行する割当や対戦順の最適化は含みません。掲示対象は一度に1試合です。
  • 参加者は最大128名。負荷・数十端末での連続運転・実際のプロジェクターでの視認性は未検証です。
  • 任意の規則エディター、複数サーバー運用、DB連携、復元専用の画面はありません。
  • 一般公開用の認証や個人情報の公開範囲管理はありません。従来要件どおり会場LAN内の試作です。
  • データ退避からの復元は、サーバー停止中にJSONを戻す手順です。大会の切替画面で過去大会を選ぶ機能は今後の対象です。

サンプルの数値・名前・所属は実際の大会記録ではありません。 公開資料と現行運用の区別は 大会ルール調査 に残しています。