N向聴の初期局面を生成するための準備として、特定の役で和了した手牌をランダムに生成する機能をcmajiangに実装した。
和了の手牌を生成する処理
役ごとの制約を満たしながら、刻子もしくは順子をランダムに選びながら、4つの面子を生成し、最後に雀頭を生成する。
その後、ランダムに選んだ面子を副露する。
面子の生成は、幺九牌、字牌なしの幺九牌、字牌、三元牌、緑牌などの牌の制約ごとに面子を生成する処理を用意しておけば、ある程度共通化できる。
赤牌は、5の牌が選択された場合に、1/4の確率で赤牌になるようにした。
三暗刻が四暗刻になったりと、上位の役が生成されることがあるので、順子を必ず1つ含めたり、1つ以上副露を行うなどの制約を入れる必要があった。
完全に上位の役が生成されないようにすると処理が複雑になるため、頻度が少ないものは許容した。
初期局面を生成する際は、4人分の手牌を作成するため、残っている牌から役を生成できるようにした。
まとめ
特定の役で和了した手牌をランダムに生成する機能を実装した。
次は、初期局面を生成する処理を実装したい。