Python运行Hangman游戏报NameError,函数内定义的变量提示未定义怎么办
问题根因
你遇到的变量未定义报错是缩进错误+函数未调用两个问题共同导致的:
- 你把
while len(word_letters) > 0:以及后续的所有游戏循环逻辑都写在了hangman函数外部,函数内部定义的变量属于局部作用域,函数外无法直接访问,所以直接触发未定义报错。 - 你定义完
hangman函数后完全没有调用它的代码,就算缩进修正正确,游戏逻辑也不会运行。
你问是否需要将变量设置为全局变量,答案是不需要。函数内部的局部变量只要在函数作用域内访问就完全正常,设置全局变量反而会增加代码维护难度,容易出现变量被意外修改的问题。
其他需要修正的代码错误
get_valid_word函数的循环条件写错:你写的是while '-' in words or ' ' in word,第一个判断误检查词汇列表本身有没有横杠,应该改成'-' in word才是判断选中的单词里有没有无效字符。- 你在while循环里重复给
word、word_letters、alphabet、used_letters赋值,每次循环都会重置所有游戏状态,游戏根本无法正常推进,这些初始化逻辑应该放在循环外面、hangman函数的开头。 - 代码末尾多余的
user_input = input('Type something:')是无用测试代码,可以直接删除。
修正后的完整代码
import random from words import words import string def get_valid_word(words): word = random.choice(words) # 从词汇列表随机选一个单词 while '-' in word or ' ' in word: # 修正:判断选中的单词是否有横杠或空格 word = random.choice(words) return word.upper() # 统一转大写避免大小写判断冲突 def hangman(): word = get_valid_word(words) word_letters = set(word) alphabet = set(string.ascii_uppercase) used_letters = set() # 记录用户已经猜过的字母 # 游戏主循环 所有逻辑缩进在hangman函数内部 while len(word_letters) > 0: # 打印已使用的字母 print('你已经猜过的字母: ', ' '.join(used_letters)) # 打印当前单词的显示状态(猜对的显示字母,没猜对的显示-) word_list = [letter if letter in used_letters else '-' for letter in word] print('当前单词: ', ' '.join(word_list)) user_letter = input('猜一个字母: ').upper() if user_letter in alphabet - used_letters: used_letters.add(user_letter) if user_letter in word_letters: word_letters.remove(user_letter) elif user_letter in used_letters: print('你已经猜过这个字母了,请重新输入。') else: print('你输入的不是有效字符,请重新输入。') # 循环结束说明所有字母都猜对了 print(f'恭喜你猜对了!单词是:{word}') # 调用函数启动游戏 hangman()
内容的提问来源于stack exchange,提问作者user10440380
相关产品推荐
相关产品推荐

