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

为何我的石头剪刀布蜥蜴Spock游戏函数有时输出'None'?

石头剪刀布蜥蜴Spock游戏输出None的问题分析与修复

问题根源

  1. Who_Wins函数存在逻辑缺口:
    当CPU选择与用户选择的组合不在Who_Wins1或Who_Wins2的键集合中时,函数没有返回语句,Python会默认返回None。比如CPU选paper、用户选lizard这类未被字典覆盖的组合,就会触发该问题。

  2. 未启用自定义输入验证逻辑:
    代码末尾直接用input()获取用户选择,跳过了自己编写的User_Choice()校验函数,可能导致用户输入不符合要求的内容,进一步引发后续逻辑异常。

  3. 未定义函数的无效调用:
    代码中调用了Who_Against()但未实现该函数,运行时会直接抛出NameError,阻断程序执行。

修复方案

1. 补全所有胜负组合

石头剪刀布蜥蜴Spock共有20种非平局的胜负组合(5种选项,每个选项赢2种、输2种),原代码每个字典仅覆盖10种,遗漏了另一半。通过重构胜负逻辑,用统一的关系集合判断胜负,同时动态区分对手类型,减少重复代码。

2. 启用输入验证函数

替换直接的input()调用,使用User_Choice()确保用户输入的有效性。

3. 移除无效函数调用

删除未定义的Who_Against()调用,消除运行时错误。

修正后的完整代码

import random

# 随机选择对手类型:1=Zentharian,2=AI
opponent_type = random.randint(1, 2) 

def cpu_choice():
    return random.choice(["rock", "paper", "scissors", "lizard", "spock"])

def user_choice():
    choice = input("What do you choose, rock, paper, scissors, lizard or spock?").lower()
    while choice not in ["rock","paper","scissors","lizard","spock"]:
        choice = input("That is not an option, please try again").lower()
    return choice

def who_wins(cpu_pick, user_pick):
    opponent_name = "Zentharian" if opponent_type == 1 else "AI"
    
    if cpu_pick == user_pick:
        return "It was a draw, tension among the onlookers rises"
    
    # 定义所有胜负关系:(胜者, 败者)
    win_relations = {
        ("scissors", "paper"), ("paper", "rock"), ("rock", "lizard"),
        ("lizard", "spock"), ("spock", "scissors"), ("scissors", "lizard"),
        ("lizard", "paper"), ("paper", "spock"), ("spock", "rock"), ("rock", "scissors")
    }
    
    if (cpu_pick, user_pick) in win_relations:
        # CPU获胜的情况
        win_map = {
            ("scissors","paper"): f"You lose, The {opponent_name} chose scissors which cut up your paper",
            ("paper","rock"): f"You lose, The {opponent_name} chose paper which covered your rock",
            ("rock","lizard"): f"You lose, The {opponent_name} chose rock which crushed your lizard",
            ("lizard","spock"): f"You lose, The {opponent_name} chose lizard which poisoned spock",
            ("spock","scissors"): f"You lose, The {opponent_name} chose spock who smashed your scissors"
        }
        return win_map.get((cpu_pick, user_pick), f"You lose, The {opponent_name} won")
    elif (user_pick, cpu_pick) in win_relations:
        # 用户获胜的情况
        win_map = {
            ("scissors","lizard"): f"You Win, your scissors decapitated the {opponent_name}'s lizard",
            ("lizard","paper"): f"You win, your lizard ate the {opponent_name}'s paper",
            ("paper","spock"): f"You win, your paper disproved the {opponent_name}'s spock",
            ("spock","rock"): f"You win, your spock vaporized the {opponent_name}'s rock",
            ("rock","scissors"): f"You win, your rock crushed the {opponent_name}'s scissors"
        }
        return win_map.get((user_pick, cpu_pick), f"You win against the {opponent_name}")
    else:
        return "Unexpected error occurred"

# 主逻辑
cpu_pick = cpu_choice()
user_pick = user_choice()
result = who_wins(cpu_pick, user_pick)
print(result)

修复说明

  • 通过统一的胜负关系集合判断胜负,彻底覆盖所有非平局组合,避免返回None。
  • 用opponent_name变量动态生成对手名称,减少重复代码量。
  • 调用user_choice()确保输入合法性,避免无效输入干扰逻辑。
  • 移除未定义的函数调用,消除运行时错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 20:52:13