RULES · BACKGAMMON
AI CUP Backgammon 競技ルール
ダイスという偶然を含む競技を同じ条件で競わせ、あとから第三者が出目と棋譜を検証できるようにするためのルールです。
開催中01
対戦方式
- 1カードは2局で構成し、Game 1とGame 2でBLACK / WHITEを交換します。
- 両局で同じダイス列を使います(duplicate dice)。
- カード結果は勝った局数です。バックギャモンに引き分けは無いため、1勝1敗はDRAWとして扱います。
- ダブリングキューブは使いません。
02
ダイス — commit-reveal
シードを公開するだけでは何も証明できません。対局前や対局中に公開すれば以降の出目が全て予測でき、対局後にだけ公開しても「運営が有利なシードを選び直していない」ことは第三者に示せません。そこで公開の順序を次に固定しています。
| 時点 | 公開されるもの |
|---|---|
| 下書き(非公開のカード) | 何も無し。シードをまだ作りません |
| カードを公開する瞬間 | commitment = SHA-256(UTF-8(seed))。シード自体は非公開 |
| 対局中 | commitmentのみ |
| カード終了後・取消後 | シードを公開。以後commitment・全出目・全盤面遷移を検証できます |
- 下書きの時点ではシードを作りません。作ってしまうと、運営がシードを覗いてから都合のよいカードだけを公開できてしまい、commitmentを先に出す意味が無くなります。
- 一度公開したカードのcommitmentは、非公開化しても取消しても消えません(追記のみの台帳)。取消したカードはシードも開示します。
- 再実行(clone)は新しいカードとして新しいシードを使います。終了済みカードのシードは公開済みなので、再利用すると全出目が対局前に判明してしまいます。
出目の導出
第三者が独自の実装で再現できるように、曖昧さを残さず固定しています。
- seed … 32バイト乱数を小文字16進64文字にした文字列
- commitment … SHA-256(UTF-8(seed)) の小文字16進
- HMAC鍵 … UTF-8(seed)(64バイト)
- メッセージ … UTF-8("<ply>:<nonce>:<round>")(10進・ゼロ埋めなし)
- 出目 … HMAC-SHA256の32バイトを先頭から1バイトずつ読み、byte < 252 を採用して byte % 6 + 1 とします(252 = 6×42。偏りを作らないため)。252以上は破棄し、32バイトで2個揃わなければroundを+1して再計算します
- 出目の対は常に降順へ正規化します(振った順序に意味はありません)
- オープニングロール … ply = 1, nonce = 0 の2個を取り、1つ目をBLACK、2つ目をWHITEに割り当てます。同目ならnonceを+1して振り直します。大きい目の側が先手で、その手番はその2目を使います
- ダイス生成規則の版は bg-dice-v1。変えたら版を上げます
限界も開示します
- 1手目の判断が分かれれば局面は分岐します。duplicate diceは分散を減らす手法であって、運を消すものではありません。
- commitmentが示すのは「シードを事後に選び直していない」ことだけです。生ログは非公開なので、棋譜がモデルの実応答であることは運営の運用に依存します。
03
AIへ渡す情報
すべてのモデルへ、次の情報を同じ形式で渡します。
- 自分の色(BLACK / WHITE)
- その手番の出目(ゾロ目なら「4回使える」ことも明示します)
- 双方のピップカウント(残りの移動距離。小さいほど有利)
- バーと上がり(off)の枚数
- 盤面図(手番側視点。自分から見て24が最も遠く、1が最も近い)
- 全合法プレイの一覧(重複する局面を除いた全件。打ち切りません)
- JSONによる回答形式
盤面・合法プレイ・ヒット・ベアオフ・終局・点数の判定は、すべてサーバー側のBackgammon Engineが行います。AIにルール処理は任せず、モデルの回答は必ずエンジンで検証します。
回答形式
{ "move": "13/7 8/5", "reason": "ブロットを作らずに自陣を固める。" }reasonは公開可能な簡潔な判断理由です。内部の思考過程そのものは要求しません。
一覧の並び順も条件の一部です
全合法プレイを渡す方式では、並び順がモデルの選択に影響しえます。そのため起点の降順→終点の降順に固定し(from-desc-to-desc-v1)、探索順や実装の都合に依存させません。
プロンプトのハッシュは、system文だけでなくuserと再問い合わせのテンプレート、並び順規則の版も含めて計算します。盤面図の書式や一覧の並びが変われば条件そのものが変わるためです(Reversiはsystem文のみが対象で、両競技で範囲が違います)。
04
プレイの表記
手番側視点の標準バックギャモン表記を使います。
- 13/7 8/5 … 自分の13から7へ1枚、8から5へ1枚
- bar/22 … バーから復帰
- 6/off … 上がり
- 8/5* … 相手のブロットを打つ(*がヒット)
この表記は手番側視点なので、表記だけでは動いた場所が一意に決まりません。必ず色と組で解釈します。公開ページの盤面は絶対座標(1〜24)で固定して描き、動いた駒は前後の盤面の差分から強調しています。
回答は書式に寛容・合法性に厳格として扱います。区切り(空白・カンマ・全角空白)、大文字小文字、ヒット記号の有無、繰り返し 6/3(2)、連鎖 13/11/8 の揺れは受け付けます。
05
指せる手が無い手番
出目で1つも動かせないことがあります(バーから復帰できない等)。このときはNONEを要求します。ReversiのPASSと同じ扱いです。
- 棋譜には1手として記録します。全ての手番を残すためです。
- 指せる手があるのにNONEを返した場合は不正手として扱います。
06
決着と点数
- 15枚すべてを上がった側の勝ちです。
- 相手が1枚でも上がっていれば1点。
- 相手が0枚ならギャモンで2点。
- さらに相手の駒がバーか勝者のホームボードに残っていればバックギャモンで3点。
不正回答による敗北(forfeit)とno_contestでは点数を付けません。中断した局面からギャモンを判定すると、まだ確定していない点数を与えることになるからです。戦績の「平均獲得点」は通常終局した局だけを分母にします。
07
Eloレーティング
Eloは勝敗のみ(1 / 0)で計算し、点数は持ち込みません。計算式・K=24・可視性の規定は全競技共通のルールをそのまま適用します。点数(1/2/3)は戦績表示のためだけに記録します。バックギャモンに引き分けは発生しません。
08
手数上限 — 1局200手で打ち切る
1局が200手(両者の手番の合計)に達しても決着しない場合、その局は打ち切ってno_contestとします。勝敗も点数も付けません。no_contestが1局でも出たカードは、カード全体がElo対象外になります。
- なぜ200手か … バックギャモンの1局は通常50手前後で終わります(外部の大規模集計で平均37〜54手)。200手は通常の3〜4倍で、正常な長期戦を切らずに、進行しない対局だけを止められます。
- なぜ必要か … 実測で、互いのブロットを打ち合い続けた結果130手経っても双方のピップが開始時より悪化している対局がありました。打ち切りが無いと費用だけが増え続けます。
- なぜ勝敗を付けないか … 打ち切った局面で「ピップが少ない側の勝ち」とすると、まだ決まっていない結果を競技側が創作することになります。
09
第三者が検証する手順
- 1カードのcommitmentを対局前の記録から取ります。
- 2カード終了後に公開されたシードを取り、SHA-256(UTF-8(seed))がcommitmentと一致することを確認します。
- 3上の導出規則で出目を再生し、棋譜の各手番の出目と一致することを確認します。
- 4各手番のboard_beforeと出目とselected_playからboard_afterを再計算し、一致することを確認します。
初手だけは注意してください。オープニングロールは同目ならnonceを進めて振り直すため、ply = 1 の出目は生の HMAC(seed, "1:0:0") の結果と一致しないことがあります(およそ6回に1回のシードで食い違います)。初手はオープニングロールの規則で求めてください。
