blob: df92facde207bd2aac9d3d4d561ce439cb2fbb4d [file] [log] [blame]
Ellen Leebbfd78e2017-10-27 10:57:24 +08001class Monster
2
Ellen Leebbfd78e2017-10-27 10:57:24 +08003 attr_accessor :hp, :name # 設定物件外部可以直接使用和修改 name 和 hp 的 attributes
4
5 def initialize(name, hp, ap)
6 @name = name # 設定一個名為 name(名稱)的 attribute
archa9c66d32017-10-31 17:46:33 +08007 @hp = hp # 設定一個名為 hp(生命值)的 attribute
8 @ap = ap # 設定一個名為 ap(攻擊值)的 attribute
Ellen Leebbfd78e2017-10-27 10:57:24 +08009 @alive = true # 怪獸剛被創造,所以預設為 true,表示怪獸創造時一定是活著的
10
11 # 印出被創造的怪獸的 attributes
12 puts "遇到怪獸 #{@name} 了!"
13 puts "生命力(HP):#{@hp}"
14 puts "攻擊力(AP):#{@ap}"
15 puts ""
16 end
17
18 def is_alive?
19 return @alive
20 end
21
22 def attack(enemy)
23 damage = rand(@ap/2..@ap) # 傷害會隨機取攻擊力的一半(AP/2)至 AP 的數字
24 enemy.hp = enemy.hp - damage # 新的生命力是生命力減去傷害
25
26 # 印出攻擊的過程
27 puts "#{@name} 攻擊!"
28 puts "#{enemy.name} 受到 #{damage} 點傷害"
29 puts "#{enemy.name} 剩下 #{enemy.hp} 點 HP"
30 puts ""
31
archa9c66d32017-10-31 17:46:33 +080032 enemy.die? # 透過 die? 去檢查敵人的 hp,而不是在自己的 attack 裡使用 enemy.die
Ellen Leebbfd78e2017-10-27 10:57:24 +080033 end
34
35 def die?
36 if hp < 1
37 die
38 end
39 end
archa9c66d32017-10-31 17:46:33 +080040
41 private # 宣告 die 為私有方法
42 def die # 代表死亡(戰敗)
Ellen Leebbfd78e2017-10-27 10:57:24 +080043 @alive = false
44 puts "#{@name} 被打倒了"
45 end
46end
47
48class Hero
49
Ellen Leebbfd78e2017-10-27 10:57:24 +080050 attr_accessor :hp, :name
51
52 @@heroes = [] # 用來儲存所有 heroes 的 array # 讓外部的 method 也可以抓到這兩個 variables
53
54 def initialize(name, hp, ap)
55 @name = name
archa9c66d32017-10-31 17:46:33 +080056 @hp = hp
57 @ap = ap
Ellen Leebbfd78e2017-10-27 10:57:24 +080058 @alive = true # 英雄剛被創造,所以預設為 true,表示英雄被創造時一定是活著的
59
60 # 印出被創造的英雄的 attributes
61 puts "你的英雄 #{@name} 已經誕生了!"
62 puts "生命力(HP):#{@hp}"
63 puts "攻擊力(AP):#{@ap}"
64 puts ""
65
66 @@heroes << self # 把新建立的這個 hero 加入 array 裡
67 end
68
69 def is_alive?
70 return @alive
71 end
72
73 def attack(enemy)
74 damage = rand(@ap/2..@ap) # 傷害會隨機取攻擊力的一半(AP/2)至 AP 中的數字
75 enemy.hp = enemy.hp - damage # 新的生命力是生命力減去傷害
76
77 # 印出攻擊的過程
78 puts "#{@name} 攻擊!"
79 puts "#{enemy.name} 受到 #{damage} 點傷害"
80 puts "#{enemy.name} 剩下 #{enemy.hp} 點 HP"
81 puts ""
82
archa9c66d32017-10-31 17:46:33 +080083 enemy.die? # 透過 die? 去檢查敵人的 hp,而不是在自己的 attack 裡使用 enemy.die
Ellen Leebbfd78e2017-10-27 10:57:24 +080084 end
85
archa9c66d32017-10-31 17:46:33 +080086 def die?
Ellen Leebbfd78e2017-10-27 10:57:24 +080087 if hp < 1
88 die
89 end
90 end
91
archa9c66d32017-10-31 17:46:33 +080092 private # 宣告 die 為私有方法
93 def die # 代表死亡(戰敗)
Ellen Leebbfd78e2017-10-27 10:57:24 +080094 @alive = false
95 puts "#{@name} 被打倒了"
96 end
97
98 def self.count
99 return @@heroes.length # 回傳英雄們的數量
100 end
101
102 def self.all
103 return @@heroes # 回傳包含所有 hero 的 array
104 end
105end
106
107class Mage < Hero
108
109 # 新的職業:魔法師 Mage
110 # Mage 是繼承 Hero 的 class
111 # 他已經具備 Hero 本身的 attributes 與 methods
112 # 但他也有只屬於魔法師 attributes 與 methods: mp fireball (火球)
113
114 # Mage class 需要增加一個 attribute: mp
115 # 所以要設定一個屬於魔法師 initialize
116
Ellen Leebbfd78e2017-10-27 10:57:24 +0800117 def initialize(name, hp , ap, mp)
118 super(name, hp, ap) # 用繼承的語法 super 來設定屬於 Hero 的 attributes,super 會呼叫 Hero 的同名方法 initialize
119
120 # 新增一個 attribute: mp (魔法力)
archa9c66d32017-10-31 17:46:33 +0800121 @mp = mp
Ellen Leebbfd78e2017-10-27 10:57:24 +0800122 end
123
124 # Mage class 也需要增加一個 method: fireball
125 # 同時也要修改他的 attack method
126
127 def attack(enemy)
128 # 這個遊戲我們設計 Mage 每次用 fireball 都需要 3 點 mp, mp 不足的話無法使用
129 if @mp >= 3
130 damage = fireball
131 enemy.hp = enemy.hp - damage
132
133 puts "#{@name} 噴射火球!"
134 puts "#{enemy.name} 受到 #{damage} 點的傷害"
135 puts "#{enemy.name} 剩下 #{enemy.hp} 點 HP"
136 puts ""
137
138 enemy.die?
139 else
140 # 如果 mp 不夠 3 點,就只能用普通的攻擊,super 會呼叫 Hero 的同名方法 attack
141 super(enemy)
142 end
143 end
144
145 def fireball
146 @mp = @mp - 3 # 每次使用 fireball 要扣 3 點 MP
147 return rand(@ap/2..@ap) + 50 # fireball 造成的傷害是正常攻擊 +50
148 end
149end
150
151class HolyKnight < Hero
152
153 # 新的職業:神聖武士 HolyKnight
154 # HolyKnight 是繼承 Hero 的 class
155 # 他已經具備 Hero 本身的 attributes 與 methods
156 # 在這裡我們把他的 attack method 修改,讓威力更大!
157
158 def attack(enemy)
159
160 # 新的職業:神聖武士 Holy Knight
161 # 攻擊能力:聖光,傷害會隨機取攻擊力(AP)至兩倍 AP 中的數字
162
163 damage = rand(@ap..@ap*2)
164 enemy.hp = enemy.hp - damage
165
166 puts "#{@name} 發出聖光!"
167 puts "#{enemy.name} 受到 #{damage} 點的傷害"
168 puts "#{enemy.name} 剩下 #{enemy.hp} 點 HP"
169 puts ""
170
171 enemy.die?
172 end
173end
174
archa9c66d32017-10-31 17:46:33 +0800175# 確認是否可直接呼叫讓 hero 被打倒
Ellen Leebbfd78e2017-10-27 10:57:24 +0800176hero = Hero.new("Robinhood", 100, 20)
archa9c66d32017-10-31 17:46:33 +0800177
178hero.die? # 使用 die? 確認 hero 是否死亡,不會發生錯誤
179hero.die # 會發生錯誤,表示宣告 die 為私有方法成功了