繁体   English   中英

Python 3: 如何在我的黑杰克游戏中显示庄家和玩家的牌?

[英]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(使用专用语法或多或少地做同样的事情),而不是将大量字符串与+连接在一起。 后者的效率要低得多,而且通常容易出错,就像您在代码中所做的那样。

最后,拥有两个几乎相同的类是个坏主意,就像您目前拥有的PlayerDealer一样(据我所知,它们的区别在于Dealername提供的默认参数)。 要么你应该只有一个 class,要么你应该有两个类,其中一个从另一个 class 继承其大部分行为(或者可能两个子类从第三个基类继承公共行为)。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM