###前提・実現したいこと
Rubyで、ポーカーの役を判定するアプリケーションを作っています。
五枚のカードの情報(例:S8 S7 H6 H5 S4)を入力すると、それが何の役になっているのか判定できるようにしたいのですが、パターンマッチの部分で行き詰っています。
###該当のソースコード
ruby
1 2 3 4 5#役の配列をつくる。インデックスの大小で役の強弱を表す。 6YAKU = ["High_Cards", "One_Pair", "Two_Pair", "Three_of_a_Kind", "Straight", "Flush", "Fullhouse", "Four_of_a_Kind", "Straight_Flush", "Royal_Straight_Flush"] 7 8 9#役の判断。大きい順に行う。 10 11 12def eval_hand 13 14 puts "文字列を入力してください(例:S8 S7 H6 H5 S4)" 15 #半角空白で文字列を分割し、配列を返す。 16 hand = gets.split 17 #それそれのカードから、スートの部分だけ、数字の部分だけを取り出した配列を別に作る。 18 suits = Array.new 19 numbers = Array.new 20 21 hand.each do |c| 22 suits.push c[0] 23 numbers.push c[1] 24 end 25 26 def same_number_counts 27 same_numbers = numbers.group_by{|r|r}.map(&:size).sort.reverse 28 end 29 30 def straight? 31 steps = numbers.sort.map{|r|r-numbers[0]} 32 steps == [0,1,2,3,4] || steps == [0,9,10,11,12] 33 end 34 35 def flush? 36 suits.uniq.size == 1 37 end 38 39 case same_number_counts 40 when [2,1,1,1] 41 yaku = YAKU[1] 42 when [2,2,1] 43 yaku = YAKU[2] 44 when [3,1,1] 45 yaku = YAKU[3] 46 when [3,2] 47 yaku = YAKU[6] 48 when [4,1] 49 yaku = YAKU[7] 50 else 51 case [straight?, flush?] 52 when [true, false] 53 yaku = YAKU[4] 54 when [false, true] 55 yaku = YAKU[5] 56 when [true, true] 57 if numbers == [1,10,11,12,13] 58 yaku = YAKU[8] 59 else 60 yaku = YAKU[9] 61 end 62 else 63 yaku = YAKU[0] 64 end 65 end 66end 67 68def end_program 69 exit 70end 71 72def exception 73 puts "入力された値は無効です" 74end 75 76#メニューの表示 77while true do 78 puts "[0]役を判定する" 79 puts "[1]アプリを終了する" 80 input = gets.to_i 81 82 if input == 0 then 83 eval_hand 84 elsif input == 1 then 85 end_program 86 else 87 exception 88 end 89end
上記のファイルpoker.rbをターミナル上で実行したところ、以下のようなエラーが発生してしまいました。
:in same_number_counts': undefined local variable or method
numbers' for main:Object (NameError)
from poker.rb:38:in eval_hand' from poker.rb:82:in
<main>'
numbersの定義の部分に問題があるようなのですが…どうすれば解決できるでしょうか。ご助言いただけると嬉しいです。
回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/04/14 04:14
2017/04/14 05:06 編集