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

Python满足if判断条件仍跳过分支直接执行else语句问题

Python实现21点小游戏的两个运行异常

问题现象

  • 输入hit/stand/forfeit三个合法选项时,代码无法匹配对应if/elif分支,直接进入else分支打印无效输入提示
  • 已编写player != "forfeit"的判断逻辑,但循环无法按预期终止,会持续运行

问题相关代码

基础函数定义

import random 
player=""
com=""
start = input("Press enter to start")
def bj():   
    com = random.choice([2,3,4,5,6,7,8,9])
    print(com)
    player = input("Hit/Stand/Forfeit: ").lower()
    print(player)

def stand():
    if player_value > com and player_value != 22:
        print("You win")

异常循环逻辑

已经编写了player != "forfeit"的判断逻辑,但即便player的值不是"forfeit",对应循环依然会持续运行

while player != 22 or player != "forfeit":
    bj()

异常分支判断逻辑

if player == "hit":
    player_value = random.choice([2,3,4,5,6,7,8,9])
elif player == "stand" or player == 22:
    stand()
    break   
elif player == "forfeit":
    break
else:
    print("Invalid. Try again")   
    print("----------------------")

问题原因

  1. 变量作用域错误:bj()函数内给player、com赋值时,没有声明为全局变量,操作的是函数内部的局部变量,全局作用域下的player始终是初始的空字符串,分支判断读取全局player时自然匹配不到任何合法输入值,直接进入else分支。同理player_value、com也存在全局/局部变量不互通的问题。
  2. 循环条件逻辑错误:当前循环条件player != 22 or player != "forfeit"是永真式:无论player取什么值,两个判断条件至少有一个成立——比如player等于"forfeit"时,它不等于22,or连接的条件整体为真;player等于22时,它不等于"forfeit",条件同样为真,循环永远不会终止。
  3. 额外隐藏问题:player_value没有初始化赋值,调用stand()函数时会直接触发变量不存在的报错。

修复方案

  • 在需要修改全局变量的函数内添加global声明,或者更推荐用函数返回值传递计算结果,避免滥用全局变量
  • 把循环条件的or替换为and,逻辑改为:当玩家点数未到22点、且玩家没有选择投降时,循环继续运行
  • 补全player_value的初始化、点数累加逻辑。

修复后的可运行参考代码:

import random 
player = ""
com = 0
player_value = 0
start = input("Press enter to start")

def bj():   
    global com, player
    com = random.choice([2,3,4,5,6,7,8,9])
    print(f"庄家明牌点数:{com}")
    player = input("请输入选择 Hit/Stand/Forfeit: ").lower()
    return player

def stand():
    if player_value > com and player_value <= 21:
        print("You win")
    else:
        print("You lose")

# 修正循环条件,or改为and
while player_value != 22 and player != "forfeit":
    player = bj()
    if player == "hit":
        player_value += random.choice([2,3,4,5,6,7,8,9])
        print(f"当前你的点数:{player_value}")
    elif player == "stand" or player_value >= 22:
        stand()
        break   
    elif player == "forfeit":
        print("你选择投降,游戏结束")
        break
    else:
        print("Invalid. Try again")   
        print("----------------------")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 08:18:27