カロリーメイトください

Barbaroi Ware(バルバロイ・ウェア)という名前でアプリ開発してます

天鳳の牌譜ログの<AGARI>タグを解析してみる②

概要

前回の記事の続きです。

www.barbaroiware.net

前回はm属性以外の<AGARI>タグの中身(アガリ形のデータ)について解説しました。

今回は副露したメンツをあらわすm属性について解説します。

解析

m

m属性は以下のような形式で記述されています。

<AGARI>タグはたとえば以下のようなXML属性の形式で保存されています。

m="42367,50251"

ひと目では何を表しているかまったくわかりませんので、ソースコードから読み解いていきます。

https://tenhou.net/img/tehai.js

どうやら、これはデータが格納されている16bitの2進数ビットフィールドを10進数に変換したものということのようです。

たとえば、10進数の"42367"は2進数で表すと"1010010101111111"となり、これが副露した1メンツのデータを表しています。

順子

右から数えて3番目のbit(以下3ビット目)が1の場合、そのメンツは順子であることが確定します。

この場合、各bitの意味は以下の通りになります。

ビット目
1-2ビット目 誰から鳴いたか
3ビット目 必ず1(順子であることを示すフラグ)
4-5ビット目 1枚目の牌を同種牌4枚の中から特定する
6-7ビット目 2枚目の牌を同種牌4枚の中から特定する
8-9ビット目 3枚目の牌を同種牌4枚の中から特定する
10ビット目 (未使用)
11-16ビット目 順子のパターンを示す

まず1-2ビット目は誰から鳴いたかを示します。
これは刻子槓子などの他のメンツにおいても同様です。
数字との対応は以下の通り。

ビット情報 誰から鳴いたか
0(0x00) 自分(暗槓の場合に使用)
1(0x01) 下家
2(0x10) 対面
3(0x11) 上家

チーの場合は必ず上家から鳴くことになるので1-2ビット目は11になります。
00の自分からの鳴きは暗槓のときに使います。

3ビット目は上で説明したとおり、このメンツが順子であることを示します。

説明の都合上、11-16ビット目を先に説明します。

11-16ビット目は順子のパターンを表します。
順子のパターンとはたとえば、「筒子の③④⑤の組み合わせで④をチーした順子」といった情報のことです。
数字との対応は以下の通りです。

ビット情報 順子パターン
0(0x000000) 一二三(一をチー)
1(0x000001) 一二三(二をチー)
2(0x000010) 一二三(三をチー)
3(0x000011) 二三四(二をチー)
4(0x000100) 二三四(三をチー)
5(0x000101) 二三四(四をチー)
18(0x010010) 七八九(七をチー)
19(0x010011) 七八九(八をチー)
20(0x010100) 七八九(九をチー)
21(0x010101) ①②③(①をチー)
22(0x010110) ①②③(②をチー)
23(0x010111) ①②③(③をチー)
39(0x100111) ⑦⑧⑨(⑦をチー)
40(0x101000) ⑦⑧⑨(⑧をチー)
41(0x101001) ⑦⑧⑨(⑨をチー)
42(0x101010) ⅠⅡⅢ(Ⅰをチー)
43(0x101011) ⅠⅡⅢ(Ⅱをチー)
44(0x101100) ⅠⅡⅢ(Ⅲをチー)
60(0x100111) ⅦⅧⅨ(Ⅶをチー)
61(0x101000) ⅦⅧⅨ(Ⅷをチー)
62(0x101001) ⅦⅧⅨ(Ⅸをチー)

順子の場合、萬子・筒子・索子で各7パターンの組み合わせが考えられ、さらにどの牌を鳴いたかの情報が加わりますので、順子のパターンとしては3×7×3=63とおりの組み合わせが考えられます。

順子の組み合わせが特定できたところで、4-9ビット目の牌を特定する情報に戻ります。

順子の組み合わせを特定するだけなら、ここまでのデータで十分なのですが、天鳳では同じ種類の牌でもそれぞれ4枚存在する牌(同種牌)を区別して管理しています。
たとえば「筒子の③④⑤」の③といっても、実際には4枚存在する③の牌のうちのどれを使っているかということはわかりません。
その情報を特定するのが4-9ビット目の情報です。

たとえば、11-16ビット目の情報によって、順子のパターンが「筒子の③④⑤の組み合わせで④をチーしたもの」と特定できたとします。

このとき、4-5ビット目が0x01、6-7ビット目が0x11、8-9ビット目が0x00なら、③は2枚目の③の牌、④は4枚目の④の牌、⑤は1枚目の⑤の牌を使っているということがわかります。

この情報は特に赤牌アリのルールのときに重要な情報になってきます。
赤牌アリのルールのときは五、⑤、Ⅴの牌において、1枚目の牌(すなわち同種牌4枚の中から特定するビット列が0x00)が赤牌として定義されているからです。

案の定長くなってしまったので、刻子槓子のメンツについては次の記事に分けます。

カロリーメイトください。

PR

そんなことを考えながら作ったアプリがこちらです
kankeli.netAndroid
https://play.google.com/store/apps/details?id=com.BarbaroiWare.MahjongScoreDrilliOS
https://apps.apple.com/jp/app/id1493166793