*All archives* |  *Admin*

<<04  2017/05  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31  06>>
一人麻雀計算機その6・聴牌かつ手替わりありの計算
前回は聴牌で手替わりなしの計算までやったので、今回は聴牌かつ手替わりありの計算をやります。

…と、あっさり一言で片づけましたが、中では相当苦労しました。
バグが次から次に出てくる地獄。

特に悩まされたのが、

・現在手牌情報とそれに対応する有効牌(シャンテンが進む牌。今回は聴牌なので上がり牌。)の情報がなぜか一致しないことがあるバグ。それによって実際の手牌では上がってる牌を引いても、有効牌として認識されずに別の牌を切ってしまう状態。
まず、手牌情報の方がおかしいのか有効牌情報の方がおかしいのかが分からなかった。トライ&エラーを何度も繰り返して、結局有効牌情報の方が間違っていたらしく、再帰式の中でグローバル変数とかローカル変数とかの定義が微妙に違ってるためか、場合によって情報の更新のタイミングがずれてたりしたためだったらしい。これは死ぬほど大変だった。

・579sのリャンカン選択をやってるときに、カン6sとカン8sでなぜか1000点も局収支が違うバグ。デバッグでコードを追っていくと、カン8sの方が符数がなぜか20符になっていた。さらに追っていくと、カン8sのときメンツの切り分けがうまくいってなくて符数の計算もできない状態で、初期値の20符の設定になっていた模様。カンチャンのメンツ切り分けで、カン7とカン8の時だけメンツを切り分けられない超重大バグだった。(i<=8 and i>=2とすべきところがi<=6 and i>=2になってた。)たった一文字違いで起こる結果は超重大バグという。なんでもっと早く気づかなかった…。そして、ここで気づいておいてよかった…。

とまぁ紆余曲折ありつつなんとかまともに動いてくれてそうなのでとりあえず一安心。
とはいえ、今でも少しでもある個所に手を加えると、また別のバグが噴出するような不安定な状態ですが。

成果はこんな感じです。

・手替わりできる回数を0回~3回で入力できるところを作った。
・まずシャンテン数と打牌候補(シャンテン数を維持できる牌)を表示する。
・再帰式によって局収支と和了率を計算する。
・新しい、現在巡目・現在手牌・一発フラグ・残り手替わり回数の組み合わせが来たら、その情報を記憶し、再帰式を発動させて、計算結果(局収支と和了率)をリストボックスの要素に加える。
・手替わりについてはシャンテン数を維持できる牌のうち局収支が最も高くなる牌を切るものとする。(ツモ牌と切る牌が異なるときに残り手替わり回数マイナス1回。)
・すでに記憶済み、計算済みの組み合わせが来たら、その計算済みの情報をそのまま返す。(計算量・処理時間軽減のため。)
・元の巡目(今回は10巡目)と元の手牌まで再帰式で呼び出し終えたら処理終了。最終的な局収支と和了率と再帰式を呼び出した回数をリストボックスに加える。
161101-01.png
まずはドラ3両面待ちで切る牌は関係ない9sの時。

手替わり可能回数が多いほど局収支はもちろん高くなりますが、そこまでの上昇ではないです。(なぜか手替わりが増えるほど局収支が減るというよくわからんバグも発生したなぁとしみじみと思いつつ。)
愚形に変わるケースとかもいろいろ計算してますが、実質的には赤5引きくらいしか有効な手替わりではない(しかももともと11600点なので、新しく赤を引いてもそこまで打点もアップしない。)

一方、処理にかかる時間ですが、手替わりなしなら0.083秒なのでほぼ一瞬です。
手替わり1回までなら0.631秒。一瞬とはいかないがまぁ許容範囲か。
手替わり2回だと4.484秒。これはちょっと遅いなーと思います。1局面だけやるならこれくらいでもいいですが、今後一向聴以上とか4人麻雀とかAIとかも視野に入れるなら現状でこれはつらいです。
手替わり3回になると20秒くらいまで増えるのでこれはできそうにないですね。

このあたりはバランスですが、1回手替わりと2回手替わりでそこまで局収支とかの数値が劇的によくなるとかではないので、今のところは1回手替わりくらいで手を打っていいかなーとは思います。


次は複数の打牌候補がある場合の待ち選択もできるようにしています。
161101-02.png
シャンポンより両面の方が局収支・和了率が高い、というのがきちんと表現できていて一安心。


次がリャンカンの待ち選択で愚形のとき。

なお、今のところは一人麻雀なのでフリテンという概念はありません。
なので、すでに上がり牌を切っていても両面など局収支的に有利な待ちになったら手替わりをするものとしています。
これは4人麻雀への拡張の時に考えましょう。
161101-03.png
手替わりなしのカン6sとカン8sで和了率が違うのはツモ率のパラメータの問題です。詳しくは見えてる枚数別手持ち枚数別ツモ率を参照のこと。

着目するのは手替わりなしと手替わり1回の間の差です。
カン8sだとほとんど和了率・局収支が増えてないのに対し、カン6sの方は手替わりなしと比べて、2%弱和了率が上がってます。
両面手替わりが見込みやすいという効果がちゃんと出ているようです。


とりあえず手替わりという第一関門突破。次の一向聴以上が第二関門で、それができれば一人麻雀計算機としては一応完成ですね。
一向聴以上もまたかなり苦労するんだろうなぁ…。
スポンサーサイト

コメントの投稿

Secret
(非公開コメント受付中)

コメント

プロフィール

nisi5028

Author:nisi5028
FC2ブログへようこそ!

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
FC2カウンター
フリーエリア
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード