如何让子程序返回主程序?剪刀石头布游戏菜单返回实现问题
问题解决:剪刀石头布游戏返回主菜单功能实现
错误原因
你遇到的NameError源于两个核心问题:
- 单人游戏文件未正确导入
runner模块就调用runner()函数; - 直接在单人游戏文件中导入
runner会触发循环导入——runner已经导入了RPS_singleplayer,RPS_singleplayer再反向导入runner会导致模块加载混乱,函数无法被正常识别。
另外主程序的循环逻辑存在缺陷:用户输入放在while循环外部,从单人游戏返回后不会重新显示菜单,会重复执行之前的选项。
解决方案(推荐方案)
让主程序统一控制流程,子模块执行完成后自然返回主程序循环,无需主动调用runner():
1. 修改主程序(runner文件)代码
把用户输入移到while循环内部,确保每次从子模块返回后都会重新显示主菜单,同时优化输入合法性判断:
#RPS Runner from RPS_singleplayer import singleplayer from RPS_multiplayer import multiplayer def runner(): exitCalled = False while not exitCalled: # 每次循环都重新显示菜单并获取输入 print("\nWelcome to Rock Paper Scissors") print("Main Menu \n1. Singleplayer\n2. Multiplayer\n3. Exit") try: grabUserInput = int(input("Enter an option: ")) except ValueError: print("Invalid Input. Please enter a number.") continue if grabUserInput == 1: print("Taking you to singleplayer mode... please wait") singleplayer() elif grabUserInput == 2: print("Taking you to multiplayer mode... please wait") multiplayer() elif grabUserInput == 3: exitCalled = True print("Thanks for playing!") else: print("Invalid Input. Try Again") # 只有直接运行该文件时才启动runner,避免导入时自动执行 if __name__ == "__main__": runner()
2. 修改单人游戏文件代码片段
当用户选择返回主菜单时,直接让当前函数返回,回到主程序的runner循环:
choice = input("Would you like to play again or return to menu? Y/N/M?: ").lower() if choice in ["y", "yes"]: rpscpu() elif choice in ["n", "no"]: print("Thanks for playing!") elif choice in ["m", "menu"]: print("Returning to main menu...") return # 直接返回主程序,触发runner循环重新显示菜单
备选方案(延迟导入)
如果一定要在子模块中主动调用主菜单,可使用延迟导入(仅在需要时导入runner模块),避免循环导入问题:
choice = input("Would you like to play again or return to menu? Y/N/M?: ").lower() if choice in ["y", "yes"]: rpscpu() elif choice in ["n", "no"]: print("Thanks for playing!") quit() elif choice in ["m", "menu"]: print("Returning to main menu...") import runner runner.runner()
注意:此方案不如推荐方案清晰,主程序统一控制流程会更易维护。
内容的提问来源于stack exchange,提问作者user26366849
相关产品推荐
相关产品推荐

