最近カイジを見ていて、地下チンチロをRubyで試してみようと思い作成してみた。
もう少しスマートに改修したいところ。ご意見くださると幸いです。
仕様要件
ゲームのルールと仕様変更したところ
・親からサイコロを振る
=>仕様上、一対一になるので親制度廃止
・手番になったら3個のサイコロをふる
・サイコロを振ってどんぶりの外に出た場合はションベンという
=>仕様上、ションベンは廃止
・サイコロを振って出目がない場合は3回まで振り直しが可能
=>仕様上、親は1回のみとなっている、子は出目がない場合なので、ヒフミが出たら振り直せない
・役によってペリカのやり取り金額が変わる
=>ペリカは実装していない
役の順位
1-1-1 役物・ピンゾロ
2-2-2 役物・ゾロ目
3-3-3 役物・ゾロ目
4-4-4 役物・ゾロ目
5-5-5 役物・ゾロ目
6-6-6 役物・ゾロ目
4-5-6 役物・シゴロ
6-x-x 通常の目・6の目
5-x-x 通常の目・5の目
4-x-x 通常の目・4の目
3-x-x 通常の目・3の目
2-x-x 通常の目・2の目
1-x-x 通常の目・1の目
x-y-z 目なし
1-2-3 負の役物・ヒフミ
実際に書いてみた
# ダイスを振る
def dice_role
dice_eye = []
dice_sum = 0
for i in 0..2 do
dice_eye[i] = (rand 1..6)
end
puts "ダイスの目は #{dice_eye[0]}, #{dice_eye[1]}, #{dice_eye[2]} です"
# 返す値は、ダイス×3の目と合計値なので4つの値を返す
return dice_eye[0], dice_eye[1], dice_eye[2]
end
# 役物判定
def hand(a, b, c)
if (a + b + c) == 3
#1-1-1の組み合わせ => 必ず3になる
puts "役物・ピンゾロ"
return 40
elsif [a, b, c].uniq.count == 1
#共通の値を削除し、残った個数が1なら必ずゾロ目
case a
when 2
#2-2-2の組み合わせ => 共通の値が2
puts "役物・#{a}のゾロ目"
return 35
when 3
#3-3-3の組み合わせ => 共通の値が3
puts "役物・#{a}のゾロ目"
return 34
when 4
#4-4-4の組み合わせ => 共通の値が4
puts "役物・#{a}のゾロ目"
return 33
when 5
#5-5-5の組み合わせ => 共通の値が5
puts "役物・#{a}のゾロ目"
return 32
when 6
#6-6-6の組み合わせ => 共通の値が6
puts "役物・#{a}のゾロ目"
return 31
end
elsif (a || b || c == 4) && ((a + b + c) == 15)
#4-5-6の組み合わせ => 必ず4が存在し、必ず合計値が15になる
puts "役物・シゴロ"
return 20
elsif (a || b || c == 1) && (a || b || c == 2) && ((a + b + c) == 6)
#1-2-3の組み合わせ => 必ず1と2が存在し、必ず合計値が6になる != 1-1-4では該当しない
puts "負の役物・ヒフミ"
return 0
elsif [a, b, c].uniq.count == 2
#共通の値を削除し、残った個数が2なら必ず同じ目が存在する
ary = [a, b, c]
double = ary.group_by{ |e| e }.select { |k, v| v.size > 1 }.map(&:first)
#重複した値を配列化、だが1つしか重複していないので、配列の最初の値が重複した値になる
case double[0]
when 6
#6-x-xの組み合わせ
puts "通常の目・6の目"
return 16
when 5
#5-x-xの組み合わせ
puts "通常の目・5の目"
return 15
when 4
#4-x-xの組み合わせ
puts "通常の目・4の目"
return 14
when 3
#3-x-xの組み合わせ
puts "通常の目・3の目"
return 13
when 2
#2-x-xの組み合わせ
puts "通常の目・2の目"
return 12
when 1
#1-x-xの組み合わせ
puts "通常の目・1の目"
return 11
end
else
#組み合わせが該当しない場合
puts "目なし"
return 1
end
end
# 相手のターン
puts "相手がダイスを振ります"
e_dice = dice_role
e_result = hand(e_dice[0], e_dice[1], e_dice[2])
# プレイヤーのターン
p_cnt = 3
until p_cnt == 0 do
# プレイヤーのダイスロール
puts "\nあなたがダイスを振ります"
p_dice = dice_role
p_result = hand(p_dice[0], p_dice[1], p_dice[2])
# 振り直し判定
p_cnt = p_cnt - 1
if p_result > 1 || p_result == 0 || p_cnt == 0
break
end
end
# 勝敗判定
if e_result == p_result
puts "\n引き分けです"
elsif e_result > p_result
puts "\nあなたの負けです"
else
puts "\nあなたの勝ちです"
end
exit
ソースコードで使ったもの
後でまとめます
・for文、順続きの数値の指定
・if文、case文、uniq、group by、select、size、map
・until文、break
・defでメソッド定義