将棋とチェスを「同じ盤上の時間ルールで遊ぶ」ターン制ボードゲーム。両者を統合するのではなく、 将棋モード(9×9)とチェスモード(8×8)を切り替え、共通の Chrono(時間)機構と「玉/キング捕獲で勝利」を共有する。
最大の特徴は時計が実時間(秒)ではなく 1 手(ターン)ごとに進むこと。動かした駒はその種類ごとの 硬直ターン数だけ凍結し、盤上にカウントダウンとして表示される。速く指しても有利にならない、 「手数で管理する」対戦になる。
- 2 モード切替: 将棋(9×9)/ チェス(8×8)を別モードとして提供。共通の時間・勝敗ロジックを共有する。
- ターン制 Chrono: 手数はプレイヤー別に数え、自分が1手指すごとに+1。実時間で進まず、相手の手では自分の駒の硬直は進まない(自分の手数だけで数える)。
- 駒ごとの硬直: 動いた駒は一定ターン凍結し、駒の上に赤いカウントダウンが出る。歩・ポーン・玉/キングは硬直なし。
- 交互ターンを強制しない: どちらの陣も、準備できた(凍結が解けた)駒をいつでも動かせる。
- 設定(両者の同意制): 対局中に硬直の緩さ(倍率 なし/×0.5/×1/×1.5/×2)を提案でき、相手が承認すると適用される(盤ページの「設定」パネル)。
- 捕獲で勝利: 相手の玉(将棋)/ キング(チェス)を取れば勝ち。王手・詰みは扱わない。
- 2 タブ / 2 端末で対戦: サーバ側の同一ゲームを共有。同一 LAN の別端末からも参加できる。
- 言語/ランタイム: Gleam / Erlang OTP 27〜29 (BEAM)
- Web サーバ: Mist(HTTP + Server-Sent Events)
- ルーティング: Wisp
- 直列化: gleam_json / gleam/dynamic/decode
- 並行性: gleam_otp(対局状態を保持する Game Actor)
- フロント: 外部依存なしの素の HTML + CSS + Vanilla JS(SSE 購読)
Gleam と Erlang/OTP が必要。macOS は Homebrew で:
brew install gleam # Erlang/OTP も依存として入るgleam build
gleam test # 143 件(gleeunit)
gleam format # CI は `gleam format --check` を実行gleam run -m chrono_variant/server # http://localhost:8080
PORT=9000 gleam run -m chrono_variant/server # ポート変更起動時に localhost と LAN の URL を表示する。同一ネットワークの別端末でその URL を開けば参加できる。
ブラウザで / を開いてモードを選び、駒をクリック → 移動先クリックで動かす。同じモードを 2 タブ/端末で開くと対戦できる。
| パス | 内容 |
|---|---|
GET / |
モード選択(将棋 / チェス) |
GET /shogi , /chess |
対戦盤(HTML・インライン CSS/JS) |
GET /<mode>/api/state |
現在の全状態 {"tick","status","pieces":[…]} |
POST /<mode>/api/move |
{"id","x","y","promote"?} を適用 → 新状態 / 4xx |
GET /<mode>/sse/state |
text/event-stream。全状態を配信(相手の手の同期用) |
<mode> は shogi または chess。
駒ごとの硬直ターン数は src/chrono_variant/balance.gleam に集約。数字を変えるだけでテンポを再調整できる。
| 将棋 | 歩/玉 | 香/桂 | 銀/金 | 角/飛 |
|---|---|---|---|---|
| 硬直 | 0 | 1 | 2 | 3 |
| チェス | ポーン/キング | ナイト | ビショップ/ルーク | クイーン |
|---|---|---|---|---|
| 硬直 | 0 | 1 | 2 | 3 |
玉/キングは捕獲で負けるため硬直なし(常に逃げられる)。
成りは将棋で +1(と金 = 1 など)、チェスの成ったポーンはクイーン相当(3)。
- 成り: 将棋は成れる駒が敵陣(先手 y=1..3 / 後手 y=7..9)に出入りする手で成りを選べる(行き所のない駒は強制成り)。チェスのポーンは最終段で自動的にクイーン化。
- 前進方向: 先手は下段(y=7..9)から相手(y=1..3)へ向かって進む(前進は y を減らす)。後手は逆。チェスは白が y を増やす方向へ進む。
src/chrono_variant/core.gleam… 共通型(Player / Position / PromotionStatus / GameMode / Piece(kind))src/chrono_variant/tick.gleam… Chrono(can_move / get_interval_ticks / IntervalConfig)src/chrono_variant/handicap.gleam… 編成検証(validate_deck / calculate_total_cost)src/chrono_variant/game.gleam… ターン進行エンジン(合法手・捕獲・勝敗・状態、純粋)src/chrono_variant/game_actor.gleam… GameState を保持する OTP Actor(kind ジェネリック)src/chrono_variant/balance.gleam… 駒ごとの硬直調整(将棋/チェス設定)src/chrono_variant/board.gleam… 盤面の occupant ルックアップ(汎用)src/chrono_variant/shogi/{piece,moves,rules}.gleam… 将棋の初期配置・到達マス・対戦ルールsrc/chrono_variant/chess/{piece,moves,rules}.gleam… チェスの初期配置・到達マス・対戦ルールsrc/chrono_variant/web/{shogi,chess}.gleam… モード別の JSON・ルート・盤ページsrc/chrono_variant/server.gleam… Mist サーバ(両モード + SSE をマウント)src/chrono_variant/net_info.gleam… 起動 URL / LAN IP 整形.kiro/specs/… 各スライスの要件・設計・タスク(SDD)
王手 / 詰み / 自玉が取られる手の禁止 / 持ち駒 / キャスリング / アンパッサン / 認証 / 永続化 / ネットワーク越し(LAN を超える)対戦 / AI。
個人プロジェクト — 閲覧・実行・学習は自由。