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
相关产品推荐
相关产品推荐

