嗨,各位程式碼冒險家!歡迎來到我的「順著感覺走!從零開始的 Python & Vibe Coding 遊戲創作」第十六天。在前幾天的設計藍圖與規則剖析後,今天我們將正式深入程式碼,打造《奇幻卡牌競技場》中一切行動的基礎——Player 類別。這個類別是遊戲中玩家與敵人的核心模型,定義了他們在戰場上生存所需的一切。
在物件導向程式設計(Object-Oriented Programming)中,類別(Class) 就像一個藍圖,用來建構具有相似特徵與功能的物件。Player 類別正是我們為遊戲角色設計的藍圖,它包含了角色的「屬性」(Attributes,角色是什麼)與「方法」(Methods,角色會做什麼)。
首先,我們需要定義一個角色在遊戲中最基本的數據。這些數據將會在其物件被建立時,透過 __init__
這個特殊的初始化函式來設定。
在我們的 player.py
檔案中,Player 類別的核心屬性包括:
name
(名稱):用於區分不同角色,例如「玩家」或「敵人」。health
(生命值):角色的生存根本,起始值為 100。max_health
(最大生命值):生命值的上限,確保治療效果不會無限疊加。shield
(護盾):可吸收傷害的額外防禦層。hand
(手牌):一個清單(List),用來存放角色持有的卡牌。extra_moves
(額外行動次數):用於實現某些卡牌(如盜賊、商人)的特殊效果。player.py
)class Player:
def __init__(self, name):
"""
當一個新的 Player 物件被建立時,這個初始化方法會自動執行。
'self' 代表這個物件本身,我們將傳入的 name 和其他預設值賦予給物件的屬性。
"""
self.name = name # 角色名稱
self.health = 100 # 目前生命值
self.shield = 0 # 目前護盾值
self.max_health = 100 # 最大生命值上限
self.extra_moves = 0 # 額外行動次數
self.hand = [] # 角色的手牌,初始為空清單
class Player:
:這行程式碼定義了一個名為 Player
的類別。def __init__(self, name):
:這是 Player
類別的初始化方法。當我們建立一個新的 Player
物件時(例如 player1 = Player("玩家")
),這個方法會被自動呼叫,並將 "玩家"
這個值傳給 name
參數。self
參數代表正在被建立的物件實例本身,讓我們可以將各種屬性附加到它上面。光有屬性是不夠的,角色必須能夠與遊戲世界互動。這些互動行為就是透過「方法」來實現的。以下是 Player
類別中最重要的幾個方法:
這是戰鬥中最核心的互動。這個方法需要處理複雜的傷害計算邏輯,包含護盾的抵擋以及特殊的穿透傷害。
def take_damage(self, amount, pierce_shield=False):
"""
處理角色受到的傷害。
:param amount: 基礎傷害量
:param pierce_shield: 是否為穿透傷害 (無視護盾),預設為 False
:return: 實際對生命值造成的傷害
"""
damage_dealt = 0
if pierce_shield:
# 如果是穿透傷害,直接扣除生命值
damage_dealt = min(amount, self.health)
self.health -= amount
else:
# 優先從護盾扣除
if self.shield > 0:
if amount >= self.shield:
remaining_damage = amount - self.shield
self.shield = 0
damage_dealt = min(remaining_damage, self.health)
self.health -= damage_dealt
else:
self.shield -= amount
damage_dealt = 0
else:
# 沒有護盾,直接扣生命值
damage_dealt = min(amount, self.health)
self.health -= amount
# 確保生命值不會變成負數
if self.health < 0:
self.health = 0
return damage_dealt
if-else
條件判斷的應用。它首先檢查傷害是否為 pierce_shield
(穿透傷害),如果是,則直接扣減 self.health
。如果不是,則會先檢查角色是否有護盾 (self.shield > 0
)。傷害會優先由護盾吸收,只有當護盾被擊破後,剩餘的傷害才會影響生命值。最後,確保生命值不為負數,並回傳實際對生命值造成的傷害。這兩個方法相對簡單,分別用於恢復生命與增加護盾值。
def heal(self, amount):
"""恢復生命值,但不超過最大生命上限。"""
self.health = min(self.health + amount, self.max_health)
def add_shield(self, amount):
"""增加護盾值。"""
self.shield += amount
heal
方法:這裡使用了 Python 的 min()
函式,巧妙地確保了治療後的生命值 (self.health + amount
) 不會超過最大生命值上限 (self.max_health
)。add_shield
方法:直接將傳入的 amount
累加到 self.shield
屬性上。為了確保遊戲機制的公平性,某些臨時性的狀態(例如額外行動次數)需要在每回合開始時重置。
def reset_for_turn(self):
"""重置每回合開始時的狀態。"""
self.extra_moves = 0
self.extra_moves
屬性重新設為 0,確保上一回合獲得的額外行動不會累積到下一回合。恭喜您!今天我們成功地使用 Python 的 Class(類別) 為《奇幻卡牌競技場》打造了堅實的角色基礎。透過定義清晰的屬性和功能明確的方法,我們不僅讓程式碼結構化、易於管理,更為接下來實現複雜的遊戲邏輯(如卡牌效果觸發、戰鬥流程控制)鋪平了道路。
明天,我們將深入探討遊戲的總指揮官——GameManager
類別,看看它是如何調度 Player
物件,並管理整場遊戲的運行。敬請期待!