非常具体的错误,只在python,二十一点游戏中偶尔发生一次

时间:2013-12-10 03:26:56

标签: python

我的代码中有一个奇怪的错误,我可以在大约30场比赛中玩我的游戏,但有时它输出错误而我不知道为什么。游戏是一个BlackJack游戏,我可以将牌拿到玩家,计算机并评估每个牌的价值,但有时候,在玩家完成转牌后,它会输出一个错误。这是错误的一个例子(它有点大)。

  File "C:\Users\Carl\Documents\École\Informatique\Tp3\blackjackfinale.py", line 167, in new_game()
return table()
File "C:\Users\Carl\Documents\École\Informatique\Tp3\blackjackfinale.py", line 186, in table
print "Vous avez ces cartes %s avec une valeur total de %d." % (player1_hand,   total_player)
TypeError: %d format: a number is required, not NoneType

很抱歉,如果是法语,但重要的是英文。 这是我的代码示例:

def value(hand): #evaluates the hand of the player/computer
total_value = 0
aces = 0
for card in hand:
    rank = card[0]
    if rank in ('T','V','D','R'):
        total_value += 10
    elif rank in 'A':
        total_value += 11
        aces += 1
    else:
        total_value += int(rank)
if total_value > 21 and aces > 0: #changes the value of the ace if it busts or not
    while aces > 0 and total_value > 21:
        total_value -= 10
        aces -= 1
else:
    return total_value

def table(): 
global deck, mise1, mise2, montant1, montant2
player1_hand = []
player2_hand = []
computer_hand = []
if x == 1:
    player1_hand.append(deal_cards())
    player1_hand.append(deal_cards())
    pbust = False
    cbust = False
    while True:
        total_player = value(player1_hand)
        print "Vous avez ces cartes %s avec une valeur total de %d." % (player1_hand, total_player)
        if total_player > 21:
            print "Vous avez éclaté! Vous avez plus haut de 21."
            pbust = True
            break
        elif total_player == 21:
            print "\a BlackJack!"
            break #Everything up to this point works well
        else:
            cr = raw_input("Nouvelle [C]arte ou [R]este: ").lower()
            if 'c' in cr:
                player1_hand.append(deal_cards())
            elif 'r' in cr:
                break
            else:
                break
    while True:
        computer_hand.append(deal_cards())
        computer_hand.append(deal_cards())
        while True:
            total_computer = value(computer_hand)
            if total_computer < 18:
                computer_hand.append(deal_cards())
            else:
                break
        print "Le croupier à %s pour un total de %d." % (computer_hand, total_computer) 

#here's the error I get, it tells me that the value of total_computer is NoneType but I  don't understand why?

希望我能为你理解我的问题并回答所有问题,如果没有,请告诉我,我会尽力解释。对不起,如果我不清楚,因为英语不是我的主要语言,你可以在代码中看到。

哦,显示deal_cards()函数和deck函数

可能很有用
def create_deck(): #this creates the deck of cards
suit_string = 'cdtp'
rank_string = '23456789TVDRA'
deck = []
for suit in range(4):
    for rank in range(13):
        cards = rank_string[rank] + suit_string[suit]
        deck.append(cards)
        random.shuffle(deck)
return deck

def deal_cards(): #this deals the cards
return deck.pop(0)

2 个答案:

答案 0 :(得分:3)

value函数中,如果满足此条件

if total_value > 21 and aces > 0:

你没有明确地返回任何内容,所以python隐式返回None并尝试在

中打印一个数字
print "Vous avez ces cartes %s avec une valeur total de %d." % (player1_hand, total_player)

这是不可能的。这就是它失败的原因。

答案 1 :(得分:1)

请注意:

def value(hand):
    ...
    if total_value > 21 and aces > 0: #changes the value of the ace if it busts or not
        while aces > 0 and total_value > 21:
            total_value -= 10
            aces -= 1 
    else: 
        return total_value

如果您使用ace进行破坏,则值()不会返回total_value。在python中,如果在没有返回任何内容的情况下到达函数的末尾,它将返回None,因此您将获得None。