人気ブログランキング | 話題のタグを見る

某研究施設に勤務する研究者です。研究や趣味の麻雀のこと。
当ブログのデータ等を転載したい場合は筆者まで一報願います。

S M T W T F S
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
カテゴリ
以前の記事
【メモ】 mjlogの卓情報を読み込む (Part 1)
天鳳mjlogファイルをXML形式に変換して適当なビューアで開いてみると牌譜情報がXMLタグに収まっているのを見ることができます。

<mjloggm ver="2.3"><GO type="97"/>

冒頭にログのバージョン情報があって、その次の「GO」にタグが見つかります。ここには「type」というインデックスがあり、ある整数値(上の例だと97)の属性が与えられています。牌譜解析スクリプトのtenhou.jsをテキストビューアで見るとこれはどうやら卓情報のようで、おさむくんのメモにもそう書かれています。そして、これがログ解析の最初の難所でしょうか。

要するに、この整数値が「特東喰赤速」などの卓情報に対応しているってワケです。実は上に示したログの例は「特東喰赤速」の牌譜なので、97という整数はこれに対応しているはずです。ここには、この整数値からどのように卓情報を解析していくか、その過程をメモとして残しておきます。

天鳳牌譜解析スクリプトの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=鳳凰
}; 

ふむふむ、なるほど。なかなか凝ったことやってるなあ。
どうやらルールや卓のランクを16進数で表記していて、その総和で卓情報を表しているようです。実際に「特東喰赤速」を例に計算してみると、

0x0001(対人)+0x0020(特上)+0x0040(速) = 0x0061

となりました。これを10進数表記に変換すると97になりますね。めでたしめでたし(^^)。

でも実際の使い方は、これと逆で整数値から卓の情報を割り出さなくちゃいけないんだよね。上に書いたJaveScriptをもう一度よく見ると、一番最後の行に卓のランク分けに関する記述があるな。一般、上級、特上、鳳凰を0~3で判別しているようです。その計算式をみると、

return (w&0x0020)>>4 | (w&0x0080)>>7

この式の中の&や|、>>はビット演算子なので2進数での計算式ということか。試しにさっきの「特東喰赤速」を表す97で計算してみよう。

まず、97を2進数表記に変換すると、1100001となります。これが上の式のwに代入されます。

次に(w&0x0020)>>4を見ていきます。これは0x0020を2進数に変換(100000)して、wとのビット積(&)を取ります。すると100000という値が得られました。>>は右シフトを表すビット演算子なので、100000を4bit分右にずらすと、10という値になりますね。

同様に(w&0x0080)>>7についても、0x0080を2進数に変換(10000000)して、wとのビット積を取ると、こちらは0になります。ですので当然ビットシフトをかけてもゼロです。

最後に両者(10と0)のビット和(|)を取ると、10という値が得られますね。これを10進数に変換すると2になります。上のスクリプトのコメント欄に「2=特上」とありますね。どうやらこうゆう仕組みのようです。

Part 2に続きます。
by doraaka | 2009-04-03 01:36 | 天鳳
<< 【メモ】 mjlogの卓情報を... >>


その他のジャンル
Twitter
記事ランキング
画像一覧
AX