如何打印这副牌中剩余的牌? (Python)

问题描述 投票:0回答:1

我按照教程用 Python 编写了二十一点代码。它生成一副牌,玩一轮二十一点,然后结束程序。一旦玩家和庄家收到了他们的所有牌,并且宣布了结果,我想打印这副牌中所有剩余的牌以验证它是否正常工作。这样我就可以自信地继续玩多副牌了。

class Card:
    def __init__(self,value,suit):
        self.cost = value
        self.value = ['A', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K'][value-1]
        self.suit = '♥♦♣♠'[suit]

    def price(self):
        if self.cost >= 10:
            return 10
        elif self.cost == 1:
            return 11
        return self.cost
    
    def show(self):
        print('_________')
        print(f'| {self.value:<2}    |')
        print('|       |')
        print(f'|   {self.suit}   |')
        print('|       |')
        print(f'|    {self.value:>2} |')
        print('_________')




import random
from card import Card

class Deck:
    def __init__(self):
        self.cards = []

    def generate(self):
        for i in range(1, 14):
            for j in range(4):
                self.cards.append(Card(i, j))

    def draw(self, iteration):
        cards = []
        for i in range(iteration):
            card = random.choice(self.cards)
            self.cards.remove(card)
            cards.append(card)
        return cards
    
    def count(self):
        return len(self.cards)
    
    def remaining(self):





from deck import Deck

class Player:
    def __init__(self, isDealer, deck):
        self.cards = []
        self.isDealer = isDealer
        self.deck = deck
        self.score = 0

    def hit(self):
        self.cards.extend(self.deck.draw(1))
        self.check_score()
        if self.score > 21: #Useless
            return 1
        return 0
    
    def deal(self):
        self.cards.extend(self.deck.draw(1))
        self.check_score()
        if self.score == 21: #Useless
            return 1
        return 0
    
    def check_score(self):
        a_counter = 0
        self.score = 0
        for card in self.cards:
            if card.price() == 11:
                a_counter += 1
            self.score += card.price()

        while a_counter != 0 and self.score > 21:
            a_counter -= 1
            self.score -= 10
        return self.score
    
    def show(self):
        if self.isDealer:
            print("Dealer's Cards")

            for i in self.cards:
                i.show()

            print("Score: " + str(self.score))

        elif not self.isDealer:
            print("Players Cards")

            for i in self.cards:
                i.show()

            print("Score: " + str(self.score))




from deck import Deck
from player import Player

class Blackjack:
    def __init__(self):
        self.deck = Deck()
        self.deck.generate()
        self.player = Player(False, self.deck)
        self.dealer = Player(True, self.deck)

    def play(self):
        self.player.deal()
        self.dealer.deal()
        self.player.hit()

        self.dealer.show()

        if self.dealer.check_score() == 11: #Don't forget about chips
            print("Insurance?")

        self.dealer.hit()

        if self.player.check_score() == 21:
            p_status = 1
        else:
            p_status = 0
        if self.dealer.check_score() == 21:
            d_status = 1
        else:
            d_status = 0

        self.player.show()

        if p_status == 1:
            print("Player got Blackjack! Congrats!")
            if d_status == 1:
                self.dealer.show()
                print("Dealer and Player got Blackjack! It's a push. (Tie)") #Won't work since dealer only has one card
            return 1
        
        cmd = ""
        while cmd != "Stand":
            bust = 0
            cmd = input("Hit or Stand? ")

            if cmd == "Hit":
                bust = self.player.hit()
                self.player.show()

            if bust == 1:
                print("Player busted. Good Game!")
                return 1
        print("\n")
        self.dealer.show()
        if d_status == 1:
            print("Dealer got Blackjack! Better luck next time!")
            return 1
        
        while self.dealer.check_score() < 17:
            if self.dealer.hit() == 1:
                self.dealer.show()
                print("Dealer busted. Congrats!")
                return 1
            self.dealer.show()

        if self.dealer.check_score() == self.player.check_score():
            print("It's a Push (Tie). Better luck next time!")
        elif self.dealer.check_score() > self.player.check_score():
            print("Dealer wins. Good Game!")
        elif self.dealer.check_score() < self.player.check_score():
            print("Player wins. Congradulations!")

        self.deck.remaining()

b = Blackjack()
b.play()
python blackjack
1个回答
0
投票

看起来一个简单的 for 循环就可以解决问题。卡组类中的所有其他代码看起来都正确地从列表中删除了一张卡。 所以:

def remaining(self):
   for card in self.cards:
      print("Remaining cards in deck":)
      print(card)

您也可以将整个列表打印为一个洞。

print(self.cards)

只需确保卡片类具有 str() 方法即可。

© www.soinside.com 2019 - 2024. All rights reserved.