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

Python Blackjack游戏重启逻辑问题求助:获胜后未询问直接重启

解决Python Blackjack游戏的重启问题

问题列表

  • 输入n选择停牌并获胜后,程序不会询问用户是否再次游玩
  • 只要获胜,程序直接重启游戏,完全不征求用户意愿

问题根源

  1. 递归调用跳过重启询问:restart_game()函数内部的winner()直接调用restart_game()递归重启,绕开了外层控制游戏循环的while语句,导致用户失去选择是否继续的机会。
  2. 庄家逻辑不符合规则:原代码中玩家停牌后庄家只抽一张牌,实际Blackjack规则要求庄家必须抽到总分≥17。
  3. 胜负判断不完整:缺少玩家和庄家分数都小于21时的大小比较逻辑。

修复方案

  1. 移除所有winner()内的restart_game()调用,让游戏结束后自然回到外层while循环,由用户选择是否重启。
  2. 实现符合规则的庄家抽牌逻辑。
  3. 补全所有胜负判断场景。
  4. 调整函数结构,避免不必要的嵌套函数。

修改后的完整代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 07:25:17