You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python百家乐程序无法保存总余额问题排查与修复求助

问题原因与修复方案

核心问题:余额未被正确更新

你的代码里,baccarat函数接收的total是值传递——函数内部修改的只是局部变量,不会影响全局的bal变量。而且每次重新调用baccarat时,你传入的都是初始的bal值(500),所以每次重玩都会重置余额。

另外代码里还有几处逻辑错误,比如if opt == "P" or "B"这种写法是错误的,Python会把"B"当成布尔值True,导致这个条件永远成立,需要修正为if opt == "P" or opt == "B"。


具体修复步骤

1. 修改baccarat函数,让它返回更新后的余额

在baccarat函数的最后,添加返回语句:

return total

2. 调用baccarat时,将返回值赋值给bal

把原来的调用代码:

baccarat(betAm, bal, betOpt)

改成:

bal = baccarat(betAm, bal, betOpt)

这样每次游戏结束后,bal会被更新为最新的余额,重玩时就会使用这个更新后的值。

3. 修复条件判断的错误

把所有类似if opt == "P" or "B"的语句,修正为:

if opt == "P" or opt == "B"

同样,elif opt == "B" or "T"要改成elif opt == "B" or opt == "T",elif opt == "P" or "T"改成elif opt == "P" or opt == "T"。

4. 修复庄家补牌的逻辑错误

在pSco <=5的分支里,当处理庄家补牌的bSco ==6情况时,你使用了未定义的nCard变量(这个变量是玩家补牌时的变量),需要重新从牌堆取牌:

elif bSco == 6:
    nCard = deck.pop()
    while True:
        if val(nCard) == 6 or val(nCard) == 7:
            break
        nCard = deck.pop()
    bCard.append(nCard)
    bSco = sum(val(card) for card in bCard)
    bSco = bSco % 10

修改后的完整代码

import time
import random

def val(card):
    if card[0] in ['10', 'Jack', 'Queen', 'King']: 
        return 0
    elif card[0] == 'Ace': 
        return 1
    else: 
        return int(card[0]) 

