gnubgで、"4HPwATDgc/ABMA"のような文字列を見たことがあるかと思います。 これはバックギャモンのポジションを表しています。ここでは、この文字列を作成・解釈する方法について説明します。
原文は、 http://www.gnubg.org/documentation/doku.php?id=appendix#16です。 (ちなみにこの文書は原文の翻訳ではないので注意してください)
gnubgではポジションを10バイトのバイナリとして保存しています。 上の文字列はそれを、画面上に表示したりメールでのやりとりが 簡単になるように14文字の(ASCII)文字列にしたものです。10バイトのバイナリをキー、 14文字の文字列をIDと呼びます。
(注意) ポジションIDは純粋にポジションを表すだけで、キューブの位置・大きさ、 スコアやルールなどについての情報は一切持ちません。
キーは本質的にはビット("0"と"1")の並びです。 ポジションから、次のルールに従って作成されます。
|
■ 手番を持たないプレイヤーのチェッカーの分布の情報がまず先にきて次に手番を持つプレイヤーのチェッカーの分布の情報がきます。手番の情報は match id にあります。
この方法をとればどんなポジションでも80ビット以内で表現できます。一つもあがっていないときに80ビット必要、 双方が全部あがっているがらがらのボードで50ビット。そして、このビット列はリトル・エンディアン で保存されるべきです(should be)。
例として次のポジションからどのようなキーが作られるか見てみましょう。
135 | |
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のフォーマットはとても簡単です。
|
Base64が何かということはここでは説明しませんが、 メールで添付ファイルを送るときに変な文字列を見たことがあるかと思います。 要するにあれのことです。(全然説明になってないので、一つだけページを紹介しときます。 http://www.mars.dti.ne.jp/~torao/program/mail/base64.html)
上で求めたキーをエンコードすると、
4NvBA0DGzooBBg
になります。