はじめに
みんな~ネット麻雀やってますかー!?
私はみんな大好き天鳳やってます🙂
ところで、天鳳で活躍している麻雀AIをご存知でしょうか。
ちなみにNAGAとは、一度同卓したことがあります、負けたけど😑
麻雀自体が運要素も含むし、麻雀AIって作るの難しいんですよね。作ったこと無いけど。
「麻雀AIを作ってみようかな~?」と興味が湧いてきたので、ちょっとずつ形にしていきたいと思います。
麻雀AIを作るとなれば、まずは対局状況をリアルタイムに把握する必要がありますよね?
取っ掛かりとして、天鳳の通信のパケットキャプチャから検証してみましょう。
他にも私のブログで、麻雀について解説している記事がありますのでご覧ください。
天鳳のAIについて
天鳳で麻雀AIを作って動かすことって良いのかという話ですが、天鳳の創始者のつのだ氏の記事を見てましょう。
これまではボットが段位戦を行うことを許可してきませんでしたが、許可制にしてコンピュータプレーヤの参戦を解禁していこうと考えています。
ちなみにSuphxの許可時の記事。
ですので麻雀AIの参加自体は可能です。というかすでに活躍してますしね。
では麻雀AIを作るとして、どのようにしてリアルタイムで対局を認識すればよいのでしょうか。
天鳳は独自APIが用意されていないため(多分今現在も)、通信のキャプチャか、画像認識などで解析することになると思います。
つのだ氏は画像認識をお勧めしておりました。
ですが、今のところはAPI準備までの優先順位があんまり高くないので時間がかかる可能性があります。
少なくともスマホ版リリースより後になります。
たぶん、私がAIを作るなら画像認識とマウスエミュレートで作ると思います。
画像認識の場合、天鳳以外の麻雀ゲームにも応用できそうと思い、私は最初、OpenCVを使って実装しましたが、難易度が高くて挫折しました😱
ちなみに爆打の場合は、画像認識だそうです。
ということで、天鳳ブログに記載の通り、許可制ではありますが麻雀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#で行う記事も書こうと思います。
それでは。🙂
他にも私のブログで、麻雀について解説している記事がありますのでご覧ください。
コメント