###前提・実現したいこと
先日、「入力した文字列が、ポーカーのどの役になっているか」を判断するコードに関する質問をしたものです。皆様のお助言のおかげで無事完成させることができました、ありがとうございます。
今度は、複数の手札の情報を入力したときに、それぞれの役名を表示したうえで、どの手札が一番強いかを判断するコードを書いています。
出力例:
card: "H1 H13 H12 H11 H10”,
hand: "Straight_Flush",
best: true
card: "H9 C9 S9 H2 C2”,
hand: "Fullhouse"
この時、「どの手札が一番強いか」を判断するのに、どうしたらよいのか分からず行き詰っています…。この点についてアドバイス頂けたら嬉しいです!
現在、自力で下にあげたコードまで書きました。上の例でいえば、それぞれの手札に対して、cardとhandを出力するところまでです。
###該当のソースコード
ruby
1 2 3#ポーカーの役を判定するアプリケーションをつくる。 4#複数の五枚のカードの組の情報(例:S8 S7 H6 H5 S4, H1 H13 H12 H11 H10)を入力すると、それが何の役になっているのか判定したうえで、一番強い役がどれかを表示。 5 6 7#役の配列をつくる。インデックスの大小で役の強弱を表す。 8YAKU = ["High_Cards", "One_Pair", "Two_Pair", "Three_of_a_Kind", "Straight", "Flush", "Fullhouse", "Four_of_a_Kind", "Straight_Flush", "Royal_Straight_Flush"] 9 10 11#役の判断。 12 13def eval_hand 14 puts "文字列を入力してください(例:S8 S7 H6 H5 S4, H1 H13 H12 H11 H10)" 15 #カンマ(,)で文字列を分割し、いくつかの手札からなる配列を返す。 16 hands = gets.split(",") 17 18 hands.each do |h| 19 #それそれのカードから、スートの部分だけ、数字の部分だけを取り出した配列を別に作る。 20 hand = h.split 21 suits = [] 22 numbers = [] 23 24 hand.each do |c| 25 suits.push c[0] 26 numbers.push c[1].to_i 27 end 28 29 case same_number_counts(numbers) 30 when [2,1,1,1] 31 yaku = YAKU[1] 32 when [2,2,1] 33 yaku = YAKU[2] 34 when [3,1,1] 35 yaku = YAKU[3] 36 when [3,2] 37 yaku = YAKU[6] 38 when [4,1] 39 yaku = YAKU[7] 40 else 41 case [straight(numbers), flush(suits)] 42 when [true, false] 43 yaku = YAKU[4] 44 when [false, true] 45 yaku = YAKU[5] 46 when [true, true] 47 if numbers == [1,10,11,12,13] 48 yaku = YAKU[9] 49 else 50 yaku = YAKU[8] 51 end 52 else 53 yaku = YAKU[0] 54 end 55 puts "card:#{h}\n\nhand:#{yaku}\n\n" 56 end 57 end 58end 59 60 61def same_number_counts(numbers) 62 same_numbers = numbers.group_by{|r|r}.map(&:size).sort.reverse 63end 64 65def straight(numbers) 66 steps = numbers.sort.map{|r|r - numbers[0]} 67 steps == [0,1,2,3,4] || steps == [0,9,10,11,12] 68end 69 70def flush(suits) 71 suits.uniq.size == 1 72end 73 74def end_program 75 exit 76end 77 78def exception 79 puts "入力された値は無効です" 80end 81 82 83#メニューの表示 84while true do 85 puts "[0]役を判定する" 86 puts "[1]アプリを終了する" 87 input = gets.to_i 88 89 if input == 0 then 90 eval_hand 91 elsif input == 1 then 92 end_program 93 else 94 exception 95 end 96end
回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。