Refactoring Pokemon type weekness

寵の児 提交于 2021-02-05 10:45:51

问题


I made pokemon weekness finder by ruby. It takes a lot of words. Could you suggest bit nice and sophisticated to write this code?

The menu is as follows.

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

I then obtain the user's response and print the weakness for their selection.

  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

回答1:


I think you can start from the structuring of game data:

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" ]
}

Now you can work with it:

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

Recommendation for future, if case statement becomes too big it's good point to think about to use Hash



来源:https://stackoverflow.com/questions/60422243/refactoring-pokemon-type-weekness

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!