---
# System prepended metadata

title: 用class做文字RPG

---

# 用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.顯示資訊())
```