麻雀AIのプログラム構造

今回は 電脳麻将 の思考ルーチン(麻雀AI)のプログラム構造について。

電脳麻将 では対局者を表現するクラスは以下の2つ。

Majiang.Player
コンピュータのプレーヤーを実現するクラス
Majiang.UI
人間のプレーヤーを実現するクラス

Majiang.PlayerMajiang.UI には共通するコードが多いので、Majiang.UIMajiang.Player のサブクラスとした。

続きを読む

電脳麻将 ver.0.4 公開

f:id:xlc:20151231221428p:plain:w240:right

電脳麻将 を ver.0.4 にバージョンアップしました。

今回のバージョンアップでは

  • 麻雀AIの牌効率向上
  • 牌譜のUIの改善(shift+カーソルキーでの移動)

を行いました。

AIはまだ門前立直のみしかできませんが、和了打点が高くなっている分、強くなっていると思います。

ver.0.5 ではオリを実装する予定です。

麻雀の局進行のプログラム方式

電脳麻将 では以下の2つのクラスのインスタンスが互いに通信することで局を進行させている。

Majiang.Game
牌山生成、配牌・自摸の通知、副露に対する適切な手番の割り当て、和了役判定などゲーム進行を司るクラス。麻雀サーバに相当する。
Majiang.Player
打牌選択、副露判断、立直判断、和了判断など対局者の判断を実装したクラス。クライアントに相当する。

その他に人間用のUIを備えたMajiang.UIがあるが、これはMajiang.Playerのサブクラスなので、通信部分のコードは共有している。

続きを読む

電脳麻将の牌譜形式

電脳麻将 ver.0.3 で牌譜再生機能を追加した*1。牌譜再生を実現するにあたり、他のシステム(天鳳とか)の牌譜形式も参照したのだが、どうもしっくりこないので独自のJSON形式である。牌譜形式を定義した目的は2つあって、1つはもちろん牌譜再生だが、より重要な目的としてゲーム進行に使いたいというのがあった。

今回はとりあえず牌譜形式を説明する。ゲーム進行についてはまた別途。

*1:牌譜の保存自体はver.0.2から実装していたが、ver.0.3で牌譜ビューアの機能を追加したというのが実態

続きを読む

麻雀の和了点を計算するプログラム(最終回)

で説明してきた和了点を計算するプログラムも今日で最終回。いよいよ最終目的の点数計算です。

まずは麻雀のルールをおさらい。符と翻数を求めた後は以下の手順で得点を求める。

続きを読む

麻雀の役を判定するプログラム(再)

以前 麻雀の役を判定するプログラム - koba::blog でも一度扱っているが、そのときは正規表現で役を判定していた。今回は 麻雀の符を求めるプログラム - koba::blog で面子構成を求めているのでそれを使って役を判定していく。

電脳麻将和了役判定関数は get_hupai(mianzi, hudi, pre_hupai)

入力は以下の通り。

続きを読む

麻雀の符を求めるプログラム

和了形を求めるプログラム(一般形) - koba::blog の続き。

和了形を求めることができたので、次は符計算である。符計算の際には面子の構成も調べることになるので、それを保存しておいて和了役の判定で使用することにする。

電脳麻将 の符計算を行う関数は get_hudi(mianzi, zhuangfeng, menfeng)

続きを読む

和了形を求めるプログラム(一般形)

和了形を求めるプログラム(特殊形) - koba::blog の続き。

一般形(4面子1雀頭)の和了形を求めるメイン関数は hule_mianzi_yiban()。処理の流れは以下の通り。

  1. 2枚以上ある牌を雀頭候補として抜き取る
  2. 残りの牌で4面子構成できるか調べるために mianzi_all() を呼出す
  3. 得られた4面子に雀頭を差し込んで和了形にする
  4. add_hulepai() を呼出して和了形の面子に和了牌のマークをつける

の繰り返し。

続きを読む