-
Notifications
You must be signed in to change notification settings - Fork 46
/
Copy path06_team.rb
181 lines (139 loc) · 5.69 KB
/
06_team.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
class Monster
attr_accessor :hp, :name # 設定物件外部可以直接使用和修改 name 和 hp 的 attributes
def initialize(name, hp, ap)
@name = name # 設定一個名為 name(名稱)的 attribute
@hp = hp # 設定一個名為 hp(生命值)的 attribute
@ap = ap # 設定一個名為 ap(攻擊值)的 attribute
@alive = true # 怪獸剛被創造,所以預設為 true,表示怪獸創造時一定是活著的
# 印出被創造的怪獸的 attributes
puts "遇到怪獸 #{@name} 了!"
puts "生命力(HP):#{@hp}"
puts "攻擊力(AP):#{@ap}"
puts ""
end
def is_alive?
return @alive
end
def attack(enemy)
damage = rand(@ap/2..@ap) # 傷害會隨機取攻擊力的一半(AP/2)至 AP 的數字
enemy.hp = enemy.hp - damage # 新的生命力是生命力減去傷害
# 印出攻擊的過程
puts "#{@name} 攻擊!"
puts "#{enemy.name} 受到 #{damage} 點傷害"
puts "#{enemy.name} 剩下 #{enemy.hp} 點 HP"
puts ""
if enemy.hp < 1 # 生命值小於 1,代表死亡(戰敗)
enemy.die # 敵人死亡
end
end
def die # 代表死亡(戰敗)
@alive = false
puts "#{@name} 被打倒了"
end
end
class Hero
attr_accessor :hp, :name
@@heroes = [] # 用來儲存所有 heroes 的 array # 讓外部的 method 也可以抓到這兩個 variables
def initialize(name, hp, ap)
@name = name
@hp = hp
@ap = ap
@alive = true # 英雄剛被創造,所以預設為 true,表示英雄被創造時一定是活著的
# 印出被創造的英雄的 attributes
puts "你的英雄 #{@name} 已經誕生了!"
puts "生命力(HP):#{@hp}"
puts "攻擊力(AP):#{@ap}"
puts ""
@@heroes << self # 把新建立的這個 hero 加入 array 裡
end
def is_alive?
return @alive
end
def attack(enemy)
damage = rand(@ap/2..@ap) # 傷害會隨機取攻擊力的一半(AP/2)至 AP 中的數字
enemy.hp = enemy.hp - damage # 新的生命力是生命力減去傷害
# 印出攻擊的過程
puts "#{@name} 攻擊!"
puts "#{enemy.name} 受到 #{damage} 點傷害"
puts "#{enemy.name} 剩下 #{enemy.hp} 點 HP"
puts ""
if enemy.hp < 1 # 生命值小於 1,代表死亡(戰敗)
enemy.die # 敵人死亡
end
end
def die # 代表死亡(戰敗)
@alive = false
puts "#{@name} 被打倒了"
end
def self.count
return @@heroes.length # 回傳英雄們的數量
end
def self.all
return @@heroes # 回傳包含所有 hero 的 array
end
end
class Mage < Hero
# 新的職業:魔法師 Mage
# Mage 是繼承 Hero 的 class
# 他已經具備 Hero 本身的 attributes 與 methods
# 但他也有只屬於魔法師 attributes 與 methods: mp fireball (火球)
# Mage class 需要增加一個 attribute: mp
# 所以要設定一個屬於魔法師 initialize
def initialize(name, hp , ap, mp)
super(name, hp, ap) # 用繼承的語法 super 來設定屬於 Hero 的 attributes,super 會呼叫 Hero 的同名方法 initialize
# 新增一個 attribute: mp (魔法力)
@mp = mp
end
# Mage class 也需要增加一個 method: fireball
# 同時也要修改他的 attack method
def attack(enemy)
# 這個遊戲我們設計 Mage 每次用 fireball 都需要 3 點 mp, mp 不足的話無法使用
if @mp >= 3
damage = fireball
enemy.hp = enemy.hp - damage
puts "#{@name} 噴射火球!"
puts "#{enemy.name} 受到 #{damage} 點的傷害"
puts "#{enemy.name} 剩下 #{enemy.hp} 點 HP"
puts ""
if enemy.hp < 1
enemy.die
end
else
# 如果 mp 不夠 3 點,就只能用普通的攻擊,super 會呼叫 Hero 的同名方法 attack
super(enemy)
end
end
def fireball
@mp = @mp - 3 # 每次使用 fireball 要扣 3 點 MP
return rand(@ap/2..@ap) + 50 # fireball 造成的傷害是正常攻擊 +50
end
end
class HolyKnight < Hero
# 新的職業:神聖武士 HolyKnight
# HolyKnight 是繼承 Hero 的 class
# 他已經具備 Hero 本身的 attributes 與 methods
# 在這裡我們把他的 attack method 修改,讓威力更大!
def attack(enemy)
# 新的職業:神聖武士 Holy Knight
# 攻擊能力:聖光,傷害會隨機取攻擊力(AP)至兩倍 AP 中的數字
damage = rand(@ap..@ap*2)
enemy.hp = enemy.hp - damage
puts "#{@name} 發出聖光!"
puts "#{enemy.name} 受到 #{damage} 點的傷害"
puts "#{enemy.name} 剩下 #{enemy.hp} 點 HP"
puts ""
if enemy.hp < 1 # 生命值小於 1,代表死亡(戰敗)
enemy.die # 敵人死亡
end
end
end
# 建立一個有不同職業 (包括英雄、神聖武士與魔法師)的團隊
Hero.new("Robinhood", 100, 20)
HolyKnight.new("Howard", 100, 30)
Mage.new("Merlin",60, 20, 10)
# 列印英雄隊伍
team = Hero.all
puts "You have #{Hero.count} heroes in your team:"
team.each do |hero|
puts "#{hero.name} - Class:#{hero.class}, HP:#{hero.hp} "
end