現状の課題
麻雀牌全種類から無作為に14枚取り出す構造はできたため、そこから取り出された値を見て
シャンテン数をカウントしたい。
これがいくら考えてもいい方法が思いつかない。。。
ただまずは今の配列データのままでは面子の判断も難しいので、配牌の萬子、筒子、索子、字牌がそれぞれどれくらいあるかのカウンターを作ってこれをもとに判定する機能を設けようかと考えました。
作成コード
def shanten
mcounter = [0, 0, 0, 0, 0, 0, 0, 0, 0]
scounter = [0, 0, 0, 0, 0, 0, 0, 0, 0]
pcounter = [0, 0, 0, 0, 0, 0, 0, 0, 0]
zcounter = [0, 0, 0, 0, 0, 0, 0]
@haipai.each do |pai|
pai_num = pai.split(/\s*/)
val = pai_num[1].to_i - 1
case pai_num[0]
when "m" then
mcounter[val] += 1
when "p" then
pcounter[val] += 1
when "s" then
scounter[val] += 1
when "z" then
zcounter[val] += 1
end
end
end
説明
それぞれの種類の牌が何枚あるかをカウントするための格納をする配列を作成します。
@haipaiには["m1", "m1", "m2", "m9", "p5", "p7", "p9", "s4", "s4", "s6", "s6", "s7", "z6", "z7"]見たいな形でデータを入れていますので、
それぞれのデータをsplitで分けて、頭文字がmなら末尾の数字のカウンターを1あげるという
コードにしました。配列は最初が”0”から始まるので、格納先指定には1引いています。
まとめ
ここからどのように面子判断を行うか、、、理屈はわかっていても数学的な要素とプログラム的な要素で
どのように実現するかは難しいですね。
参照
配牌を作成したプログラムはこちらから
・Ruby 麻雀の配牌を作成する
https://qiita.com/tatsuya312/items/66d7036a0d76748efdb8