Skip to content

About

将棋×チェスを切り替えられるターン制ハイブリッド。駒ごとのクールダウン制、王を取れば勝ち (Gleam/BEAM + Wisp/Mist, SSE)。

Resources

Stars

0 stars

Watchers

0 watching

Forks

Latest commit

 

History

81 Commits

Folders and files

Repository files navigation

将棋×チェス ターン制対戦ボードゲーム「クロノ・バリアント」(chrono-variant-web)

Gleam Erlang/OTP Wisp Mist SSE

将棋とチェスを「同じ盤上の時間ルールで遊ぶ」ターン制ボードゲーム。両者を統合するのではなく、 将棋モード(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 購読)

開発セットアップ

1. ツールチェーン

Gleam と Erlang/OTP が必要。macOS は Homebrew で:

brew install gleam   # Erlang/OTP も依存として入る

2. ビルドとテスト

gleam build
gleam test          # 143 件(gleeunit)
gleam format        # CI は `gleam format --check` を実行

3. 起動

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。

ライセンス

個人プロジェクト — 閲覧・実行・学習は自由。

About

将棋×チェスを切り替えられるターン制ハイブリッド。駒ごとのクールダウン制、王を取れば勝ち (Gleam/BEAM + Wisp/Mist, SSE)。

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages