如何在 Python 中编写 Blackjack 程序?

50 阅读2分钟

Blackjack 是一种流行的纸牌游戏,玩家需要与庄家进行对比,比大小,最早达到 21 点或最接近 21 点的人获胜。如果玩家的点数超过 21 点,则称为爆牌,输掉比赛。玩家需要在游戏开始时,从发牌员那里领取两张底牌,发牌员也同样领取两张底牌,其中一张底牌是明牌,一张底牌是暗牌。玩家根据自己的两张底牌,决定是否要继续领取更多牌。

2、解决方案 以下是解决这个问题的一些方法:

  • 使用字典(dict)来存储牌的点数。 您可以创建一个字典,其中键是牌的名称,值是牌的点数。例如:
card_vals = {"Jack": 5, "Queen": 10, "King": 10, "Ace": 1}
  • 使用类来创建牌。 您可以创建一个 Card 类,其中包含牌的花色和点数这两个属性。例如:
class Card:
    def __init__(self, suit, value):
        self.suit = suit
        self.value = value
  • 使用随机数来生成一副牌。 您可以使用 random 模块中的 shuffle() 函数来生成一副随机排序的牌。例如:
import random

deck = [Card(suit, value) for suit in ["Clubs", "Diamonds", "Hearts", "Spades"] for value in range(2, 11)] + [Card(suit, 10) for suit in ["Clubs", "Diamonds", "Hearts", "Spades"]] + [Card(suit, 1) for suit in ["Clubs", "Diamonds", "Hearts", "Spades"]]

random.shuffle(deck)
  • 使用循环来发牌。 您可以使用循环来发牌给玩家和庄家。例如:
for i in range(2):
    player_hand.append(deck.pop())
    dealer_hand.append(deck.pop())
  • 使用 if/else 语句来比较玩家和庄家的点数。 您可以使用 if/else 语句来比较玩家和庄家的点数,并确定胜负。例如:
if player_hand > dealer_hand:
    print("Player wins!")
elif player_hand == dealer_hand:
    print("Tie!")
else:
    print("Dealer wins!")

以下是实现上述解决方案的代码示例:

import random

class Card:
    def __init__(self, suit, value):
        self.suit = suit
        self.value = value

    def __str__(self):
        return f"{self.value} of {self.suit}"

    def getValue(self):
        if 0 < self.value < 10:
            return self.value + 1
        elif self.value == 0:
            return 11
        else:
            return 10

class Deck:
    def __init__(self):
        self.cards = [Card(suit, value) for suit in ["Clubs", "Diamonds", "Hearts", "Spades"] for value in range(2, 11)] + [Card(suit, 10) for suit in ["Clubs", "Diamonds", "Hearts", "Spades"]] + [Card(suit, 1) for suit in ["Clubs", "Diamonds", "Hearts", "Spades"]]

        random.shuffle(self.cards)

    def deal(self):
        return self.cards.pop()

class Player:
    def __init__(self, name):
        self.name = name
        self.hand = []

    def takeCard(self, card):
        self.hand.append(card)

    def getScore(self):
        score = 0
        aces = 0

        for card in self.hand:
            value = card.getValue()

            if value == 11:
                aces += 1
            else:
                score += value

        if aces > 0:
            if score + aces <= 21:
                score += aces
            else:
                score += aces - 10

        return score

class Dealer(Player):
    def __init__(self):
        super().__init__("Dealer")

    def dealCards(self, player):
        player.takeCard(self.deal())
        player.takeCard(self.deal())

def playBlackjack():
    deck = Deck()
    dealer = Dealer()
    player = Player("Player 1")

    dealer.dealCards(player)
    dealer.dealCards(dealer)

    print(f"{player.name}'s hand: {player.hand}")
    print(f"{dealer.name}'s hand: [{dealer.hand[0]}, ?]")

    while True:
        choice = input("Hit or stand? (h/s) ")

        if choice == "h":
            player.takeCard(dealer.deal())
            print(f"{player.name}'s hand: {player.hand}")

            if player.getScore() > 21:
                print(f"{player.name} busts!")
                break
        else:
            break

    dealer_score = dealer.getScore()
    player_score = player.getScore()

    print(f"{dealer.name}'s hand: {dealer.hand}")

    if dealer_score > 21:
        print(f"{dealer.name} busts!")
    elif dealer_score < player_score:
        print(f"{player.name} wins!")
    elif dealer_score == player_score:
        print("Tie!")
    else:
        print(f"{dealer.name} wins!")

playBlackjack()