-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path05_mage.rb
147 lines (115 loc) · 5.28 KB
/
05_mage.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
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 # 讓外部的 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 ""
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 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 # 生命值小於 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
# 以下是執行步驟
# 遊戲開始
# 用 mage 這個 variable 設定一個名為 Merlin 的魔法師
# 再用 monster 來設定一個叫 Bone 的怪獸
mage = Mage.new("Merlin", 60, 20, 10) # 用 Mage class 創造一個 name 為 Merlin 的物件,放入 mage 這個 variable 裡
monster = Monster.new("Bone", 100, 30) # 用 Monster class 創造一個 name 為 Bone 的物件,放入 monster 這個 variable 裡
while mage.is_alive? && monster.is_alive? # 如果雙方都還活著,就繼續互相攻擊
mage.attack(monster) # 魔法師先攻擊
if !monster.is_alive? # 判斷怪獸是否已經身亡
break
end
monster.attack(mage) # 怪獸攻擊
end