前回記事は、こちらです。↓
特殊役判定を作成する。
特殊な和了り方をする七対子と国士無双の判定プログラムを作成したいと思います。
七対子は対子=雀頭候補が7個。
七対子は対子が7組でできる役です。なので、同じ2枚組の判定である、雀頭判定の部分に組み込みます。
tehai=[1,1,2,2,3,3,3,4,5,11,12,13,19,19]
tehai_check = Array.new(46,0) #要素数46(牌の種類数)かつ初期値0の配列
tehai.map {|v|tehai_check[v]+=1}
#雀頭候補抜き取り
jt=[] #雀頭候補格納配列
tehai_check.each_with_index do |v,i|
if v>=2 then
jt << i
end
end
#jt=[1, 2, 3, 19]
上のプログラムは手牌を表す配列変数”tehai”から雀頭候補を抜き出すプログラムです。ここで、”tehai”を七対子の和了形に変えると、雀頭候補格納配列”jt”に7要素の数値が入ります。
tehai=[1,1,3,3,5,5,6,6,31,31,33,33,19,19]
tehai_check = Array.new(46,0) #要素数46(牌の種類数)かつ初期値0の配列
tehai.map {|v|tehai_check[v]+=1}
#雀頭候補抜き取り
jt=[] #雀頭候補格納配列
tehai_check.each_with_index do |v,i|
if v>=2 then
jt << i
end
end
#jt=[1, 3, 5, 6, 19, 31, 33]
これで、この手牌は七対子の和了りであることを判定できます。
国士無双は1、9、字牌が全てある。
国士無双は1,9,字牌を全種類持っていて、そのうちの1種類が雀頭(2枚組)になっている役なので、そうなっていることを判定します。
tehai=[1,9,11,19,21,29,31,33,35,37,41,43,45,19]
tehai_check = Array.new(46,0) #要素数46(牌の種類数)かつ初期値0の配列
tehai.map {|v|tehai_check[v]+=1}
#雀頭候補抜き取り
jt=[] #雀頭候補格納配列
tehai_check.each_with_index do |v,i|
if v>=2 then
jt << i
end
end
#国士無双Check
if jt.size==1 then #国士無双の場合、雀頭候補はひとつしかない
kokushi_check_bit = [
0,1,0,0,0,0,0,0,0,1,
0,1,0,0,0,0,0,0,0,1,
0,1,0,0,0,0,0,0,0,1,
0,1,0,1,0,1,0,1,0,0,
0,1,0,1,0,1
]
tmp_kokushi=tehai_check.dup
amtmp_kokushi=[]
#雀頭を抜く
amtmp_kokushi << [jt[0],jt[0]]
tmp_kokushi[jt[0]]-=2
kokushi_check_bit[jt[0]]-=1
kokushi_check=true
kokushi_check_bit.each_with_index do |kv,ki|
#国士無双に必要な牌を持っていない、もしくは不要な牌を持っていたら、
#kokushi_checkをfalseに変換。
kokushi_check = false if kv!=tmp_kokushi[ki]
end
if kokushi_check == true then
k_tmp=[]
tmp_kokushi.each_with_index{|kv,ki| k_tmp << ki if kv==1}
amtmp_kokushi << k_tmp
#和了判定(未実装)
end
end
14~20行目の”kokushi_check_bit ”が国士無双に必要な牌種を示した配列です。
25行目の雀頭を抜く個所では、雀頭の牌種は何でもよい形になっていますが、これが国士無双にならない牌種の場合は、27行目で”kokushi_check_bit”の雀頭の部分が”-1”になるため、32行目の”kokushi_check ”による判定処理の時に国士無双が成立しないと判定されます。
これで、特殊役の和了判定ができるようになりました。
次回はいよいよ、プログラムを完成させたいと思います。
次回記事は、こちらです。↓
コメント