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

Python开发Blackjack程序时while循环输入's'无法正常退出问题

21点程序停牌后循环异常修复

编辑说明:我已精简本条目内容,删除冗长解释和冗余修改记录,目前已将问题定位到唯一核心点。

问题背景

  • 开发场景:编写Blackjack(21点)小游戏程序
  • 异常表现:用户输入s选择stand(停牌)时,程序仍会回到输入环节持续循环,即使手动赋值hit_me = False也无法终止内层循环
  • 运行环境:Replit平台
  • 前置说明:当前仅解决循环逻辑异常问题,暂不调整不符合21点正式规则的业务逻辑,后续再做优化

问题根因

内层要牌循环的判断条件逻辑运算符使用错误:
原内层循环条件为 while hit_me == True or player_total < 21:
逻辑或(or)的判定规则是任意一个条件为真,整个表达式就为真,循环就会继续执行。当用户输入s选择停牌时,虽然hit_me被赋值为False,但只要玩家手牌总点数还小于21,第二个条件player_total < 21就始终成立,循环永远不会终止。

修复方法

将内层循环的逻辑运算符从or替换为and即可:只有当「玩家选择继续要牌」同时「玩家手牌点数小于21」两个条件都满足时,才继续执行要牌流程。任意一个条件不满足(玩家选停牌/点数达到或超过21),就会退出内层要牌循环。
另外顺带优化了不规范写法:将draw_card函数定义移到游戏循环外部,删除了无意义的空抽卡调用,避免每局游戏重复定义函数、做无效运算。

修复后可运行代码

import random

def draw_card(deck):
    card = random.choice(deck)
    return int(card)

game_over = False
while not game_over:
    deck = [2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10, 11]
    
    ### 首次发牌
    dealer_card = draw_card(deck)
    dealer_total = dealer_card
    player_card = draw_card(deck)
    player_card2 = draw_card(deck)
    player_total = player_card + player_card2
    print(f"The dealer gets: {dealer_card} \n")
    print(f"Your cards are: {player_card} and {player_card2} \nYour total is: {player_total} \n")
    
    if player_total == 21:
        print("Blackjack!")
        game_over = True
    elif player_total > 21:
        print("Bust!")
        game_over = True
    elif player_total < 21:
        hit_me = True
        # 核心修复:将or替换为and,修正循环判定逻辑
        while hit_me and player_total < 21:
            hit = input("Would you like to hit or stand? Press 'h' to hit or 's' to stand: ")
            if hit == 's':
                hit_me = False
                print("Stand test")
            elif hit == 'h':
                new_card = draw_card(deck)
                player_total += new_card
                print(f"Your new total is: {player_total}")
                if player_total > 21:
                    hit_me = False
                    game_over = True
                    print("Bust!")
                elif player_total == 21:
                    hit_me = False
                    game_over = True
                    print("Blackjack!")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 19:01:08