- PersonクラスのサブクラスであるFighter,Wizard,Priestクラス内の各battleメソッドの重複(if
elsifelse~endあたり)表記をなくしてもう少しすっきり書けないかと考えているのですが、思いつかず、アイデアがあれば教えていただきたいと思っています。
Ruby
1# Personクラス定義 2class Person 3 attr_reader :strength 4 attr_reader :cleverness 5 6 def initialize(st, cl) 7 @strength = st 8 @cleverness = cl 9 end 10 11 def sum 12 strength + cleverness 13 end 14 15 def battle(opponent) 16 judge(self.sum, opponent.sum) 17 end 18 19 private 20 def judge(self_sum, opponent_sum) 21 if self_sum > opponent_sum 22 "勝利" 23 elsif self_sum == opponent_sum 24 "未決着" 25 else 26 "敗北" 27 end 28 end 29end 30 31# Fighterクラス定義 32class Fighter < Person 33 alias base_strength strength 34 def strength 35 base_strength * 1.5 36 end 37 38 alias base_cleverness cleverness 39 def cleverness 40 base_cleverness * 1.0 41 end 42 43 def battle(opponent) 44 if opponent.is_a?(Wizard) 45 sum_revised = self.strength * 0.85 + self.cleverness 46 judge(sum_revised, opponent.sum) 47 elsif opponent.is_a?(Priest) 48 opponent_revised = (opponent.strength * 0.95) + (opponent.cleverness * 0.90) 49 judge(self.sum, opponent_revised) 50 else 51 super 52 end 53 end 54end 55 56# Wizardクラス定義 57class Wizard < Person 58 alias base_strength strength 59 def strength 60 base_strength * 0.5 61 end 62 63 alias base_cleverness cleverness 64 def cleverness 65 base_cleverness * 3.0 66 end 67 68 def battle(opponent) 69 if opponent.is_a?(Priest) 70 sum_revised = self.strength + self.cleverness * 0.75 71 judge(sum_revised, opponent.sum) 72 elsif opponent.is_a?(Fighter) 73 opponent_revised = opponent.strength * 0.85 + opponent.cleverness 74 judge(self.sum, opponent_revised) 75 else 76 super 77 end 78 end 79end 80 81# Priestクラス定義 82class Priest < Person 83 alias base_strength strength 84 def strength 85 base_strength * 1.0 86 end 87 88 alias base_cleverness cleverness 89 def cleverness 90 base_cleverness * 2.0 91 end 92 93 def battle(opponent) 94 if opponent.is_a?(Fighter) 95 sum_revised = self.strength * 0.95 + self.cleverness * 0.90 96 judge(sum_revised, opponent.sum) 97 elsif opponent.is_a?(Wizard) 98 opponent_revised = opponent.strength + opponent.cleverness * 0.75 99 judge(self.sum, opponent_revised) 100 else 101 super 102 end 103 end
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/08/07 06:43
2015/08/07 06:52 編集
2015/08/07 06:59