iT邦幫忙

2025 iThome 鐵人賽

DAY 21
0
自我挑戰組

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

第二十一天:智慧的對決:敵人 AI 的回合行動與配對策略 (上)

  • 分享至 

  • xImage
  •  

嗨,各位程式碼冒險家!歡迎來到我的「順著感覺走!從零開始的 Python & Vibe Coding 遊戲創作」第二十一天。在過去幾天,我們賦予了玩家策略選擇的能力,但一場精彩的對決,少不了一個旗鼓相當的對手。今天,我們將揭開《奇幻卡牌競技場》中敵人 AI 的神秘面紗,深入探討其核心大腦——位於 GameManager 類別中的 process_enemy_turn 方法。

這個方法不僅僅是讓敵人隨機出牌,而是涵蓋了一套完整的行動邏輯,從手牌管理機會主義式的卡牌配對,旨在模擬一個既有規則又不乏變數的對手,為玩家帶來真實的挑戰。


一、AI 的回合啟動:process_enemy_turn 核心方法

當輪到敵方行動時 (game_state 變為 "ENEMY_TURN"),process_enemy_turn 方法就會被呼叫。它的職責是規劃並執行敵人在該回合的所有操作,確保 AI 的行動既符合遊戲規則,又具備一定的策略性。

這個方法的核心邏輯圍繞著一個 while 迴圈展開,模擬 AI 在其行動次數 (max_actions_per_turn) 限制內,不斷尋找最佳行動的過程。

程式碼實現 (gamemanager.py)
def process_enemy_turn(self):
    self.game_state = "ENEMY_TURN"
    enemy = self.player2
    player = self.player1
    # ...
    
    # 1. 手牌超限處理 (斷捨離)
    if len(enemy.hand) > self.max_hand_size:
        # ... (處理棄牌邏輯)

    self.action_count = 0
    while self.action_count < self.max_actions_per_turn:
        # 2. 尋找所有可能的配對
        potential_matches = []
        for hand_idx, enemy_hand_card in enumerate(enemy.hand):
            for center_idx, center_table_card in enumerate(self.center_pile):
                if enemy_hand_card.card_type == center_table_card.card_type:
                    potential_matches.append((enemy_hand_card, hand_idx, center_idx))

        # 3. 執行配對或切換到出牌策略
        if potential_matches:
            # 隨機選擇一組進行配對
            chosen_match_card, chosen_hand_idx, chosen_center_idx = random.choice(potential_matches)
            
            # ... (執行配對、觸發效果、翻新牌、嘗試自動連擊) ...

            continue # 成功配對後,繼續尋找下一次配對
        else:
            # 沒有可配對的牌,進入策略性出牌邏輯 (Day 22 的主題)
            # ...
            break # 無法再配對,跳出迴圈
            
    self.advance_turn() # 結束 AI 回合
    # ...

二、程式碼技術細節深度解析

1. 手牌管理:AI 的「斷捨離」

與玩家一樣,AI 也必須遵守手牌上限的規則。在回合開始時,程式會檢查敵人的手牌 (enemy.hand) 數量是否超過 max_hand_size

  • 技術實現:如果手牌超限,程式會進入一個迴圈,使用 random.randint 隨機選擇一張多餘的手牌,並透過 pop() 方法將其從 enemy.hand 中移除,再加入到棄牌堆 (self.discard_piles[enemy])。這個看似簡單的隨機棄牌機制,不僅遵守了規則,也為 AI 的行為增添了「人味」與不可預測性。
2. 機會主義的配對策略:尋找並執行

AI 的首要任務,是像一個機會主義者一樣,掃描戰場上所有能夠立即獲利的配對機會。

  • 技術實現:這裡使用了兩個巢狀的 for 迴圈。外層迴圈遍歷 AI 的每一張手牌 (enemy.hand),內層迴圈則遍歷桌面上的每一張牌 (self.center_pile)。透過比較兩張牌的 card_type 屬性,找出所有類型相同的潛在配對組合,並將它們的資訊(卡牌物件、手牌索引、桌面牌索引)儲存在一個名為 potential_matches 的清單中。
3. 隨機性決策與連鎖反應

如果 potential_matches 清單不為空,代表 AI 找到了至少一個可行的配對。此時,AI 的決策帶有一定的隨機性,這讓玩家難以完全預測其行動。

  • 技術實現
    • random.choice(potential_matches):這是 AI 決策的核心。程式會從所有可行的配對中隨機選擇一組來執行。
    • trigger_card_effect(...):一旦選定,AI 會立刻呼叫 trigger_card_effect 方法,將卡牌效果施加在玩家身上。
    • 資源流轉:配對成功的兩張牌會被 pop() 出手牌與桌面,並 extend() 至 AI 的棄牌堆。
    • 連擊的可能性:配對後,系統會翻開一張新牌 (draw_card_to_center)。如果這張新牌恰好能與桌面上現有的牌觸發自動連擊 (_attempt_auto_match_on_new_card),AI 同樣能享受到這個不消耗行動次數的額外效果。
    • continue 關鍵字:在成功完成一次配對(包括可能的自動連擊)後,continue 語句會讓 while 迴圈立即進入下一次迭代,促使 AI 在行動次數允許的範圍內,繼續尋找下一個配對機會,從而實現快節奏的連續打擊。

透過 process_enemy_turn 方法的前半部分,我們為 AI 建立了一套清晰而高效的行動框架。它首先確保自身狀態符合規則,然後積極地在戰場上尋找並利用每一個配對機會。隨機性的引入,使得 AI 的行為既符合邏輯又難以預測,為玩家創造了一個充滿動態與挑戰的對手。

然而,一個更聰明的 AI,在無牌可配時,並不會束手無策。明天,我們將深入探討 process_enemy_turn 方法的後半段——當 potential_matches 為空時,AI 是如何進行策略性思考,從手中選出最合適的牌打到桌面上,為未來的回合佈局。敬請期待!


上一篇
第二十天:策略交鋒:玩家配對與意想不到的自動連擊
下一篇
第二十二天:智慧的對決:敵人 AI 的回合行動與配對策略 (下)
系列文
順著感覺走!從零開始的 Python & Vibe Coding 遊戲創作22
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言