嗨,各位程式碼冒險家!歡迎來到我的「順著感覺走!從零開始的 Python & Vibe Coding 遊戲創作」第二十一天。在過去幾天,我們賦予了玩家策略選擇的能力,但一場精彩的對決,少不了一個旗鼓相當的對手。今天,我們將揭開《奇幻卡牌競技場》中敵人 AI 的神秘面紗,深入探討其核心大腦——位於 GameManager
類別中的 process_enemy_turn
方法。
這個方法不僅僅是讓敵人隨機出牌,而是涵蓋了一套完整的行動邏輯,從手牌管理到機會主義式的卡牌配對,旨在模擬一個既有規則又不乏變數的對手,為玩家帶來真實的挑戰。
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 回合
# ...
與玩家一樣,AI 也必須遵守手牌上限的規則。在回合開始時,程式會檢查敵人的手牌 (enemy.hand
) 數量是否超過 max_hand_size
。
random.randint
隨機選擇一張多餘的手牌,並透過 pop()
方法將其從 enemy.hand
中移除,再加入到棄牌堆 (self.discard_piles[enemy]
)。這個看似簡單的隨機棄牌機制,不僅遵守了規則,也為 AI 的行為增添了「人味」與不可預測性。AI 的首要任務,是像一個機會主義者一樣,掃描戰場上所有能夠立即獲利的配對機會。
for
迴圈。外層迴圈遍歷 AI 的每一張手牌 (enemy.hand
),內層迴圈則遍歷桌面上的每一張牌 (self.center_pile
)。透過比較兩張牌的 card_type
屬性,找出所有類型相同的潛在配對組合,並將它們的資訊(卡牌物件、手牌索引、桌面牌索引)儲存在一個名為 potential_matches
的清單中。如果 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 是如何進行策略性思考,從手中選出最合適的牌打到桌面上,為未來的回合佈局。敬請期待!