如何通过用户输入'y'重启游戏?已创建游戏后自定义函数
实现游戏重启功能的修复方案
看起来你已经搭好了重启功能的框架,但代码里有几个小细节问题导致功能没法正常工作,我来帮你一步步调整好:
现有代码的核心问题
- 全局变量未正确声明:在
done()函数里修改i时,Python会默认把它当成局部变量,没法修改全局的i值,导致重启信号传不到外层循环。 - 退出方式错误:
SystemExit是一个异常类,直接写不会触发退出,得用sys.exit(),还要记得导入sys模块。 - 输入兼容性不足:只判断小写的'y'/'n',用户输入大写的话就会失效,最好统一转成小写处理。
- 循环逻辑衔接问题:当前的
while i==1循环在一次游戏结束后会因为i=0直接退出,得确保重启时能让循环重新跑起来。
修改后的完整代码
import sys i = 1 def done(): global i # 声明要操作全局变量i quit_value = input("Play Again?(y/n):").strip().lower() # 去除空格并统一转小写 if quit_value == 'n': sys.exit() # 正确终止程序 elif quit_value == 'y': i = 1 # 将i设为1,触发循环重启 def rps(play1, play2, play1name, play2name): # 把玩家名字作为参数传入,避免依赖全局变量 # 胜负判定逻辑 if play1 == play2: print("It's a tie!") elif play1 == 'r': print(f"{play1name} Wins!" if play2 == 's' else f"{play2name} Wins!") elif play1 == 'p': print(f"{play1name} Wins!" if play2 == 'r' else f"{play2name} Wins!") elif play1 == 's': print(f"{play1name} Wins!" if play2 == 'p' else f"{play2name} Wins!") done() # 胜负判定后调用重启选择函数 # 游戏主循环 while True: # 改用无限循环,逻辑更直观 if i == 1: play1name = input("Player 1 Name?:").strip() play2name = input("Player 2 Name?:").strip() play1 = input(f"{play1name} Choose Rock(r),Paper(p), Scissors(s):").strip().lower() play2 = input(f"{play2name} Choose Rock(r),Paper(p), Scissors(s):").strip().lower() i = 0 # 标记当前游戏结束 rps(play1, play2, play1name, play2name)
关键修改说明
- 全局变量声明:在
done()开头加global i,确保函数能修改全局的i,这样选'y'时才能正确触发循环重启。 - 输入体验优化:用
strip()去掉输入前后的空格,lower()统一转小写,用户输入'Y'或者带空格的'y'都能识别。 - 函数模块化:把玩家名字作为参数传入
rps(),避免依赖全局变量,代码结构更清晰。 - 循环结构调整:改用
while True无限循环,配合i的状态控制游戏启动,逻辑更易懂。 - 正确退出程序:用
sys.exit()替代无效的SystemExit写法,确保选'n'时能正常退出。
这样修改后,游戏结束时输入'y'就会回到玩家输入名字的环节重新开始,输入'n'则直接终止程序。
内容的提问来源于stack exchange,提问作者Sai Madichetty
相关产品推荐
相关产品推荐

