Python 3:在我的黑色杰克游戏中,我如何显示发牌人和玩家有什么牌



如何获得的输出?我有最下面的两行
经销商:钻石之九;红心四号
爱丽丝:钻石2号;钻石杰克
Bob:俱乐部7人;黑桃9
爱丽丝输了。爱丽丝现在有95美元
鲍勃赢了!Bob现在有55美元

我不知道我应该如何调用str方法来显示发牌人有什么牌,两个玩家有什么牌。我需要它的确切格式,但我不知道如何从main调用它。请让我知道什么可行!


import random
class Card():
# initialize the card class
def __init__(self, suit, value):
self.suit = suit
self.__value = value
def __str__(self):
if self.__value == 11:
return "Jack of " + self.suit
if self.__value == 12:
return "Queen of " + self.suit
if self.__value == 13:
return "King of " + self.suit
if self.__value == 14:
return "Ace of " + self.suit
else:
return str(self.__value) + " of " + self.suit
def get_value(self):
if(self.__value <= 10):
return self.__value
elif self.__value <= 13:
return 10
else:
return 14
class DeckOfCards():
# initialize the deck of cards class
def __init__(self):
self.deck = []
suits = ["Hearts", "Diamonds", "Clubs", "Spades"]
for i in range(len(suits)):
for j in range(2, 15):
self.deck.append(Card(suits[i],j))
def print_deck(self):
for i in range(len(self.deck)):
print(self.deck[i])
def shuffle(self):
random.shuffle(self.deck)
def draw_card(self):
return self.deck.pop()
class Dealer():
def __init__(self, name = "Dealer"):
self.name = name
self.hand = []
def __str__(self):
string = self.name + ": "
for i in range(len(self.hand) - 1):
string += self.hand[i] + ": "
string += self.hand[len(self.hand) - 1]
return string
class Player():
def __init__(self, name, amount):
self.name = name
self.amount = amount
self.hand = []
def __str__(self):
string = self.name + ": "
for i in range(len(self.hand) - 1):
string += self.hand[i] + ": "
string += self.hand[len(self.hand) - 1]
return string
def main():
deck = DeckOfCards()
dealer = Dealer()
players = []
players.append(Player("Alice", 100))
players.append(Player("Bob", 50))
deck.shuffle()
dealer.hand.append(deck.draw_card())
dealer.hand.append(deck.draw_card())
for i in range(len(players)):
players[i].hand.append(deck.draw_card())
players[i].hand.append(deck.draw_card())
dealerHand=0
for i in range(len(dealer.hand)):
dealerHand += dealer.hand[i].get_value()

for i in range(len(players)):
playerHand = 0
for j in range(len(players[i].hand)):
playerHand =+ players[i].hand[i].get_value()
if dealerHand > playerHand:
players[i].amount -= 5
print(players[i].name + " lost. " + players[i].name + 
" has now $" + str(players[i].amount))
else:
players[i].amount += 5
print(players[i].name + " won! " + players[i].name + 
" has now $" + str(players[i].amount))
if __name__ == "__main__":
main()

您有两个问题。首先,您根本不想在main函数中打印指针。你只需立即找到每只手的得分,并宣布谁赢了。修复这个问题非常容易,只需要print(dealer),然后在播放器上添加另一个循环,依次打印每个循环。使用for i in range(len(players))通常会有很长的路要走,您可以直接在玩家列表上迭代:

# add this either just above or just below the `dealerHand` loop.
print(dealer)
for p in players:
print(p)

第二个问题是,在Player.__str__中创建输出的代码和相同的Dealer.__str__方法实际上并没有将它试图格式化的Card对象转换为字符串。您需要在查找self.hand[whatever]:的任何位置添加str呼叫

def __str__(self):
string = self.name + ": "
for i in range(len(self.hand) - 1):
string += str(self.hand[i]) + ": "
string += str(self.hand[len(self.hand) - 1])
return string

其他一些注意事项,与您的错误无关:

正如我提到的,你并不总是需要在一个范围内循环。很多时候,你根本不需要索引,所以只需在列表中的值上循环,而不是索引。对于__str__方法中的循环,可以说确实需要索引,因为您希望以不同的方式处理最后一个值(不添加分号(,但使用str.join有一个更好的解决方案。只需拨打"; ".join(str(c) for c in self.hand)即可。

另一个建议是使用字符串格式化方法,如str.format或较新的f字符串(它们用专用语法做或多或少相同的事情(,而不是将许多字符串与+连接在一起。后者的效率要低得多,而且经常容易出错,就像您在代码中所做的那样。

最后,拥有两个几乎相同的类是个坏主意,就像您目前使用的PlayerDealer一样(据我所知,这两个类的不同之处仅在于Dealername提供的默认参数(。要么应该只有一个类,要么应该有两个类,其中一个类从另一个类继承其大部分行为(或者可能有两个子类从第三个基类继承常见行为(。

for i in range(len(players)):
for card in players[i].hand:
print(card)

最新更新