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

