yuuki blog

プログラミング をアプトプットしています。

Ruby ポーカーゲーム

ポーカーのルール

  • n回手札を交換できます。
  • ジョーカーを含めない52枚から構成されます。
  • 同じ札は入りません。
  • 以下の順番に役が出力されます。
#カードを交換するために定義します
m = 0
# 乱数で絵柄を指定するために配列に入れます。
mark = ["heart","diamond","spade","club"]
#カードを交換する回数を指定します。
puts "何回交換しますか?"
n = gets.to_i
#手札それぞれをa,b,c,d,eに指定し乱数で、数値を絵柄を取得しています。
a = [rand(1..13),mark[rand(4)]]
b = [rand(1..13),mark[rand(4)]]
c = [rand(1..13),mark[rand(4)]]
d = [rand(1..13),mark[rand(4)]]
e = [rand(1..13),mark[rand(4)]]
#2次元配列に変換し"sort"で、数字の小さい順に並べ直し、"uniq"で重複している配列を削除します。
cards = [a,b,c,d,e].sort.uniq
#最初の回数も入りますので、交換する回数(n)+1で繰り返しています。
(n + 1).times do
#もし重複している配列があれば"cards[4]"(5番目のカード)はnil(無い)になっていますので、while文で配列を追記します。
while cards[4] == nil do
 cards << [rand(1..13),mark[rand(4)]]
end
#2次元配列を"flatten!"で1次元配列に変換しています。
sum = cards.flatten!
  puts "手札"
  puts "#{a},#{b},#{c},#{d},#{e}"
#手札の絵柄が各何枚あるのか数え変数に代入しています。
  hea = sum.count("heart")
  dia = sum.count("diamond")
  spa = sum.count("spade")
  clu = sum.count("club")
#"delete_if"で絵柄を削除しています
  sum.delete_if do |str|
    mark.include?(str)
  end
#同じ値がいくつあるのかカウントしています。
  array = sum.group_by(&:itself).map{ |k, v| [k, v.count] }.to_h
#各絵柄が揃っているかを調べています。
  if hea == 5 || dia == 5 || spa == 5 || clu ==5
#数値が、[1,10,11,12,13]と並んでいるかを調べています。
    if cards[0][0] == 1 && cards[1][0] == 10 && cards[1][0]+3 == cards[4][0]
      puts "loyal_straight_flash"
#数値が最初値+4=最後の値になっているかを調べています。
    elsif cards[0][0]+4 == cards[4][0]
      puts "straight_flash"
    end
  end
#"value?()"で()の中の値が"array"にあるかを調べています。
  if array.value?(4)
    puts "four Card"
  elsif array.value?(3) && array.value?(2)
    puts "full house"
  elsif hea == 5 || dia == 5 || spa == 5 || clu ==5
    puts "flash"
  elsif cards[0][0]+4 == cards[4][0]
    puts "straight"
  elsif array.value?(3)
    puts "three card"
#ツーペアをいうことはarrayの中は[1,2,2]や[2,1,2]などになっています。
#なので配列の1番目か2番目には必ず2が入っており、4番目はnilになっています。
  elsif array.values[0] == 2 || array.values[1] == 2 && array.values[3] == nil
    puts "two pair"
  elsif array.value?(2)
    puts "one pair"
  else
    puts "no pair"
  end
#nの方がmよりも1回多く回すためにここに置いています
  m += 1
  if n >= m
  puts "交換しますか? yes=1 no=0"
  change = gets.to_i
    if change == 1
      puts "どれを交換しますか?"
      puts "a b c d e"
#"a b c"など複数選択できるように配列で定義します
      trade = gets.chomp.split.map(&:to_s)
      if trade.include?("a")
          a = [rand(1..13),mark[rand(4)]]
      end
      if trade.include?("b")
        b = [rand(1..13),mark[rand(4)]]
      end
      if trade.include?("c")
        c = [rand(1..13),mark[rand(4)]]
      end
      if trade.include?("d")
        d = [rand(1..13),mark[rand(4)]]
      end
      if trade.include?("e")
        e = [rand(1..13),mark[rand(4)]]
      end
    else
#交換しなければ終了します。
      break
    end
  end
end

2次元配列のみで出来そうでしたけど、ペアの定義がややこしくなりそうだったので、1次元配列に直してから定義しました。