0
1

More than 3 years have passed since last update.

Rubyでカイジの地下チンチロのアプリを作ってみた

Last updated at Posted at 2019-11-06

最近カイジを見ていて、地下チンチロを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 負の役物・ヒフミ

実際に書いてみた

underground_chinchinloline.rb
# ダイスを振る
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でメソッド定義

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1