它为什么要创建绑定方法以及如何修复它?

2024-05-14 06:20:52 发布

您现在位置:Python中文网/ 问答频道 /正文

当我手动调用deal方法时,它可以工作,但当我在下面玩时,它会创建一个绑定方法。 有什么好办法吗

import  random

#Raw values

suits = ("Hearts","Diamonds","Spades","Clubs")
ranks = ("Two","Three","Four","Five","Six","Seven","Eight","Nine","Ten","Jack","Queen","King","Ace")
values = {"Two":2,"Three":3,"Four":4,"Five":5,"Six":6,"Seven":7,"Eight":8,"Nine":9,"Ten":10,"Jack":10,"Queen":10,"King":10,"Ace":11}

playing = True

这里定义了类

#Define classes

class Card:

    def __init__(self,suit,rank):
        self.suit = suit
        self.rank = rank

    def __str__(self):
        return self.rank + " of " + self.suit


class Deck:

    def __init__(self):
        self.deck = []
        for suit in suits:
            for rank in ranks:
                self.deck.append(Card(suit,rank))

    def __str__(self):
        deck_comp = ""
        for card in self.deck:
            deck_comp += " \n " + card.__str__()
        return "The deck has" + deck_comp

    def shuffle(self):
        random.shuffle(self.deck)

    def deal(self):
        single_card = self.deck.pop()
        return single_card

手类,用于为玩家创建手

class Hand:

    def __init__(self):
        self.cards = []
        self.value = 0
        self.ace = 0

    def add_card(self,card):
        self.cards.append(card)
        self.value += values[card.rank]
        if card.rank == "Ace":
            self.ace += 1

    def adjust_for_ace(self):
        while self.value >21 and self.ace>0:
            self.value -= 10
            self.ace -= 1

函数在这里生成

#Functions to use during play

def Take_bet(chips):

    while True:
        try:
            chips.bet = int(input("Enter your bet:"))
        except ValueError:
            print("Bet must be in integer form")
        else:
            if chips.bet>chips.chip:
                print("Bet is outside ",chips.chip)
            else:
                break

Hit函数主要是创建界方法问题

def Hit(deck,hand):
    hand.add_card(deck.deal)
    hand.adjust_for_ace()

def Hit_or_stand(deck,hand):
    global playing

    while True:    
        x = input("Would you like hit or stand(enter 'h' or 's'):")

        if x[0].lower()=='h':
            Hit(deck,hand)

        elif x[0].lower()=='s':
            playing = False

        else:
            print("Please try again.")
            continue
        break

while True:
    print("Welcome to Blackjack! Get as close to 21 as possible without going over\n The dealer hits until it reaches 17.Aces count as 1 or 11")

    deck = Deck()
    deck.shuffle()

手动调用deal方法成功地创建了card类的实例

player_hand = Hand()
player_hand.add_card(deck.deal())
player_hand.add_card(deck.deal())

dealer_hand = Hand()
dealer_hand.add_card(deck.deal())
dealer_hand.add_card(deck.deal())

player_chips = Chips()

Take_bet(player_chips)

show_some(player_hand,dealer_hand)

while playing:
    '''
    card instance creates a bound method
    '''
    Hit_or_stand(deck,player_hand)

    show_some(player_hand,dealer_hand)

Tags: selfaddfordefcardplayerdeckhand
1条回答
网友
1楼 · 发布于 2024-05-14 06:20:52

问题是在Hit函数中,您试图将卡添加到手部,但传递的是方法deck.deal,而不是调用deck.deal()的结果

def Hit(deck,hand):
    hand.add_card(deck.deal())  # <- here
    hand.adjust_for_ace()

相关问题 更多 >