我正试图用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)
我还认为,出于某种原因,所有实例化的玩家对象要么拥有相同的牌,要么拥有相同的牌对象,我不知道为什么
也许你可以展示更多的代码?具体来说,
BlackJackDeck
是如何初始化的。另外,玩家的手是如何初始化的? 一旦我们得到更多信息,我会更新这个答案。就目前而言,很难说发生了什么而不看到更多然而,这里有一件与此无关的事情引起了我的注意:
list.pop
接受一个可选的整数参数,它将该参数视为从中弹出的索引。从编写代码的方式来看,您似乎觉得这个数字代表希望弹出的项目数,这是不正确的。因此,当您说BlackJackDeck.drawCard(1)
时,您弹出并返回索引1处的卡(第二张卡)。如果你说BlackJackDeck.drawCard(5)
,你不是从牌组中弹出五张牌,而是弹出一张牌——索引5处的牌(第六张牌)编辑-感谢您发布更多的代码。最突出的问题是,每个玩家的手不是一个实例变量,而是一个(静态)类变量。请看这个代码段,它旨在模拟您的代码目前的结构:
输出:
hand
是内存中的单个列表,在所有Player
实例之间共享,因为它是一个类变量。因此,如果您调用add_card_to_hand
,不管您引用的是什么播放器对象,最终都会附加到同一个列表中。您真正想要的是每个玩家的单独列表,因此hand
应该是一个实例变量,如下所示:输出:
我将看一下你在bit中发布的其余代码。如果我看到其他任何东西,我会更新这篇文章
相关问题 更多 >
编程相关推荐