Python石头剪刀布游戏误返回None而非False故障排查
Python石头剪刀布游戏平局逻辑误触发故障修复
故障表现
开发石头剪刀布小游戏时出现固定逻辑错误:所有玩家落败的对局,程序都不会输出失败提示,反而固定输出平局提示The game is a tie!。
问题定位
经排查,问题出在自定义胜负判断函数gameres():所有应该返回False(对应玩家失败)的场景,函数实际返回值都是None,导致后续结果判断分支直接匹配平局逻辑。
故障复现代码
import random def gameres(comp, you): if comp == you: return None # when comp = r elif comp == 'r': if you == 'p': return True elif comp == 'r': if you == 's': return False # when comp = p elif comp == 'p': if you == 's': return True elif comp == 'p': if you == 'r': return False # when comp = s elif comp == 's': if you == 'r': return True elif comp == 's': if you == 'p': return False print("Comp turn: Rock(r), Paper(p) and Scissor(s)") randno = random.randint(1, 3) if randno == 1: comp = 'r' elif randno == 2: comp = 'p' elif randno == 3: comp = 's' you = input("Your turn: Rock(r), Paper(p) and Scissor(s)") a = gameres(comp, you) print(f"Computer chose {comp}") print(f"You chose {you}") if a == None: print("The game is a tie!") elif a == True: print("You Win!") elif a == False: print("You Lose!")
根因分析
gameres()函数的分支写法不符合Python条件判断的执行逻辑:同层级的if/elif是互斥匹配关系,只要前面的分支条件命中,后续同层级的所有elif分支都会被直接跳过,不会执行。
原代码将电脑同一出拳下的胜、负判断拆成了两个判断条件完全相同的elif分支:
- 以电脑出
r(石头)为例,第一个elif comp == 'r'会优先命中,进入分支后仅判断玩家出p(布,玩家胜)的场景,没有处理玩家出s(剪刀,玩家负)的逻辑 - 分支内没有匹配到对应条件时,没有任何返回语句,函数会直接结束并默认返回
None - 后续写的第二个
elif comp == 'r'分支(包含玩家出s返回False的逻辑)因为前面同条件分支已经命中,永远不会被执行
电脑出p、s时的失败场景逻辑错误和上述原理完全一致,这就是所有落败场景都返回None触发平局提示的核心原因。
修复方法
将电脑同一出拳下的所有胜负判断合并到同一个elif分支内,不要拆分同条件的重复elif,修复后的gameres()函数如下:
def gameres(comp, you): if comp == you: return None # 电脑出石头的场景 elif comp == 'r': if you == 'p': return True if you == 's': return False # 电脑出布的场景 elif comp == 'p': if you == 's': return True if you == 'r': return False # 电脑出剪刀的场景 elif comp == 's': if you == 'r': return True if you == 'p': return False
替换原函数后,所有对局场景的返回值都符合预期,结果提示可以正常触发。
小优化提示:Python中判断值是否为None推荐使用is运算符,可将if a == None:修改为if a is None:,避免自定义类重载相等判断方法时出现异常,不属于本次故障的必须修改项。
内容的提问来源于stack exchange,提问作者Manjesh Kumar Sharma
相关产品推荐
相关产品推荐

