自分だけのクイズ作成 - Quipha公開中

麻雀AIを作ろう~天鳳の通信キャプチャ編~

麻雀
スポンサーリンク

はじめに

みんな~ネット麻雀やってますかー!?
私はみんな大好き天鳳やってます🙂

ところで、天鳳で活躍している麻雀AIをご存知でしょうか。

マイクロソフトが開発したSuphx(スーパーフェニックス)とか、爆打NAGAなどです。

ちなみにNAGAとは、一度同卓したことがあります、負けたけど😑

麻雀自体が運要素も含むし、麻雀AIって作るの難しいんですよね。作ったこと無いけど。
「麻雀AIを作ってみようかな~?」と興味が湧いてきたので、ちょっとずつ形にしていきたいと思います。

麻雀AIを作るとなれば、まずは対局状況をリアルタイムに把握する必要がありますよね?
取っ掛かりとして、天鳳の通信のパケットキャプチャから検証してみましょう。

天鳳のAIについて

天鳳で麻雀AIを作って動かすことって良いのかという話ですが、天鳳の創始者のつのだ氏の記事を見てましょう。

天鳳のAIの参加は許可制のようです。

許可を受けたコンピュータプレーヤの参戦を解禁する予定です!
これまではボットが段位戦を行うことを許可してきませんでしたが、許可制にしてコンピュータプレーヤの参戦を解禁していこうと考えています。 許可を受けたプレーヤは必ず「ⓘ和牛」のようなプレフィックスの付いたプレーヤ名で対戦する必要があります。 許可されていないボットはIDを停止します。 他にも以下のような条件を考えてい...

これまではボットが段位戦を行うことを許可してきませんでしたが、許可制にしてコンピュータプレーヤの参戦を解禁していこうと考えています。

ちなみにSuphxの許可時の記事。

AI専用IDへの申し込みがありました。特上卓までの対戦を許可する予定です。プレーヤ名「ⓝSuphx」
AI専用IDへの申し込みがありました!! イベントの協賛などAIのID発行には様々なハードルがありますが、クリアしていただけるとのことでしたのでIDの発行に至りました。 以下AIのプロフィールです。 ------------------------------- このたび、麻雀AI「Suphx」が天鳳に新しく参戦...

ですので麻雀AIの参加自体は可能です。というかすでに活躍してますしね。

では麻雀AIを作るとして、どのようにしてリアルタイムで対局を認識すればよいのでしょうか。

天鳳は独自APIが用意されていないため(多分今現在も)、通信のキャプチャか、画像認識などで解析することになると思います。

つのだ氏は画像認識をお勧めしておりました。

麻雀AIは天鳳独自のAPIや通信パケットで作るべきか、それとも画像認識とマウスエミュレートで作るべきか? ⇒ 私ならマウスエミュレート
AI用のAPIは用意されるのか?という質問が何件かありました。 多分そういう作法が一般的なネットサービスの流れだとは思いますし、それは知っています。 ですが、今のところはAPI準備までの優先順位があんまり高くないので時間がかかる可能性があります。 少なくともスマホ版リリースより後になります。 たぶん、私がAIを...

ですが、今のところはAPI準備までの優先順位があんまり高くないので時間がかかる可能性があります。
少なくともスマホ版リリースより後になります。
たぶん、私がAIを作るなら画像認識とマウスエミュレートで作ると思います。

画像認識の場合、天鳳以外の麻雀ゲームにも応用できそうと思い、私は最初、OpenCVを使って実装しましたが、難易度が高くて挫折しました😱

ちなみに爆打の場合は、画像認識だそうです。

ということで、天鳳ブログに記載の通り、許可制ではありますが麻雀AIの稼働や、そのために通信のキャプチャや画像認識による対局情報を取得することは問題ないと思われます。

当然のことですが、迷惑行為や不正を行うことは絶対にしてはいけません
それを踏まえた上で、本記事が麻雀AIの発展に少しでも寄与や、自分でも作れるといいなぁと思っています。

この後解説するのは、通信のパケットキャプチャによるもので、個人的にはそちらの方が楽かと思います。
ただし、天鳳独自の通信内容を解析する必要がありますが。

Wiresharkで通信確認

Wiresharkで通信をキャプチャする方法は、以下の記事を参考にして下さい。
天鳳の通信は暗号化されているため、以下の手順が必要になります。

ざっくりIPアドレスを絞りました。

ip.addr == 160.16.100.0/16

実際に鳳の通信をWiresharkで確認してみました。
天鳳ログイン後の「HELO」という通信が見えています。(WebSocketで通信)

Tsharkで確認

Tsharkでのコマンド例です。

"C:\Program Files\Wireshark\tshark.exe" -i 2 -l -Y "websocket" -e text -Tfields -f "net 160.16.0.0/16 and tcp port 443"

-i : インターフェースの番号を指定
-l : 各パケットの後に標準出力をフラッシュ(リアルタイムで表示)
-Y : 表示フィルター(天鳳はWebsocketで通信しているのでこれのみ表示)
-e text -Tfields : 通信内容をテキスト表示
-f : キャプチャフィルター(tsharkは通信内容を一時ファイルに保存しているので、天鳳サーバーの通信のみ保存するように指定する)

Wireshark同様に、通信内容が見えています。

実際の対局中の通信は以下のような内容になります。
この内容を解析することにより、打牌や鳴きなどを判断することができます。

{"tag":"INIT","seed":"0,0,0,1,2,95","ten":"250,250,250,250","oya":"0","hai":"80,63,103,47,34,27,45,76,58,109,32,91,25"}
Timestamps,{"tag":"T66"}
Timestamps,<Z/>
Timestamps,{"tag":"D","p":109}
Timestamps,{"tag":"D109"}
Timestamps,{"tag":"U"},{"tag":"e64"},{"tag":"V"},{"tag":"f38"}
Timestamps,{"tag":"W"}
Timestamps,{"tag":"g70","t":"4"}
Timestamps,{"tag":"N"}
Timestamps,{"tag":"T74"}

Tsharkを利用すれば、C#で自作したアプリの方でも通信をリアルタイムで読み込むことができます。

最後に

今回は天鳳の通信を取得して確認してみました。
その通信内容を解析することにより、リアルタイムで対局の状況を把握することができます。
それにより、麻雀AIを作る第一歩が踏み出せたと思います。

次回、機会があれば通信内容の解析をC#で行う記事も書こうと思います。

それでは。🙂

コメント

タイトルとURLをコピーしました