簡體   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