# 文字冒險遊戲簡報
## 🎯 專案目標
- 學習如何運用 **條件判斷** 和 **循環** 控制程式流程。
- 熟悉 **函式** 的使用。
- 體驗 **隨機** 事件的程式設計,增強遊戲趣味性。
---
## 📝 專案簡介
這是一個互動式的文字冒險遊戲。玩家需要面對隨機事件,包括戰鬥、探索、購物等,並且管理角色的血量、飽食度和金幣來生存更長的時間。
---
## 🛠️ 實作流程
### 1. 初始化遊戲狀態
#### 角色的屬性
- **金幣(money):** 用於交易。
- **血量(HP):** 如果降到 0,遊戲結束。
- **攻擊力(ATK):** 用於戰鬥。
- **飽食度(saturation):** 過低會影響恢復效果,降到0時,遊戲結束。
```python=
money, HP, ATK, saturation, day = 10, 10, 1, 10, 0
```
#### 隨機的種子碼
```python=
random.seed()
```
#### 什麼是種子碼?
[種子碼 (Seed) 的簡單講解](/@IllusionaryNight/種子碼的簡單講解)
**注意**
使用亂數時需要在程式檔案最上面加入random模組
```python=
import random
```
[導入模組 (import) 的簡單講解](/@IllusionaryNight/導入模組的簡單講解)
---
### 2. 每天循環流程
每天都會執行以下四種事件:
1. 進行**冒險**(例如戰鬥或遇到商人)
2. 檢查角色是否**存活**(HP 和飽食度)。
3. 夜晚**恢復**狀態,根據飽食度影響恢復效果。
4. 詢問玩家**是否繼續**冒險。
```python=
while(1):
day=day+1
print(f"第{day}天")
# 開始每日冒險流程
# 判斷角色是否血量歸零
# 判斷角色是否餓死
# 回血
# 詢問是否繼續冒險
```
---
### 3. 夜晚邏輯
在一天結束時:
- 飽食度減少。
- 根據飽食度影響血量恢復。
```python=
saturation-=1
if saturation <= 3:
print("餓的睡不好,HP+1")
HP += 1
else:
print("一覺好眠,HP+3")
HP += 3
```
---
### 4. 結束條件
當以下條件成立時,遊戲結束:
- 血量 ≤ 0:角色因傷勢死亡。
- 飽食度 ≤ 0:角色餓死。
```python=
if HP <= 0:
print("你因致命傷而死...遊戲結束")
break
if saturation <= 0:
print("你死於飢餓...遊戲結束")
break
```
---
### 5. 隨機事件設計
使用 `random` 模組產生隨機數,並用 `match-case` 來決定觸發的事件。
隨機範例:
```python=
encounter=random.randint(1,4)
```
這個代表隨機賦予變數encounter 1到4的正整數(包含1和4)
配對範例:
```python=
match encounter:
case 1:
print("遇到野獸")
case 2:
print("找到寶物")
case 3:
print("遇到商人")
case _:
print("什麼都沒發生")
```
這個代表將變數encounter與不同數值進行比對,如果有相同的話執行該情況的事件,如果全都不符合的話則執行第八行條件寫底線(\_)的事件。
還有,如果要在函式中改變函式外的變數的話需要使用 `global` 這個語法。
全域範例:
```python=
x = 10 # 這是全域變數
def my_function():
global x # 宣告 x 是全域變數
x = 5 # 直接修改全域變數 x
print("函數內部的 x:", x) # 5
my_function()
print("函數外部的 x:", x) # 5
```
[全域變數 (global) 的簡單講解](/@IllusionaryNight/全域變數的簡單講解)
#### 進行冒險
```python=
def adventure():
# 主冒險流程函式,隨機決定事件類型
global HP, saturation
print("跋山涉水中...")
encounter = random.randint(1, 4) # 隨機選擇事件類型
match encounter:
case 1:
fightEnemy() # 遇敵戰鬥
case 2:
luckyFound() # 發現好東西
case 3:
travel() # 長途跋涉
case 4:
merchantEncounter() # 遇到商人
```
#### 幸運事件
玩家可能撿到武器、食物或金幣。
```python=
def luckyFound():
global money, ATK, saturation
event = random.randint(1, 3)
match event:
case 1:
print("你撿到了一把長劍!攻擊力+1")
ATK += 1
case 2:
print("你發現了一堆麵包!飽食度+10")
saturation += 10
case 3:
print("你找到了一箱金幣!金幣+10")
money += 10
```
#### 戰鬥事件
讓玩家選擇戰鬥或逃跑:
- 戰鬥:根據攻擊力與敵人屬性決定勝負。
- 逃跑:損失一定血量。
```python=
def fightEnemy():
global HP, ATK
enemy_attack = random.randint(1, 5)
enemy_health = random.randint(3, 8)
action = input("選擇行動:戰鬥(1) 或 逃跑(2):")
if action == "1":
# 戰鬥過程
elif action == "2":
# 逃跑處罰
```
---
## 🧩 延伸挑戰
學員可以選擇以下方式改進遊戲:
1. **新增道具系統:** 玩家可以使用特定物品來恢復血量或飽食度。
:::spoiler
例如說開一個儲存補血藥的變數(int),並在每天夜晚來臨時詢問玩家要不要使用補血藥。
:::
2. **新增故事情節:** 添加 NPC 對話或任務系統。
:::spoiler
例如說加入一個神祕老人,在隨機事件時有可能會隨機出現,他每次出現時會隨機說出一些話,這可以使用==if else==搭配==random==兩者來製作。
:::
3. **改變難度:** 通過設計更多種屬性或加強敵人強度來增加挑戰性。
:::spoiler
例如可以設計厄運值,在隨機事件時,把事件難度由小到大放置,假設有六個事件,將隨機數值(1到6)加上厄運值,使選到困難事件的機率上升。
:::