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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 23:18:30