今回は 電脳麻将 の思考ルーチン(麻雀AI)のプログラム構造について。
電脳麻将 では対局者を表現するクラスは以下の2つ。
Majiang.Player
- コンピュータのプレーヤーを実現するクラス
Majiang.UI
- 人間のプレーヤーを実現するクラス
Majiang.Player
と Majiang.UI
には共通するコードが多いので、Majiang.UI
を Majiang.Player
のサブクラスとした。
麻雀の局進行のプログラム方式 - koba::blog、麻雀の局進行のプログラム実装 - koba::blog で局進行のための通信方式は説明したので、今回は状態遷移について。
流局判定をのぞくと一局の状態遷移は下図のようになる。
続きを読む麻雀の局進行のプログラム方式 - koba::blog で 電脳麻将 の局進行はGame(サーバ)とPlayer(クライアント)間の通信で実現していることを説明したが、今回はその実装方法について。
まず両クラスの役割分担だが、以下とした。
続きを読むで説明してきた和了点を計算するプログラムも今日で最終回。いよいよ最終目的の点数計算です。
まずは麻雀のルールをおさらい。符と翻数を求めた後は以下の手順で得点を求める。
続きを読む以前 麻雀の役を判定するプログラム - koba::blog でも一度扱っているが、そのときは正規表現で役を判定していた。今回は 麻雀の符を求めるプログラム - koba::blog で面子構成を求めているのでそれを使って役を判定していく。
電脳麻将 の和了役判定関数は get_hupai(mianzi, hudi, pre_hupai)
。
入力は以下の通り。
mianzi
hudi
pre_hupai
和了形を求めるプログラム(一般形) - koba::blog の続き。
和了形を求めることができたので、次は符計算である。符計算の際には面子の構成も調べることになるので、それを保存しておいて和了役の判定で使用することにする。
電脳麻将 の符計算を行う関数は get_hudi(mianzi, zhuangfeng, menfeng)
。