*All archives* |  *Admin*

<<09  2017/10  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  11>>
一人麻雀計算機制作計画その3・メンツの切り分けと役満手役判定
一人麻雀計算機制作の続き。
前回まででシャンテンチェックと有効牌の計算までできたので、今日は和了時のメンツの切り分けと符計算をやります。

14枚で上がってる手牌について、チートイと国士以外について4メンツ1雀頭の組み合わせとしてあり得るものをすべて列挙していきます。
この作業をすることにより、
・符計算が簡単にできる。
・メンツ構成にかかわる役の判定が簡単にできる。
・高点法を取るのがやりやすくなる。
といったような効果があります。

各パーツの分け方は
・「AGARIGUKEITAATU」…「上がり愚形塔子」。上がり牌を含んだシュンツのうちペンチャンとカンチャンのもの。2符加算。
・「AGARIKOTU」…「上がり刻子」。シャボで上がった場合の刻子。ツモなら4符or8符、ロンなら2符or4符加算。
・「AGARIRYANMEN」…「上がり両面」。上がり牌を含んだシュンツのうち両面のもの。符加算なし。
・「AGARITOITU」…「上がり対子」。単騎待ちの上がり牌。単騎待ちの2符加算と役牌雀頭の2符or4符加算。
・「ANKAN」…「暗槓」。16符or32符加算。
・「ANKO」…「暗刻」。上がり牌でできた暗刻を除いたもの。4符or8符加算。
・「CHII」…「チー」。鳴いたシュンツ。0符加算。
・「MINKAN」…「明槓」。大明槓or加カン。8符or16符加算。
・「PON」…「ポン」。鳴いた刻子。2符or4符加算。
・「SYUNTU」…「シュンツ」。鳴いていないand上がり牌を含まない出来シュンツ。0符加算。
・「TOITU」…「対子」。単騎待ちでない雀頭。役牌雀頭の2符or4符加算。

このパーツ区分分けと、各パーツの中で牌番号(1~37番)が一番小さいもの(赤は考慮しない)をセットにして扱います。
234pのチーなら12番、南の明槓なら32番です。

追加で必要になる情報は、「上がり牌」「ツモorロン」「自風」「場風」なので、それを入力できるスペースを設けて、
メンツの切り分けand符計算のコードを書いていきます。

符計算のためには平和を判定できるようにしなければいけないので、その部分のコードも書きます。
メンツの切り分けができていれば、5パーツがすべて「AGARIRYANMEN」or「SYUNTU」or「TOITU」のいずれかである、かつTOITUの牌が役牌でないなら、平和が成立するという簡単なコードです。

前の牌譜解析では敬遠していた平和の判定があっさりできてしまいました。
いやー素晴らしいですねー。

以下、テストの軌跡。
161028-01.png

5番目の1m1m2m3mで上がり牌1mみたいな亜両面形が切り分けパターンが2パターンになる典型的な例ですね。

上がり牌1mを2m3mの「AGARIRYANMEN」(片割れの1m対子が「TOITU」)として取るか、
1mの単騎で「AGARITOITU」(片割れの1m2m3mが「SYUNTU」)として取るかの2パターンです。
平和があるなら前者の方がハン数が高いので前者採用、平和がないなら後者の方が符数が高いので後者採用という高点法を取ります。

11番目の二盃口の手についても
両面待ちのメンツ手or単騎待ちのメンツ手or七対子の3種類の切り分けがきちんとできています。

パッと思い浮かんだ中で切り分けパターンが一番多そうな牌姿が16番目の1m1m1m2m2m2m2m3m3m3m3m4m4m ロン1mの牌姿
1m単騎の清一色二盃口
1m雀頭2m3m両面の清一色平和二盃口
4m雀頭2m暗刻3m暗刻1m明刻1m2m3mシュンツの清一色のみ
4m雀頭1m暗刻2m暗刻3m暗刻2m3m両面の清一色三暗刻
4m雀頭1m2m3mシュンツ×3、2m3m両面の清一色平和二盃口
の5パターンで全部かなーと思います。
(高点法で2番目か5番目の清一色平和二盃口の10ハン)

一番下の4s5s5s6s7s ツモ6sは平和がなければカン6sにも取れて2符増える有名問題ですね。
きちんと2パターンに分けられていることが分かります。

というわけでメンツの切り分け+符計算のところまでがうまくいったことを確認できました。


続いて役判定に移りたいと思います。
すべての4メンツ1雀頭の切り分けパターンについてほぼ全部の役を逐一調べる(各役ごとに判定する関数を作らなければいけない)ので、けっこう大変ですが、これをやらないことには一人麻雀計算もAIもへったくれもないですから、がんばりましょう。

今日は役満の手についてです。
なぜ役満からやるかというと、役満が一つでも複合した時点で役満未満の役を調べる必要がなくなるからです。

役満のルールは天鳳依存とします。(すべてシングル役満)
役満のうち、「四暗刻」と「四槓子」はメンツの切り分けを行った後、それぞれの切り分けパターンごとに判定します。
それ以外の役満はメンツ構成に依存しない役なので、メンツ切り分けをする前に判定しておきます。

追加する情報は「天和or地和フラグ」および「順目」(1巡目以外は天和地和にはならない)です。

以下、テストの軌跡。
161028-02.png
2番目と3番目が天和・地和
4番目が大三元
5番目~9番目が四暗刻関連
10番目が字一色(メンツ手)
11番目が字一色七対子
12番目が複合役満(役満複合処理も正しくできている)
13,14番目が緑一色
15番目が清老頭
16,17番目が国士無双
18,19番目が四喜和
20番目が四槓子
21,22番目が九連宝橙

今のところはミスはなさそうです。(もちろんテストの過程でいろいろバグは潰しましたが。)

残りは役満以外の一般手の手役判定です。
今日はここまででコードを書くところまでは終わって、これからテストしてバグ潰しの作業です。


いやー、今日はけっこう頑張ったなー。かなり集中して作業ができました。
スポンサーサイト

コメントの投稿

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

コメント

プロフィール

nisi5028

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

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

この人とブロともになる

QRコード
QRコード