在21点游戏中,将纸牌对象与玩家对象的手进行交易时出现问题

2024-10-05 14:27:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试图用Python开发一个简单的21点游戏。我正处于这样一个阶段:我想把一张牌发到发牌人的手上(发牌人类别中的列表)和发牌人的手上(发牌人类别中的列表)。当我与庄家交易时没有问题,但是我有一个名为playerSet的列表中的玩家,我使用for循环从牌堆中弹出一张牌,并将其附加到每个玩家的手上。问题是,每次我试图附加到一个玩家的手牌时,牌都会复制到每个玩家的手牌上

以下是一些相关代码:

def DealCards():
    global BlackJackDeck
    Dealer1.addToHand(BlackJackDeck.drawCard())
    #Would love to know why same card is ent to both decks
    for i in range(0,len(playerSet)):
        playerSet[i].addToHand(BlackJackDeck.drawCard())
        break

这是位于deck类中的draw方法

def drawCard(self):
        #may need to change this method
        return self.Deck.pop()

根据玩家的等级,这是如何将手牌声明为列表的

class player(object):
    name = None
    Token = int(500)
    score = 0
    bet = 0
    hand = []

    def __init__(self,name):
        self.name = name

这是用于将卡添加到玩家手上的方法-玩家类中的列表

def addToHand(self,card):
        if isinstance(card,Card):
                self.hand.append(card)
        else: 
            print("This is not a Card..")

21点甲板只是甲板类的一个实例,我将在下面附加它

BlackJackdeck =Deck()


from Card import Card
import random

class Deck():
    Deck=[]
    def __init__(self):
         self.Deck =[]
         self.build()

    def build(self):

        for s in ["Hearts", "Spades", "Diamonds","Clubs"]:
            for v in range(1,14):
                if v>10:
                    for royalty in ["Jack","Queen", "King"]:
                        self.Deck.append(Card("{} of {}".format(royalty,s),s,10))
                    break
                else:
                    self.Deck.append(Card("{} of {}".format(v,s),s,v))

    def view(self):
        for view in self.Deck:
            #view.printer()
            #print("{} of {} ".format(view.value, view.suit))
            print("{}".format(view.name))

    def drawCard(self):
        #may need to change this method
        return self.Deck.pop()


    def shuffle(self):
        random.shuffle(self.Deck)


    def returnHand(self,playerHand=[]):
        if len(self.Deck)>52:
            print(f"Player hand couldn't be added there are too many cards in the deck {playerHand}")
        elif len(self.Deck)+len(playerHand)<=52:
            self.Deck.append(playerHand)

我还认为,出于某种原因,所有实例化的玩家对象要么拥有相同的牌,要么拥有相同的牌对象,我不知道为什么


Tags: tonameinselfview列表forlen
1条回答
网友
1楼 · 发布于 2024-10-05 14:27:13

也许你可以展示更多的代码?具体来说,BlackJackDeck是如何初始化的。另外,玩家的手是如何初始化的? 一旦我们得到更多信息,我会更新这个答案。就目前而言,很难说发生了什么而不看到更多

然而,这里有一件与此无关的事情引起了我的注意:list.pop接受一个可选的整数参数,它将该参数视为从中弹出的索引。从编写代码的方式来看,您似乎觉得这个数字代表希望弹出的项目数,这是不正确的。因此,当您说BlackJackDeck.drawCard(1)时,您弹出并返回索引1处的卡(第二张卡)。如果你说BlackJackDeck.drawCard(5),你不是从牌组中弹出五张牌,而是弹出一张牌——索引5处的牌(第六张牌)

编辑-感谢您发布更多的代码。最突出的问题是,每个玩家的手不是一个实例变量,而是一个(静态)类变量。请看这个代码段,它旨在模拟您的代码目前的结构:

class Player:
    hand = []

    def __init__(self, name):
        self.name = name

    def add_card_to_hand(self, card):
        self.hand.append(card)


player_1 = Player("Bob")
player_2 = Player("Tom")

player_1.add_card_to_hand("Ace of Spades")
player_2.add_card_to_hand("Queen of Hearts")

print(f"{player_1.name}'s hand: {player_1.hand}")
print(f"{player_2.name}'s hand: {player_2.hand}")

输出:

Bob's hand: ['Ace of Spades', 'Queen of Hearts']
Tom's hand: ['Ace of Spades', 'Queen of Hearts']
>>> 

hand是内存中的单个列表,在所有Player实例之间共享,因为它是一个类变量。因此,如果您调用add_card_to_hand,不管您引用的是什么播放器对象,最终都会附加到同一个列表中。您真正想要的是每个玩家的单独列表,因此hand应该是一个实例变量,如下所示:

class Player:

    def __init__(self, name):
        self.hand = []
        self.name = name

    def add_card_to_hand(self, card):
        self.hand.append(card)


player_1 = Player("Bob")
player_2 = Player("Tom")

player_1.add_card_to_hand("Ace of Spades")
player_2.add_card_to_hand("Queen of Hearts")

print(f"{player_1.name}'s hand: {player_1.hand}")
print(f"{player_2.name}'s hand: {player_2.hand}")

输出:

Bob's hand: ['Ace of Spades']
Tom's hand: ['Queen of Hearts']
>>> 

我将看一下你在bit中发布的其余代码。如果我看到其他任何东西,我会更新这篇文章

相关问题 更多 >