カテゴリ
以前の記事
|
Part 1の続きです。
さて、僕のある牌譜ログではこの卓情報の値が137となっているものがありました。では実際にこの137という整数値から卓の種別を割り出してみましょう。ここでも天鳳牌譜解析スクリプトのtenhou.jsを参考にします。 var GT={ // game type MULTI:0x0001, // 対人戦 NOAKA:0x0002, // 赤ナシ NOKUI:0x0004, // 喰ナシ NAN :0x0008, // 東南 SANMA:0x0010, // サンマ TOKU :0x0020, // 特上 SAKU :0x0040, // 速 HIGH :0x0080, // 上級 taku:function(w) {return (w&0x0020)>>4 | (w&0x0080)>>7;} // 0=一般 1=上級 2=特上 3=鳳凰 }; この137という値はある1つの組み合わせでしか成立しないようになっているでしょうから、一番大きな値から順番に切り出していくのがよいでしょう。まずは137を16進数表記に変換します。これは0x0089となりますね。上のスクリプトを見て、この0x0089以下で最も大きい値は「上級」を示す0x0080ですね。つまりこの対局は上級卓ということです。 次に0x0089から0x0080を引くと、0x0009が残ります。同様の方法で条件を探していくと、次は「東南」の0x0008であることが分かりますね。残るは0x0001で、これは「対人戦」データです。また結局、「喰ナシ」の0x0004と「赤ナシ」の0x0002に引っかかりませんでしたので、「喰いタン有り」かつ「赤有り」ということも分かります。 従って、この対局は「上南喰赤」であることが分かりました。めでたしめでたし(^^)。一応、手順を整理しておきます。 (1) GO typeに記載されている整数値を16進数表記に変換する。 (2) その値をXとすると、X以下で最大となる値を上のスクリプトのvar GTから見つける(鳳凰卓は後述)。 (3) その値に該当する卓情報を抜き出す。 (4) Xとその値の差を再びXに代入する。 (5) (2)~(4)をX=0となるまで繰り返す。 以上です。 ちなみに、上のスクリプトには鳳凰卓の16進数表記がないですね。僕は当然鳳凰条件なんて満たしていないので確かめられません。でも何とかなります。牌譜解析スクリプトを片っ端から見ていけばどこかに書いてあるのかもしれないけど、上のスクリプトにも一番最後の行の計算で「3=鳳凰」とあるので、結果が3になる値を逆算すれば出てくるでしょう。 10進数で3ということは2進数表記で11です。この数値のそれぞれの桁を左へ4bitシフト及び7bitシフトさせると、10100000となります。分かりますでしょうか。 0x0020の2進数表記は100000、0x0080の2進数表記は10000000ですから、それぞれwとのビット積を取って、両者のビット和が10100000になるようなwをを導けば、この計算結果が3(=鳳凰)となるってワケです。そのためにはwの値も同じく10100000でなければなりませんね。最後にこれを16進数表記に変換すると、w = 0x00A0となります。つまりこれが鳳凰卓の値となるのではないかと思います。 もしこれが正しいとすれば、「鳳東喰赤速」での卓情報「GO type」の値は225(16進数表記で0x00E1)になっていると思うのですが、どなたか鳳凰条件を満たしている方にチェックしてもらえると嬉しいな。 【追記:2009-04-04】 実際にスクリプトを組んでmjlogを読み込んでみたんだけど、どうやら鳳凰卓の値(0x00A0)が加わったせいで、卓情報の読み込みは少しだけ複雑になっているみたいです。例えば、「上東喰赤速」の値は0x00C1なんだけど、ここから卓情報を割り出そうとすると、一番最初にヒットするのは0x00A0の鳳凰卓になってしまいます。でも、このまま次の情報を読み出すと、0x0020の特上卓になり、卓ランクの情報が2つになってしまいます。これはおかしいですね。なので、卓ランクの値を2重にカウントした場合は鳳凰の値をスキップすれば大丈夫です。この例でもちゃんと0x0080の上級卓がヒットしますね。めでたしめでたし(^^)
by doraaka
| 2009-04-03 02:14
| 天鳳
|
その他のジャンル
Twitter
記事ランキング
画像一覧
| |||||||||||||||||||||||||||||||||||||||||||||
ファン申請 |
||