某研究施設に勤務する研究者です。研究や趣味の麻雀のこと。

天鳳成績管理ツール
最終更新 2011-03-04

当ブログのデータ等を転載したい場合は筆者まで一報願います。

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
牌譜解析記事まとめ
過去記事へのリンクをまとめています。

カテゴリ
以前の記事
カテゴリ:天鳳( 57 )
【メモ】 mjlogの卓情報を読み込む (Part 2)
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の上級卓がヒットしますね。めでたしめでたし(^^)

[PR]
by doraaka | 2009-04-03 02:14 | 天鳳
【メモ】 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に続きます。
[PR]
by doraaka | 2009-04-03 01:36 | 天鳳
【メモ】 mjlogファイルは常に圧縮されているとは限らない?
今試しに、直接mjlogファイルを読み込むルーチンを作ってみている。
ちなみにmjlogファイルというのは課金版天鳳でプレイすると自動的に保存される牌譜情報のファイルです。

このmjlogファイルは天鳳公式サイトのマニュアルによると、xmlをgz圧縮していると明記されています。

なので、ログが保存されているフォルダ以下にあるmjlogファイルにGZIP解凍をかけるスクリプトを作って走らせてみたところ、ごくわずかのファイルに解凍できないエラーが発生する。どうしてなのかなと、それらのファイルをバイナリエディタで開いてみたところ・・・、

なんと圧縮前のファイル、つまり既にxmlファイルになっているよー!?

調子悪いのは、ファイルの大半はgz圧縮ファイルで、ごくまれに本来のxmlファイルが紛れ込んでいるという状態(^^;)。サーバ側で圧縮をかけるときにエラーでも生じたとき、xmlのままでダウンロードされるってことなのかな?それにしても、gzもxmlも拡張子が同じmjlogだからパッと見て判別できない(圧縮されてないからファイルサイズが大きいけどゲームの長さによるから正確には分からない)。

一応、該当のファイルを移動させて再度ダウンロードしてみたけど結果は同じ・・・、orz。どうして特定のログだけ圧縮されないんだろ?

このために簡単なチェック用のプログラム(checkmjlog)を作ったので、興味あるという奇特な人がもしいたら確かめてみてね(^^;) ← イネーヨ

ちなみに僕のケースでは、

mjlog ファイル数 : 713
-----------------------------------
GZ圧縮ファイル数 : 694
XMLファイル数 : 19
上記以外のファイル数 : 0

という結果になって圧縮されていないXMLファイルが19個も見つかった。

つのさんに聞いてみようかな。
まあ、これが仕様だとすれば、読み込みルーチンは、とりあえず解凍をかけてみて、無理ならアスキーで読んで、xmlのヘッダーとかで牌譜のログであると判別すればいいわけだけど何か気持ち悪いよね(^^;)

どなたか知っている人いませんか?
[PR]
by doraaka | 2009-04-02 07:30 | 天鳳
ツール開発における有志の協力など + version 3.53
天鳳成績管理ツールをGUI化してから、おさむくんや香港のくるるさんなど、他にも紹介してくれた人たちのおかげでたくさんの方々に使ってもらえて、作った甲斐があったなあと単純に嬉しく思っています。

正直、本職のプログラマではないので、こういったフリーのツール開発というのは、手持ちデータで動いた段階でベータ版としてリリースし、その後は使ってくれた人のリクエストやバグ報告などの協力で少しずつアップデートされていきます。

僕が今回感じたのは、このようなツールに対する要望やバグ報告などを積極的にメールしてくれたりする有志の人たちが思ってたよりずっと多いなあということ。特にフリーのツールなんて作者のヤル気がとても大事なので、DLしてくれた人たちがたくさんリクエストしてきてくれたり、バグ報告をしてくれたりってのはモチベーションが維持できるので助かります(^^)。まだ何かやってみようかなという気持ちになるし。

先日、おさむくんとSkypeで話す機会があったんだけど、ライブラリを作って配布したり、ツール開発だって何人かで意見交換とかしながら作ったりして協力し合えるとやれることの幅も広がってくるような気がしますね(^^)。


そうそう、これも有志の方の報告なのですが、version 3.52にちょっとしたバグありましたので修正しました。
降段した場合のポイント計算過程に間違いがありました。でも、その次の昇段で元に戻るので気が付かなかった人も多いと思います。アップデート版(version 3.53)のダウンロードはこちらです。
しっかし、まだバグあったのか、このツールは・・・。
[PR]
by doraaka | 2009-03-31 12:55 | 天鳳
ちょっと便利な小技 + ユーザ設定機能拡張 version 3.52
ちょっと便利な小技ですが、このツールにはデータのロードにショートカットキーが割り当てられています。設定ファイルは起動と同時に読み込まれるので、一度設定をしていれば、次回起動時からは[Ctrl+L]を押すだけでデータをロードできます

それから、少しですがユーザ設定の機能を拡張(移動平均のサンプルデータ数、データのソート方法、牌譜URLの表示等)しました。アップデート版(version 3.52)のダウンロードはこちらです。

