Python记忆游戏开发 PyCharm提示局部变量d未被使用问题排查
问题产生原因
PyCharm的提示完全准确,你的代码存在作用域错误和多处逻辑bug,具体如下:
- 你定义的
main()函数全程没有被调用,函数内部属于独立的局部作用域,里面赋值的d=1、high_score=[0]是仅在函数内部生效的局部变量,且函数内除了赋值没有任何读取这两个变量的逻辑,函数本身从未执行过,内部定义的变量自然会被判定为“未被使用”。 - 你在函数外部的
print语句、分支逻辑里直接写d和high_score,和main()内部的同名变量没有任何关系,属于全局作用域下未定义的标识符,代码运行时会直接抛出NameError,并不是你以为的“已经在分支里调用了定义的变量”。 - 额外的逻辑bug会导致程序即使绕过变量报错也无法正常运行:
main_menu()的return语句写在了while循环内部,第一次输入合法值(1-3)时根本不会触发return,函数会默认返回None,后续的选项判断完全失效。difficulty()的循环逻辑错误,输入非法值时错误调用main_menu()且不接收返回值,用户第一次输入非法值后即使后续输入正确难度,也无法正确返回结果。- 选项1的分支里给
d赋值后没有任何后续逻辑,设置完难度程序就直接结束,赋值的难度值根本不会被用到。 - 变量类型混乱,
difficulty()返回整数类型,开始游戏的分支里却把返回值转成字符串做判断,很容易出现类型不匹配导致关卡无法触发的问题。
修复方法
按照作用域规则调整变量位置,修正所有逻辑bug即可:
- 把需要跨逻辑使用的状态变量(当前难度、最高分)放到全局作用域初始化,或者把所有程序逻辑包进
main()函数统一调用,不要把变量定义在永远不执行的空函数里。 - 修正
main_menu()的返回逻辑:等用户输入合法选项后再返回结果,不要把return写在循环内部。 - 修正
difficulty()的循环逻辑:输入非法值时只重输难度,不要随意跳转主菜单,拿到合法难度值直接返回。 - 统一变量类型,难度值全程用整数判断,不要随意做int/str转换。
- 加上主菜单循环,选完难度、打完关卡后回到主菜单,保证设置的难度值能被正确读取。
修复后的可运行参考代码:
# 假设level1、level2模块已正常实现 import level1 import level2 def main_menu(): user_choice = int(input(" | Enter an option : ")) # 输入非法则持续重输 while user_choice > 3 or user_choice < 1: user_choice = int(input("Incorrect option, try again:")) # 拿到合法值再返回 return user_choice def difficulty(): level = int(input("Please verify the level of difficulty [1-5]: ")) while level > 5 or level < 1: level = int(input("Please enter a valid number [1-5]: ")) return level if __name__ == "__main__": # 全局状态初始化 high_score = [0] current_d = 1 # 主菜单循环 while True: print(" ========== MEMO GAME ========== \n | | " "\n | 1. Choose level of difficulty | \n | 2. Start Game |" "\n | 3. Exit the Game | \n | " f"\n | Current Difficulty: {current_d} \n | Highest score reached: {max(high_score)}") use = str(main_menu()) if use == "1": # 更新当前难度 current_d = difficulty() elif use == "2": if current_d == 1: p1 = level1.first_level() high_score.append(p1) elif current_d == 2: p2 = level2.second_level() high_score.append(p2) # 难度3-5的逻辑可自行补充 elif use == "3": print("Exit game.") break
内容的提问来源于stack exchange,提问作者Liam Conroy
相关产品推荐
相关产品推荐

