问题
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