こうゆう成績を管理するレベルでは、そろそろ簡単に思いつくことでやれることはなくなってきたかなあ・・・。やっぱり次のステップは牌譜の解析かな。
[PR]
by doraaka | 2009-03-28 23:52 | 天鳳
三麻データ解析機能を実装したけど・・・ちゃんと動くかな(^^;)
僕は天鳳で三麻はほとんど打ったことがないので、データ自体持ってません。でもやっぱり四麻だけじゃなくて、三麻のデータも解析できるといいよなあと思ったので、三麻データ解析機能を実装したベータ版(version 3.5β)を作ってみた。ただし、これは未だ試作段階です(^^;)。自分で動作確認するのが難しいので三麻をやり込んでいる方々に試してもらえると助かります。それ以外の人は従来のversion 3.4をダウンロードしてね。
b0126381_23305341.jpg
まあ、今までは牌譜の読み込み中に三麻のデータが見つかったらフラグを立ててスキップしていたので、そのフラグを逆にするだけですから大した作業じゃありません(笑)。設定ダイアログボックスの左下にある[ゲーム形式]で三麻を選択して実行します。すると、牌譜ログデータファイルから三麻のデータだけを抽出して素点やptなどを計算して表示するはずです。自分で試してないからポイントの計算が上手く行ってるかどうかが非常に不安・・・。バグあったら教えて下さい。あ、ちなみに四麻データの方は今まで通り動作するはずです。
[PR]
by doraaka | 2009-03-25 23:06 | 天鳳
バグ修正 version 3.3
えっと、問題が解決しました。
修正版(version 3.3)のダウンロードはこちらです。

いぶしのけんさんが直接Skypeでデータファイルを転送してくれたのですぐに発見できました。僕の動作確認不足から起きているものでした。エラーが発生して上手く動作しなかった方々、せっかくダウンロードしてくれたのにスミマセン。

version 3.2では、9級~1級までのデータが入っている場合にエラーが発生します。これは僕のログには1級以前のデータがなく、勝手に勘違いして、「9級」を「九級」と漢数字で表記されていると思い込んでいたためです。茨城の小室さんもこれで読み込めると思います(^^)

いぶしのけんさんからデータをテキストで出力できないかとリクエストがありました。実はこのソフトがコンソールアプリケーションだった時代(version 1~2)は結果をcsvとhtmlに吐き出していたのですが、GUIに変更した(version 3)ときに、この部分を放置してしまっていました。このルーチンは既に出来ているので、近日中に実装しますね(^^)。
[PR]
by doraaka | 2009-03-24 18:18 | 天鳳
牌譜ログファイルが読み込めない人手を挙げてー
もし天鳳で全国地域別対抗戦が実現したら同じ「チーム茨城」のメンバーとして他県と戦うことになるだろう小室さんから成績管理ツールを使うと牌譜ログファイルの読み込み時にエラーが返ってくるという報告を受けた。

今、思ったんだけど、確かLivetubeでの配信中に「ログファイルがデカイ。8Mbくらいある」と言っていたような・・・。もしかして、対戦数が多すぎてファイルを全て読み込む前にバッファが一杯になってしまっているのではないかと思った。

ログファイルファイルをコピーして、少ない対戦数のファイルを作って動作するかどうか試してみるという手がありますが、一番確実なのはログファイルを僕に送ってもらえるとソフト自体修正できます。小室さん以外にもソフトに問題が出た方は、直しますので暇なときにでもSkypeの「茨城北HAZ」宛てにデータファイルを送ってください。メールの方がよければ、「haz_ibarakikita アット live.jp」にお願いします(^^)

※追記
僕の環境で仮想のデータを作ってデータファイルを10Mbくらいにして読み込んでみたけど、フツーに動作した。う~ん、どうしてかな。やっぱり実際のデータファイルを見てみないと分からない(悲)。
[PR]
by doraaka | 2009-03-24 00:29 | 天鳳
バグ修正 version 3.1
早速ですが、3.0β版では素点の計算過程にバグありましたので修正しました。
修正版(version 3.1)のダウンロードはこちらです。
[PR]
by doraaka | 2009-03-22 22:12 | 天鳳
天鳳の結果を一覧表示するツールをGUIに移行した
GUIに移行しました。天鳳の牌譜ログファイルを読み込んで一覧表示します。各対局の牌譜URLをクリックするとブラウザで対局を閲覧できます。スクリーンショットはこんな感じ(画像をクリックすると拡大できます)↓
b0126381_22155398.gif
自分の環境でしか試してないから未だバグあるかも知れません。とりあえずベータ版ということで・・・。ダウンロードや詳しい説明はこちらです。アイコンがVisual Studioデフォルトのままなのがカッコ悪いけど、まあそのうちバージョンUP時にでも変更します。

特徴として、自分の成績や牌譜などの対局データを一覧にして整理できる他、過去に対局した相手の牌譜だけを抜き出して表示させることもできます。そういえば、GUI化したことによってコンソールアプリのときの仕様だったcsvとhtmlファイルを吐き出す設定がなくなってしまったので、これもそのうちバージョンUP時に加えときます。

おそらくはWindows Server 2003, Windows Server 2008, Windows Vista, Windows XPで動作すると思いますが、もしこの環境でも動作しない場合は、Microsoft .NET Framework Client Profile Setup Bootstrapperをインストールすると上手く行くかもしれません。

もしバグ報告あればコメお願います。
[PR]
by doraaka | 2009-03-18 06:44 | 天鳳


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