ポジションID

gnubgで、"4HPwATDgc/ABMA"のような文字列を見たことがあるかと思います。 これはバックギャモンのポジションを表しています。ここでは、この文字列を作成・解釈する方法について説明します。

原文は、 http://www.gnubg.org/documentation/doku.php?id=appendix#16です。 (ちなみにこの文書は原文の翻訳ではないので注意してください)

gnubgではポジションを10バイトのバイナリとして保存しています。 上の文字列はそれを、画面上に表示したりメールでのやりとりが 簡単になるように14文字の(ASCII)文字列にしたものです。10バイトのバイナリをキー、 14文字の文字列をIDと呼びます。

(注意) ポジションIDは純粋にポジションを表すだけで、キューブの位置・大きさ、 スコアやルールなどについての情報は一切持ちません。

キーのフォーマット

キーは本質的にはビット("0"と"1")の並びです。 ポジションから、次のルールに従って作成されます。

 
  1. 手番を持つプレイヤーの1ポイントから24ポイント、そしてオンザバーのそれぞれについて、
    1. (もし存在すれば)そのポイントにある自分のチェッカーの数だけ 1を追加する
    2. 0を追加する
  2. 相手のプレイヤーの1ポイントから24ポイント、そしてオンザバーのそれぞれについて、
    1. (もし存在すれば)そのポイントにある相手のチェッカーの数だけ 1を追加する
    2. 0を追加する
  3. (80ビットに足りない場合は) 80ビットになるように0で埋める。

 

手番を持たないプレイヤーのチェッカーの分布の情報がまず先にきて次に手番を持つプレイヤーのチェッカーの分布の情報がきます。手番の情報は match id にあります。

この方法をとればどんなポジションでも80ビット以内で表現できます。一つもあがっていないときに80ビット必要、 双方が全部あがっているがらがらのボードで50ビット。そして、このビット列はリトル・エンディアン で保存されるべきです(should be)。

例として次のポジションからどのようなキーが作られるか見てみましょう。

Money game White on roll.
135partspartspartspartspartspartspartspartspartspartspartspartspartspartspartspartspartspartspartspartspartspartspartspartspartspartspartspartspartspartspartspartspartsparts
145
GNUBg ID: 4NvBA0DGzooBBg:MAEAAAAAAAAA
 0 0 0 0 0          # 自分(振り番ではない)のエースから5ポイントに駒はない
 11111 0            # 6ポイントに5つある
 11 0               # バーポイントに2つ
 111 0              # 8ポイントに3つ
 0 0 0 0            # 9-12ポイントには無い
 1111 0             # ミッドに4つ
 0 0 0 0 0          # 13-18ポイントにチェッカー無し
 0 0 0 0 0 0        # 相手のインナーにも無い
 1 0                # オンザバーに1枚乗っている

-----ここまで自分(振り番でない)のチェッカーの分布の情報------------

 0                  # 相手はエースには無い
 11 0               # 2ポイントに2枚
 0 0                # 3,4ポイントは空いている
 11 0               # 5ポイントに2枚
 111 0              # 6ポイントに3枚
 0                  # バーポイントは無し
 11 0               # 8ポイントに2枚
 1 0                # 9ポイントに1枚
 1 0                # 10ポイントに1枚
 0 0                # 11,12ポイントは空き
 11 0               # ミッドに2枚
 0 0 0 0 0          # 14-18には無い
 0 0                # 19,20ポイントにも無い
 11 0               # 21ポイントアンカー(2枚)
 0 0 0              # その他のインナーに空き
 0                  # オンザバーには無い
これらを全部まとめると、
00000111110110111000001111000000000000100110001101110011010100011000000001100000

リトルエンディアン(簡単に言うと、8文字ずつ切り出して前後を入れ替えるということ)のバイト列では

11100000 11011011 11000001 00000011 01000000 11000110 11001110 10001010 00000001 00000110
  0xE0     0xDB     0xC1     0x03     0x40     0xC6     0xCE     0x8A     0x01     0x06
したがって、10バイトのキーは(16進数で)、E0 DB C1 03 40 B6 BE 8A 01 06 ということになります。


IDのフォーマット

IDのフォーマットはとても簡単です。

  • キーをBase64でエンコードする
  • 最後に2つの"="が付くがそれは無視する

Base64が何かということはここでは説明しませんが、 メールで添付ファイルを送るときに変な文字列を見たことがあるかと思います。 要するにあれのことです。(全然説明になってないので、一つだけページを紹介しときます。 http://www.mars.dti.ne.jp/~torao/program/mail/base64.html

上で求めたキーをエンコードすると、

 4NvBA0DGzooBBg

になります。

Notes


Hironobu Yazawa( modify by kinchan 2009/9/18 )