为何我的石头剪刀布蜥蜴Spock游戏函数有时输出'None'?
石头剪刀布蜥蜴Spock游戏输出None的问题分析与修复
问题根源
Who_Wins函数存在逻辑缺口:
当CPU选择与用户选择的组合不在Who_Wins1或Who_Wins2的键集合中时,函数没有返回语句,Python会默认返回None。比如CPU选paper、用户选lizard这类未被字典覆盖的组合,就会触发该问题。未启用自定义输入验证逻辑:
代码末尾直接用input()获取用户选择,跳过了自己编写的User_Choice()校验函数,可能导致用户输入不符合要求的内容,进一步引发后续逻辑异常。未定义函数的无效调用:
代码中调用了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
相关产品推荐
相关产品推荐

