Python简易War卡牌游戏问题:卡牌无法正常发至玩家手牌
War卡牌游戏卡牌分发问题排查与修复
问题概述
制作简易War卡牌游戏时,处于最终调试阶段,遇到卡牌无法发至玩家手牌的问题。排查发现卡牌已创建,但游戏开始前无法分发到玩家手中。
核心问题分析
1. Deck类初始化逻辑错误
原Deck类的__init__方法中,每次循环都将self.cards重新赋值为单个卡牌的列表,导致最终牌组中仅保留最后一张卡牌,而非完整的52张牌:
# 错误代码 for suit in suits: for rank in ranks: self.cards = [Card(rank, suit)]
2. Player类collectCard方法兼容问题
collectCard方法仅处理字符串类型的卡牌,但Deck.deal()返回的是Card对象,条件判断isinstance(card, str)会跳过对Card对象的添加,导致玩家手牌始终为空:
# 错误代码 def collectCard(self, card): if isinstance(card, str): cardObject = Card.stringToCard(card) self.hand.append(cardObject)
3. Card类字符串表示方法错误
__srt__方法名拼写错误(应为__str__),且直接打印而非返回字符串,导致无法正确输出卡牌信息,影响调试和结果展示。
4. Game类初始化冗余
Game类__init__接收了传入的deck参数,但未使用,反而重新创建Deck实例,造成资源冗余。
修复方案
修正Deck类初始化
先初始化空列表,再逐个添加卡牌到牌组:
class Deck: def __init__(self): suits = ["Spades", "Hearts", "Diamonds", "Clubs"] ranks = ["A", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"] self.cards = [] for suit in suits: for rank in ranks: self.cards.append(Card(rank, suit))
完善Player类collectCard方法
添加对Card对象、卡牌列表的处理,确保所有类型的卡牌都能被收集:
class Player: def collectCard(self, card): if isinstance(card, str): cardObject = Card.stringToCard(card) self.hand.append(cardObject) elif isinstance(card, Card): self.hand.append(card) elif isinstance(card, list): # 处理war中的嵌套卡牌列表 for item in card: if isinstance(item, list): self.hand.extend(item) else: self.hand.append(item)
修正Card类字符串表示方法
class Card: def __str__(self): return f"{self.rank} of {self.suit}"
优化Game类初始化
使用传入的deck实例,避免重复创建:
class Game: def __init__(self, p1, p2, deck): self.deck = deck self.p1 = Player(p1) self.p2 = Player(p2)
修正playRound和war方法中的字符串拼接错误
将self.p1card改为局部变量p1card,并将整数类型的获胜次数转为字符串:
def playRound(self): p1card = self.p1.playCard() p2card = self.p2.playCard() if p1card and p2card: if p1card.compare(p2card) == 1: self.p1.wins += 1 print(f"Player {self.p1.name} wins the round! {self.p1.name} played {p1card} and {self.p2.name} played {p2card}. Player {self.p1.name} now has {self.p1.wins} wins.") self.p1.collectCard(p1card) self.p1.collectCard(p2card) elif p1card.compare(p2card) == -1: self.p2.wins += 1 print(f"Player {self.p2.name} wins the round! {self.p2.name} played {p2card} and {self.p1.name} played {p1card}. Player {self.p2.name} now has {self.p2.wins} wins.") self.p2.collectCard(p1card) self.p2.collectCard(p2card) else: self.war(p1card, p2card) else: print("A player has run out of cards!")
完整修正代码
import random class Card: def __init__(self, rank, suit): self.rank = rank self.suit = suit self.value = self.calcVal() def __str__(self): return f"{self.rank} of {self.suit}" @staticmethod def stringToCard(card_str): rank, suit = card_str.split(" of ") return Card(rank, suit) def calcVal(self): if self.rank == "A": return 14 elif self.rank == "K": return 13 elif self.rank == "Q": return 12 elif self.rank == "J": return 11 else: return int(self.rank) def compare(self, card2): if self.value > card2.value: return 1 elif self.value < card2.value: return -1 else: return 0 class Deck: def __init__(self): suits = ["Spades", "Hearts", "Diamonds", "Clubs"] ranks = ["A", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"] self.cards = [] for suit in suits: for rank in ranks: self.cards.append(Card(rank, suit)) def shuffle(self): random.shuffle(self.cards) print("Shuffled deck.") def deal(self): if self.cards: return self.cards.pop() else: return None class Player: def __init__(self, name): self.name = name self.hand = [] self.wins = 0 def collectCard(self, card): if isinstance(card, str): cardObject = Card.stringToCard(card) self.hand.append(cardObject) elif isinstance(card, Card): self.hand.append(card) elif isinstance(card, list): for item in card: if isinstance(item, list): self.hand.extend(item) else: self.hand.append(item) def chooseCard(self): if len(self.hand) > 0: return self.hand.pop() else: return None def playCard(self): return self.chooseCard() class Game: def __init__(self, p1, p2, deck): self.deck = deck self.p1 = Player(p1) self.p2 = Player(p2) def beginGame(self): self.deck.shuffle() for i in range(26): card1 = self.deck.deal() card2 = self.deck.deal() self.p1.collectCard(card1) self.p2.collectCard(card2) print(f"Dealt cards: {self.p1.name} has {len(self.p1.hand)} cards, {self.p2.name} has {len(self.p2.hand)} cards.") def playRound(self): p1card = self.p1.playCard() p2card = self.p2.playCard() if p1card and p2card: compare_result = p1card.compare(p2card) if compare_result == 1: self.p1.wins += 1 print(f"Player {self.p1.name} wins the round! {self.p1.name} played {p1card}, {self.p2.name} played {p2card}. {self.p1.name} now has {self.p1.wins} wins.") self.p1.collectCard(p1card) self.p1.collectCard(p2card) elif compare_result == -1: self.p2.wins += 1 print(f"Player {self.p2.name} wins the round! {self.p2.name} played {p2card}, {self.p1.name} played {p1card}. {self.p2.name} now has {self.p2.wins} wins.") self.p2.collectCard(p1card) self.p2.collectCard(p2card) else: self.war(p1card, p2card) else: print("A player has run out of cards!") def war(self, card1, card2): print("War!") p1warcards = [] p2warcards = [] # 收集3张牌,处理卡牌不足的情况 for _ in range(3): p1_card = self.p1.chooseCard() p2_card = self.p2.chooseCard() if not p1_card or not p2_card: print("Someone doesn't have enough cards for War!") # 将现有卡牌返回给各自玩家 if p1_card: self.p1.collectCard(p1_card) if p2_card: self.p2.collectCard(p2_card) self.p1.collectCard(card1) self.p2.collectCard(card2) self.p1.collectCard(p1warcards) self.p2.collectCard(p2warcards) return p1warcards.append(p1_card) p2warcards.append(p2_card) p1warcard = self.p1.playCard() p2warcard = self.p2.playCard() if p1warcard and p2warcard: compare_result = p1warcard.compare(p2warcard) if compare_result == 1: self.p1.wins +=1 print(f"Player {self.p1.name} wins the war! {self.p1.name} played {p1warcard}, {self.p2.name} played {p2warcard}. {self.p1.name} now has {self.p1.wins} wins.") # 收集所有战争卡牌 self.p1.collectCard(card1) self.p1.collectCard(card2) self.p1.collectCard(p1warcards) self.p1.collectCard(p2warcards) self.p1.collectCard(p1warcard) self.p1.collectCard(p2warcard) elif compare_result == -1: self.p2.wins +=1 print(f"Player {self.p2.name} wins the war! {self.p2.name} played {p2warcard}, {self.p1.name} played {p1warcard}. {self.p2.name} now has {self.p2.wins} wins.") self.p2.collectCard(card1) self.p2.collectCard(card2) self.p2.collectCard(p1warcards) self.p2.collectCard(p2warcards) self.p2.collectCard(p1warcard) self.p2.collectCard(p2warcard) else: # 平局继续战争,将当前卡牌加入战争池 self.p1.collectCard(card1) self.p2.collectCard(card2) self.p1.collectCard(p1warcards) self.p2.collectCard(p2warcards) self.war(p1warcard, p2warcard) else: # 一方卡牌耗尽,将所有卡牌给另一方 if p1warcard: self.p1.collectCard(card1) self.p1.collectCard(card2) self.p1.collectCard(p1warcards) self.p1.collectCard(p2warcards) self.p1.collectCard(p1warcard) else: self.p2.collectCard(card1) self.p2.collectCard(card2) self.p2.collectCard(p1warcards) self.p2.collectCard(p2warcards) self.p2.collectCard(p2warcard) player1 = input("Welcome to my War game! Please begin by entering the name of player one.\n") player2 = input("Now please enter the name of player 2.\n") newDeck = Deck() newgame = Game(player1, player2, newDeck) newgame.beginGame() x = 0 while x < 5: x += 1 print(f"\nRound {x}:") newgame.playRound()
内容的提问来源于stack exchange,提问作者Flegi
相关产品推荐
相关产品推荐

