iT邦幫忙

2025 iThome 鐵人賽

DAY 16
0
自我挑戰組

順著感覺走!從零開始的 Python & Vibe Coding 遊戲創作系列 第 16

第16天: 戰場上的生存者:《奇幻卡牌競技場》Player 類別的屬性與行為

  • 分享至 

  • xImage
  •  

嗨,各位程式碼冒險家!歡迎來到我的「順著感覺走!從零開始的 Python & Vibe Coding 遊戲創作」第十六天。在前幾天的設計藍圖與規則剖析後,今天我們將正式深入程式碼,打造《奇幻卡牌競技場》中一切行動的基礎——Player 類別。這個類別是遊戲中玩家與敵人的核心模型,定義了他們在戰場上生存所需的一切。

在物件導向程式設計(Object-Oriented Programming)中,類別(Class) 就像一個藍圖,用來建構具有相似特徵與功能的物件。Player 類別正是我們為遊戲角色設計的藍圖,它包含了角色的「屬性」(Attributes,角色是什麼)與「方法」(Methods,角色會做什麼)。


一、核心屬性 (Attributes):定義角色的基礎狀態

首先,我們需要定義一個角色在遊戲中最基本的數據。這些數據將會在其物件被建立時,透過 __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 參數代表正在被建立的物件實例本身,讓我們可以將各種屬性附加到它上面。

二、關鍵方法 (Methods):賦予角色動態行為

光有屬性是不夠的,角色必須能夠與遊戲世界互動。這些互動行為就是透過「方法」來實現的。以下是 Player 類別中最重要的幾個方法:

1. 承受傷害 (take_damage)

這是戰鬥中最核心的互動。這個方法需要處理複雜的傷害計算邏輯,包含護盾的抵擋以及特殊的穿透傷害。

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)。傷害會優先由護盾吸收,只有當護盾被擊破後,剩餘的傷害才會影響生命值。最後,確保生命值不為負數,並回傳實際對生命值造成的傷害。
2. 治療 (heal) 與增加護盾 (add_shield)

這兩個方法相對簡單,分別用於恢復生命與增加護盾值。

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 屬性上。
3. 回合重置 (reset_for_turn)

為了確保遊戲機制的公平性,某些臨時性的狀態(例如額外行動次數)需要在每回合開始時重置。

def reset_for_turn(self):
    """重置每回合開始時的狀態。"""
    self.extra_moves = 0
  • 這個方法非常簡單,僅是將 self.extra_moves 屬性重新設為 0,確保上一回合獲得的額外行動不會累積到下一回合。

恭喜您!今天我們成功地使用 Python 的 Class(類別) 為《奇幻卡牌競技場》打造了堅實的角色基礎。透過定義清晰的屬性和功能明確的方法,我們不僅讓程式碼結構化、易於管理,更為接下來實現複雜的遊戲邏輯(如卡牌效果觸發、戰鬥流程控制)鋪平了道路。

明天,我們將深入探討遊戲的總指揮官——GameManager 類別,看看它是如何調度 Player 物件,並管理整場遊戲的運行。敬請期待!


上一篇
第十五天: 程式碼中的卡牌靈魂:Card 類別與 SkillEffect 定義
下一篇
第17天: 遊戲運行的心臟:《奇幻卡牌競技場》GameManager 的啟動與核心屬性
系列文
順著感覺走!從零開始的 Python & Vibe Coding 遊戲創作20
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言