ポケモンのタイプ弱点のリファクタリング

概要

Rubyでポケモンウィークネスファインダーを作りました。たくさんの言葉が必要です。 このコードを書くのに少し素敵で洗練されたものを提案してもらえますか?

メニューは以下の通りです。

puts "Which type of Pokemon do you want to know weaknesses? 

Menu

  1 Normal
  2 Fire
  3 Water
  4 Electric
  5 Grass
  6 Ice
  7 Fighting
  8 Poison
  9 Ground
  10 Flying
  11 Psychic
  12 Bug
  13 Rock
  14 Ghost
  15 Dragon
  16 Dark
  17 Steel
  18 Fairy

次に、ユーザーの応答を取得し、ユーザーの選択に対する弱点を出力します。

  type = gets.to_i

  case type 
  when 1 #Normal
    puts "Fighting"
  when 2  #Fire
    puts "Ground, Rock, Water"
  when 3 #water
    puts "Fire, Ground, Rock"
  when 4 #Electric
    puts "Ground"
  when 5 #Grass
    puts "Bug, Fire, Flying, Ice, Poison"
  when 6 #Ice
    puts "Fighting, Fire, Rock, Steel"
  when 7 #Fighting
    puts "Fairy, Flying, Psychic"
  when 8 #Poison
    puts "Ground, Psychic"
  when 9 #Ground
    puts "Grass, Ice, Water"
  when 10 #Flying
    puts "Electric, Ice, Rock"
  when 11 #Psychic
    puts "Bug, Dark, Ghost"
  when 12 #Bug
    puts "Fire, Flying, Rock"
  when 13 #Rock
    puts "Fighting, Grass, Ground, Steel, Water"
  when 14 #Ghost
    puts "Dark, Ghost"
  when 15 #Dragon
    puts "Dragon, Fairy, Ice"
  when 16 #Dark
    puts "Bug, Fairy, Fighting"
  when 17 #Steel
    puts "Fighting, Fire, Ground"
  when 18 #Fairy
    puts "Poison, Steel"
  else
    puts "Error"
  end

解決策

ゲームデータの構造化から始めることができると思います。

game_data = {
  1 => ["Normal", "Fighting" ],
  2 => ["Fire", "Ground, Rock, Water"],
  3 => ["Water", "Fire, Ground, Rock"],
  4 => ["Electric", "Ground"],
  5 => ["Grass", "Bug, Fire, Flying, Ice, Poison"],
  6 => ["Ice", "Fighting, Fire, Rock, Steel"],
  7 => ["Fighting", "Fairy, Flying, Psychic"],
  8 => ["Poison", "Ground, Psychic"],
  9 => ["Ground", "Grass, Ice, Water"],
  10 => ["Flying", "Electric, Ice, Rock"],
  11 => ["Psychic", "Bug, Dark, Ghost"],
  12 => ["Bug", "Fire, Flying, Rock"],
  13 => ["Rock", "Fighting, Grass, Ground, Steel, Water"],
  14 => ["Ghost", "Dark, Ghost"],
  15 => ["Dragon", "Dragon, Fairy, Ice" ],
  16 => ["Dark", "Bug, Fairy, Fighting"],
  17 => ["Steel", "Fighting, Fire, Ground"],
  18 => ["Fairy", "Poison, Steel" ]
}

これで作業できるようになりました。

puts "Which type of Pokemon do you want to know weaknesses?\nMenu"
game_data.each { |point, data| puts "#{point} #{data.first}" }
type = gets.to_i
return "Error" unless game_data.has_key?(type)
puts game_data[type].last

今後の推奨事項。case ステートメントが大きくなりすぎる場合は、ハッシュの使用を検討することをお勧めします。