[英]Python 3: How can I display what cards the dealer and players have in my game of black jack?
如何获得 output 的? 我有最下面的两行。
庄家: 9 of Diamonds; 红心4;
爱丽丝:2颗钻石; 钻石杰克;
鲍勃:俱乐部的 7 个; 黑桃9;
爱丽丝输了。 爱丽丝现在有 95 美元
鲍勃赢了! 鲍勃现在有 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
function 中的手。 您只需 go 立即找到每手牌的分数并宣布谁赢了。 解决这个问题非常容易,您只需要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__
中创建 output 和相同的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
有一个更好的解决方案。 只需在 self.hand 中调用"; ".join(str(c) for c in self.hand)
。
另一个建议是使用字符串格式化方法,例如str.format
或较新的 f-strings(使用专用语法或多或少地做同样的事情),而不是将大量字符串与+
连接在一起。 后者的效率要低得多,而且通常容易出错,就像您在代码中所做的那样。
最后,拥有两个几乎相同的类是个坏主意,就像您目前拥有的Player
和Dealer
一样(据我所知,它们的区别在于Dealer
为name
提供的默认参数)。 要么你应该只有一个 class,要么你应该有两个类,其中一个从另一个 class 继承其大部分行为(或者可能两个子类从第三个基类继承公共行为)。
for i in range(len(players)):
for card in players[i].hand:
print(card)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.