2016年12月23日

麻雀プログラムの作成 その1

いつの間にか年末ですね…。今回は麻雀プログラムの作成です。役判定とかAIとかかなり面倒な実装が必要ですね。参考文献は[1][2]などです。本はあまりなく、ネットで検索した方が色々情報がありそうでした。言語としてはC++でOpenGL使っています。OpenGLは一枚の平面に画像貼って表示してるだけです。

とりあえずは役判定やAIは後回しにして、配牌や自摸切り、鳴きを実装してみました。牌画像は[3]のものを使用させていただいております。

実行結果

mj_result_001.png

縦に手牌と捨て牌並べているので見えづらいですね。加槓が捨て牌に重なってたり文字表示もビットマップフォント使っていたり手作り感満載です。

ここまでで問題になったのは、鳴けるかどうかの判定処理です。これをするためには、手牌を解析してトイツや両面待ちなどがあるかどうか調べておく必要があります。最近は計算機の性能が上がっていてゴリ押しでも十分速いので、スタックを使ってすべての組み合わせを列挙して保持しておくことにしました。

mj_algo_001.png

最初に上記のように1個だけ、一番左を処理候補としたデータをスタックに積みます。

mj_algo_002.png

その後、1個取り出して取りうる候補(A〜F)を列挙して、またスタックに積みます。次はFを取り出して…とFILO方式ですべての候補がなくなるまで繰り返します。

上の方法の場合、対子―単騎と単騎―対子などの組み合わせがダブってしまいますが、とりあえず列挙して後で被っているものは削除しました。ちゃんと考えれば被らずに一度で終わらせる方法もあるとは思います。

チーの場合は複数候補が考えられますので、それを表示して選択するようにしました。ここまでで上がれないけれど一応打つことはできるようになったので、次は役判定に入りたいと思います。

mj_result_003.png

[1] 有馬元嗣著,"ゲームプログラミング 遊びのレシピ", ソフトバンク株式会社,1997
[2] 石畑恭平著, "コンピュータ麻雀のアルゴリズム", 株式会社工学社,2007
[3] 【保存版】商用無料の高クオリティーの麻雀画像の無料素材まとめ
web拍手 by FC2
posted by シンドラー at 21:41 | Comment(0) | TrackBack(0) | 日記 | このブログの読者になる | 更新情報をチェックする

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。