華麗に立直を決めるのその2 ここからが難しい編

でもそんなに難しくはないです。どっちよ?
判定パターンリストが作れたら、あとはこの判定パターンの組み合わせで立直もしくは和了れる組み合わせを探していきます。
前回の例はおいといて、立直判定で最もいいサンプルは九蓮宝燈です。では、1112345678999を例に、立直できるかどうかを判定していきます。


最初にパターンリストを作ります
1.AAABC,AAA,ABC,AA,IGNORE
2.ABC,IGNORE
3.ABC,IGNORE
4.ABC,IGNORE
5.ABC,IGNORE
6.ABC,IGNORE
7.ABC,IGNORE
9.AAA,AA


では、これらのパターンの組み合わせを全網羅して判定していきます。
1.AAABCを採用、対子、順子成立、2面子残り{0,0,0,1,1,1,1,1,3}(残りパターンAAA,ABC,AA,IGNORE)
2.無視(完了)
3.無視(完了)
4.ABCを採用、順子成立、3面子残り{0,0,0,0,0,0,1,1,3}(残りパターンIGNORE)
5.無視(完了)
6.無視(完了)
7.ABCを採用、順子成立、4面子残り{0,0,0,0,0,0,0,0,2}(残りパターンIGNORE)


4面子成立した時点で立直判定を行います。{0,0,0,0,0,0,0,0,2}で、残り2枚。対子になっているので両碰(しゃんぽんってよむのよ)です。1と9で和了りです。


次、7に戻り、ABCではなくIGNOREを採用した場合はどうでしょう。
8は成立していないので9に行き、{0,0,0,0,0,0,1,1,3}AAAを採用した場合、刻子成立、4面子成立残り{0,0,0,0,0,0,1,1,0}
残りは78の両門が成立しているので、69で和了りです。


9.のAAのパターンはすでに対子が成立しているのでこのパターンは行えないので、これで完了。戻ります。
7.に戻ったのですが、全部パターン網羅したのでさらに戻ります。
4.に戻り、IGNOREを採用してみます。2面子残り{0,0,0,1,1,1,1,1,3}(完了)
5.ABCを採用、3面子残り{0,0,0,1,0,0,0,1,3}(残りパターンIGNORE)
6.無視(完了)
7.無視(完了)
9.AAAを採用、4面子残り{0,0,0,1,0,0,0,1,0}
4面子成立したので判定。ですがこれは、両面でも嵌張辺張でもないので立直できません。戻ります。


5.無視を採用、2面子残り{0,0,0,1,1,1,1,1,3}(完了)
あ、そう、ここで重要なことが一個あります。無視を選ぶ場合は、無視したときに残った牌の枚数をカウントしていきます。4.の時に無視を選択しているので、ここで余りは2枚です。立直の判定の場合は残りは1か2になったときのみなので、3枚以上の余りが出た場合は立直は非成立となります。
6.ABCを採用、3面子残り{0,0,0,1,1,0,0,0,3}(残りパターンIGNORE)
7.無視
9.AAAを採用。4面子残り{0,0,0,1,1,0,0,0,0}(完了)
36の両門ですね。戻ります。


6.無視を採用した場合、余りが3になるので、6で無視を選択した場合は立直は成立しないことになるので判定せずに戻ります。
これで、1.でAAABCを採用したパターンは完了です。
次に、1.でAAAを採用するパターンを採用し、以下同じように繰り返していきます。あ、1.は3枚あるので1.でIGNOREを選ぶとその時点で立直非成立ですね。


ものすごーく長くなっちゃったけどこれでわかったかな?関数の再帰呼び出しを使って網羅していけばいいと思います。




#だおちゃんからのコメント
私が学生のときものすごーーーーーっく悩んだ末にようやく思いついたことをいともあっさりと設計してそのうえ改良を加えるなんて・・・あめみやゆりえ、恐ろしい子・・・!!