[英]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.