Python Blackjack游戏重启逻辑问题求助:获胜后未询问直接重启
解决Python Blackjack游戏的重启问题
问题列表
- 输入
n选择停牌并获胜后,程序不会询问用户是否再次游玩 - 只要获胜,程序直接重启游戏,完全不征求用户意愿
问题根源
- 递归调用跳过重启询问:
restart_game()函数内部的winner()直接调用restart_game()递归重启,绕开了外层控制游戏循环的while语句,导致用户失去选择是否继续的机会。 - 庄家逻辑不符合规则:原代码中玩家停牌后庄家只抽一张牌,实际Blackjack规则要求庄家必须抽到总分≥17。
- 胜负判断不完整:缺少玩家和庄家分数都小于21时的大小比较逻辑。
修复方案
- 移除所有
winner()内的restart_game()调用,让游戏结束后自然回到外层while循环,由用户选择是否重启。 - 实现符合规则的庄家抽牌逻辑。
- 补全所有胜负判断场景。
- 调整函数结构,避免不必要的嵌套函数。
修改后的完整代码
import random def deal_card(): """发牌函数,返回一张随机卡牌""" cards = [11, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10] return random.choice(cards) def calculate_score(cards): """计算手牌总分,处理A牌的11/1转换""" score = sum(cards) # 处理Blackjack(两张牌总和21) if score == 21 and len(cards) == 2: return 0 # A牌从11转1,避免爆牌 if score > 21 and 11 in cards: cards.remove(11) cards.append(1) score = sum(cards) return score def compare(user_score, dealer_score): """比较分数,返回胜负结果""" if user_score == dealer_score: return "平局!🤷♂️" elif dealer_score == 0: return "庄家Blackjack,你输了!😤" elif user_score == 0: return "Blackjack!你赢了!🤑" elif user_score > 21: return "你爆牌了,输了!😤" elif dealer_score > 21: return "庄家爆牌了,你赢了!🤑" elif user_score > dealer_score: return "你赢了!🤑" else: return "你输了!😤" def play_game(): # 初始化手牌 user_cards = [] dealer_cards = [] is_game_over = False # 初始发两张牌 for _ in range(2): user_cards.append(deal_card()) dealer_cards.append(deal_card()) while not is_game_over: user_score = calculate_score(user_cards) dealer_score = calculate_score(dealer_cards) print(f" 你的手牌: {user_cards}, 当前分数: {user_score}") print(f" 庄家的第一张牌: {dealer_cards[0]}") # 判断游戏是否结束(Blackjack或爆牌) if user_score == 0 or dealer_score == 0 or user_score > 21: is_game_over = True else: # 询问玩家是否继续抽牌 user_choice = input("输入'y'抽牌,输入'n'停牌: ").lower() if user_choice == "y": user_cards.append(deal_card()) else: is_game_over = True # 庄家抽牌逻辑:必须抽到≥17分 while dealer_score != 0 and dealer_score < 17: dealer_cards.append(deal_card()) dealer_score = calculate_score(dealer_cards) # 显示最终结果 print(f" 你的最终手牌: {user_cards}, 最终分数: {user_score}") print(f" 庄家的最终手牌: {dealer_cards}, 最终分数: {dealer_score}") print(compare(user_score, dealer_score)) # 外层循环控制游戏重启 while input("想玩Blackjack吗?输入'y'或'n': ").lower() == "y": # 可以在这里添加清屏代码,比如import os; os.system('cls' if os.name == 'nt' else 'clear') print("\n开始新游戏!") play_game() print("游戏结束!")
关键改动说明
- 拆分了功能函数(发牌、计算分数、比较结果),代码更清晰易维护
- 实现了标准的庄家抽牌逻辑(≥17分停止)
- 移除了递归调用,游戏结束后回到外层循环,由用户选择是否继续
- 补全了所有胜负判断场景,包括Blackjack的特殊处理
- 优化了A牌的转换逻辑
内容的提问来源于stack exchange,提问作者Artiom Buga
相关产品推荐
相关产品推荐

