2016年12月31日

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

大晦日ですね。昨日の続きで国士無双の判定と、日本語文字の表示を行いました。国士無双に関しては、么九牌13種全て揃っているということと、頭1つで14枚揃っているという二つの条件が必要です。そのため、完成までの牌数の計算にちょっと迷いました。

日本語表示に関しては、画像の読込みにOpenCVを使用していましたので、そのままOpenCV使ってやることにしました。ただ、OpenCVも2系の段階では日本語表示に対応していないようでしたので、[1]のヘッダファイルを使用させていただきました。

実行結果

mj_result_009.png

国士無双は4人打ちで揃えるのは大変ですので、1人打ちにしてデバッグしました。日本語表示するとかなりましになった気がしますね。特殊な判定が必要な国士無双と七対子が終わりましたので、後はその他の役を少しずつ追加していきたいと思います。

[1] OpenCV で日本語を出力しようパート2
web拍手 by FC2
posted by シンドラー at 18:50 | Comment(0) | TrackBack(0) | 日記 | このブログの読者になる | 更新情報をチェックする

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

もう年末ですね。テレビを見ながらゆっくり実装です。今回は七対子の判定を追加しました。七対子は、名前の通り対子が7個ですので、それぞれの種類の牌の数を数えて、2個のものが7個あれば完成となります。分割したパターンでは、槓子を対子2つと区切る場合もありますが、4枚使いの七対子は無しの方針なので、そこの判定にだけ注意が必要です。

後は[1]の背景画像を使用させていただき、上がった時に表示される画面を追加してみました。次は他の役判定と点数計算です。今使っているビットマップフォントはアルファベットのみなので、役の表示とかどうしましょうかね。

実行結果

mj_result_007.png

[1] 4K バックグラウンド 無料素材
web拍手 by FC2
posted by シンドラー at 00:32 | Comment(0) | TrackBack(0) | 日記 | このブログの読者になる | 更新情報をチェックする

2016年12月28日

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

続きです。リーチ判定ができるようになっていたので、ツモ及びロン判定はすぐできました。ツモの時は手牌の14枚、ロンの時は手牌13枚+捨て牌の組を作成し、それの待ちが1個(対子)のみであれば上がれるという判定です。七対子と国士無双は後回しです。

実行結果

mj_result_006.png

これで後は役判定ができれば、一人で四人打ち麻雀ができるようになります。役判定も基本的には力押しで組み合わせパターンを列挙して一番役数が多いものを採用になると思います。
web拍手 by FC2
posted by シンドラー at 03:31 | Comment(0) | TrackBack(0) | 日記 | このブログの読者になる | 更新情報をチェックする

2016年12月25日

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

前回の続きです。リーチ判定をするためには、役が揃うまでに後何手か判定できる必要があるので、まずは役判定の前にリーチ判定を実装しました。

鳴き判定をするために、萬子、索子、筒子、字牌それぞれで対子や順子、両面待ちなどの数を数えていますので、それで判定します。リーチできるのは後2つ必要な牌が来れば上がれる状態ですので、頭の対子を除いて待ちの数が2の場合リーチ可能とします。そして、リーチ可能となる捨て牌の判定ですが、これも力業で(最大)14個の手牌のうち、それぞれ1個取り除いて待ちの数が1になるものを見つけました。

実行結果

mj_result_004.png
リーチするための捨て牌候補を赤枠表示

mj_result_005.png
リーチ後

少し試した範囲では問題なく判定できているようですので、次はロンやツモできるようにしたいと思います。
web拍手 by FC2
posted by シンドラー at 19:59 | Comment(0) | TrackBack(0) | 日記 | このブログの読者になる | 更新情報をチェックする

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) | 日記 | このブログの読者になる | 更新情報をチェックする