def baccarat(bet, total, opt):
    cad = ['Hearts', 'Diamonds', 'Clubs', 'Spades'] 
    lis = ['Ace', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'Jack', 'Queen', 'King'] 
    deck = [(card, category) for category in cad for card in lis] 
    random.shuffle(deck)
    pCard = [deck.pop(), deck.pop()] 
    bCard = [deck.pop(), deck.pop()]
    pSco = sum(val(card) for card in pCard) 
    bSco = sum(val(card) for card in bCard) 
    print(f"Cards player has: {pCard}")
    pSco = pSco % 10
    print(f"Score of player: {pSco} \n")
    print(f"Cards dealer has: {bCard}")
    bSco = bSco % 10
    print(f"Score of dealer: {bSco} \n")
    if pSco <= 5:
        play = input("Draw another card(P to request another card): ")
        nCard = deck.pop() 
        pCard.append(nCard)
        pSco = sum(val(card) for card in pCard)
        print(f"Cards player has: {pCard}")
        pSco = pSco % 10
        print(f"Score of player: {pSco} \n")
        if bSco <= 2:
            nCard = deck.pop() 
            bCard.append(nCard)
            bSco = sum(val(card) for card in bCard)
            bSco = bSco % 10
        elif bSco == 3:
            nCard = deck.pop()
            while True:
                if val(nCard) < 8:
                    break
                nCard = deck.pop()
            bCard.append(nCard)
            bSco = sum(val(card) for card in bCard)
            bSco = bSco % 10
        elif bSco == 4:
            nCard = deck.pop()
            while True:
                if val(nCard) >= 2 and val(nCard) <= 7:
                    break
                nCard = deck.pop()
            bCard.append(nCard)
            bSco = sum(val(card) for card in bCard)
            bSco = bSco % 10
        elif bSco == 5:
            nCard = deck.pop()
            while True:
                if val(nCard) >= 4 and val(nCard) <= 7:
                    break
                nCard = deck.pop()
            bCard.append(nCard)
            bSco = sum(val(card) for card in bCard)
            bSco = bSco % 10
        elif bSco == 6:
            nCard = deck.pop()
            while True:
                if val(nCard) == 6 or val(nCard) == 7:
                    break
                nCard = deck.pop()
            bCard.append(nCard)
            bSco = sum(val(card) for card in bCard)
            bSco = bSco % 10
    elif bSco <= 5:
        nCard = deck.pop()
        bCard.append(nCard)
        bSco = sum(val(card) for card in bCard)
        bSco = bSco % 10
    if pSco == bSco:
        if opt == "P" or opt == "B":
            total = total - bet
            print(f"Cards dealer has: {bCard}") 
            print(f"Score of dealer: {bSco} \n") 
            print(f"Cards player has: {pCard}") 
            print(f"Score of player: {pSco} \n")
            print("Its a tie. \n")
            print(f"You lost {bet} dollars.")
        elif opt == "T":
            total = total + 8*bet
            print(f"Cards dealer has: {bCard}") 
            print(f"Score of dealer: {bSco} \n") 
            print(f"Cards player has: {pCard}") 
            print(f"Score of player: {pSco} \n")
            print("Its a tie. \n")
            print(f"You won {bet*8} dollars.")
        print(f"Your bank balance is: {total} \n")
    elif pSco > bSco:
        if opt == "P":
            total = total + 2*bet
            print(f"Cards dealer has: {bCard}") 
            print(f"Score of dealer: {bSco} \n") 
            print(f"Cards player has: {pCard}") 
            print(f"Score of player: {pSco} \n")
            print("Player Wins \n")
            print(f"You won {bet*2} dollars.")
        elif opt == "B" or opt == "T":
            total = total - bet
            print(f"Cards dealer has: {bCard}") 
            print(f"Score of dealer: {bSco} \n") 
            print(f"Cards player has: {pCard}") 
            print(f"Score of player: {pSco} \n")
            print("Player Wins \n")
            print(f"You lost {bet} dollars.")
        print(f"Your bank balance is: {total} \n")
    else:
        if opt == "B":
            total = total + int(1.9 * bet)
            print(f"Cards dealer has: {bCard}") 
            print(f"Score of dealer: {bSco} \n") 
            print(f"Cards player has: {pCard}") 
            print(f"Score of player: {pSco} \n")
            print("Banker Wins \n")
            print(f"You won {bet*1.9} dollars.")
        elif opt == "P" or opt == "T":
            total = total - bet
            print(f"Cards dealer has: {bCard}") 
            print(f"Score of dealer: {bSco} \n") 
            print(f"Cards player has: {pCard}") 
            print(f"Score of player: {pSco} \n")
            print("Banker Wins \n")
            print(f"You lost {bet} dollars.")
        print(f"Your bank balance is: {total} \n")
    return total

def play():    
    global betAm 
    betAm = int(input("How much would you like to bet?(Minimum of 5): "))
    while True:
        if betAm < 5 or betAm > bal:
            print("Invalid amount. Please try again.")
            betAm = int(input("How much would you like to bet?(Minimum of 5): "))
        else:
            break
    global betOpt
    betOpt = input("Would you like to bet on Player(P), Banker(B) or Tie(T)?: ")
    while True:
        if betOpt != "P" and betOpt != "B" and betOpt != "T":
            print("Invalid input. Please try again.")
            betOpt = input("Would you like to bet on Player(P), Banker(B) or Tie(T)?: ")
        else:
            break

bal = 500
rules = input("Would you like to know the rules of baccarat?(Y/N): ")
while rules != "Y" and rules != "N":
    print("Invalid input. Please try again.")
    rules = input("Would you like to know the rules of baccarat?(Y/N): ")
if rules == "N":
    time.sleep(1)
    print("Ok. Starting game. \n")
else:
    if rules == "Y":
        print("In the game, the player bet on whether your hand, the banker's hand, or a tie will win, with the goal of getting a hand closest to 9 in value. \n")
    time.sleep(3)
    print("Ok. Starting game. \n")
print("You start with $500.")
play()
bal = baccarat(betAm, bal, betOpt)
while bal >= 5:   
    again = input("Play again?(Y/N): ")
    while again != "Y" and again != "N":
        print("Invalid input. Please try again.")
        again = input("Play again?(Y/N): ")
    if again == "Y":
        play()
        bal = baccarat(betAm, bal, betOpt)
    else:
        print("Goodbye")
        break
else:
    print("You are broke. Game over.")

内容的提问来源于stack exchange,提问作者silver_Dots

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 09:23:12