# 用class做文字RPG
[課堂colab](https://colab.research.google.com/drive/1ELe5wPrV0Cc13TLrkB2WkBFdqqS_i6L2?usp=sharing)
# RPG-class
## 角色
- Attributes
- 名稱
- 攻擊
- 血量
- 魔法
- 座標
- 經驗值
- Methods
- x座標移動a單位(a) 讓x座標增加a
- y座標移動b單位(b): 讓y座標增加b
- 與角色距離(角色): 回傳兩者距離
- 攻擊角色(角色): 敵方血量減少我方攻擊力
- 顯示資訊: 顯示角色名稱、位置、攻擊、血量
- 打怪(怪物): 顯示打怪過程,若打過,獲得經驗值
## 怪物
- Attributes
- 名稱
- 經驗值
- 攻擊
- 血量
```python=
class 角色:
x = 0
y = 0
經驗值 = 0
def __init__(self, name, attack, hp, mp):
self.名稱 = name
self.攻擊 = attack
self.血量 = hp
self.魔法 = mp
def 顯示位置(self):
return f'現在{self.名稱}的位置在{self.座標}'
def 顯示位置_x(self):
print(f'現在{self.名稱}的位置在({self.x},{self.y})')
def 與角色距離(self, 其他人):
return ((self.x - 其他人.x)**2 + (self.y - 其他人.y)**2)**(1/2)
def 顯示資訊(self):
result = "\n***顯示角色資訊***\n"
result += f'角色{self.名稱},目前位置({self.x},{self.y})\nHP: {self.血量}、MP: {self.魔法}\n攻擊: {self.攻擊}、EXP: {self.經驗值}'
result += "\n******************\n"
return result
def 打怪(self, monster):
process = '開始打怪!\n'
result = ''
回合 = 0
while(self.血量 > 0 and monster.血量 > 0):
回合 += 1
monster.血量 = monster.血量 - self.攻擊
self.血量 = self.血量 - monster.攻擊
process += f'第{回合}回合結束,{self.名稱}剩下HP{self.血量},{monster.名稱}剩下HP:{monster.血量}\n'
if self.血量 <= 0:
result = f'經過{回合}回合,{self.名稱}掛ㄌ。'
else:
self.經驗值 += monster.經驗值
result = f'經過{回合}回合,{monster.名稱}掛ㄌ。\n{self.名稱}獲得經驗值{monster.經驗值}'
return process, result
class 怪物:
def __init__(self, name, exp, attack, hp):
self.名稱 = name
self.經驗值 = exp
self.攻擊 = attack
self.血量 = hp
kyle = 角色(name='Kyle', attack = 13, hp = 139, mp = 20)
家安 = 角色(name='家安', attack = 13, hp = 139, mp = 20)
print(kyle.顯示資訊())
哥布林 = 怪物(name='哥布林', exp = 200, attack = 1, hp = 50)
p, r = kyle.打怪(哥布林)
print(p)
print(r)
print(kyle.顯示資訊())
```
## 繼承
```python=
class 戰士(角色):
職業名稱 = '戰士'
def __init__(self, name):
super().__init__(name = name, attack = 100, hp = 1000, mp = 1)
# overwrite
def 顯示資訊(self):
result = super().顯示資訊().replace('角色', '戰士')
return result
amber = 戰士(name = 'Amber')
print(amber.顯示資訊())
```