You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 00:57:35