Python测验游戏项目故障求助:无法识别答案及触发报错
Python测验游戏异常排查与修复
问题现象
- 无法区分正确与错误答案,选择正确选项也会被判定错误;
- 显示正确答案时无法展示猜测内容,触发
TypeError: 'int' object is not iterable错误。
错误信息
RESULTS --------------------- Answers: B B C D Guesses: Traceback (most recent call last): File "c:\Users\Segundinho\Documents\Programação\Python\Learning\quiz game.py", line 104, in <module> new_game() File "c:\Users\Segundinho\Documents\Programação\Python\Learning\quiz game.py", line 27, in new_game display_score(correct_guesses, guesses) File "c:\Users\Segundinho\Documents\Programação\Python\Learning\quiz game.py", line 58, in display_score for item in guesses: TypeError: 'int' object is not iterable
错误原因与修复步骤
1. 参数顺序颠倒导致类型错误
- 问题:
display_score函数定义的参数顺序是(guesses, correct_guesses),但调用时传的是display_score(correct_guesses, guesses),导致函数内guesses变量实际接收的是整数类型的correct_guesses,循环遍历时报错。 - 修复:调整调用时的参数顺序为
display_score(guesses, correct_guesses)。
2. 字符串方法未执行导致答案匹配失败
- 问题:
guess = guess.upper未加括号,实际赋值的是upper方法对象而非转换后的字符串,导致和答案字符串永远不相等;同理play_again函数里的response = response.lower也存在相同问题。 - 修复:改为
guess = guess.upper()和response = response.lower(),执行字符串大小写转换方法。
3. 答案校验传参错误+分数累加逻辑错误
- 问题:调用
check_answer时传入的是guesses列表而非当前的guess,且correct_guesses = check_answer(...)会每次覆盖分数,而非累加正确次数;同时correct_guesses: 0是类型注解,未实际初始化变量。 - 修复:
- 初始化
correct_guesses为0:correct_guesses = 0; - 调用
check_answer时传入当前猜测guess:correct_guesses += check_answer(questions.get(key), guess)。
- 初始化
4. 循环条件错误导致无法正确重启游戏
- 问题:
while play_again:使用函数对象作为条件,永远为True,无法根据用户输入判断是否重启;且play_again函数内未处理输入空格等情况,健壮性不足。 - 修复:改为
while play_again(),调用函数获取返回值;同时增加strip()处理输入空格。
完整修复代码
def new_game(): guesses = [] correct_guesses = 0 # 修复:初始化变量,替换类型注解 question_num = 1 for key in questions: print("\n\n") print(key) for item in options[question_num-1]: print(item) guess = input("Enter A, B, C or D: ") guess = guess.upper() # 修复:执行upper()方法转换大小写 guesses.append(guess) question_num += 1 # 修复:传入当前guess而非guesses列表,累加正确次数 correct_guesses += check_answer(questions.get(key), guess) # 修复:调整参数顺序,匹配函数定义 display_score(guesses, correct_guesses) def check_answer(answer, guess): if answer == guess: print("CORRECT! NICE") return 1 else: print("\n\nNooo, it's wrong") return 0 # 修复:统一返回值位置,避免逻辑歧义 def display_score(guesses, correct_guesses): print("---------------------") print("RESULTS") print("---------------------") print("Answers: ", end="") for i in questions: print(questions.get(i), end=" ") print() print("Guesses: ", end="") for item in guesses: print(item, end=" ") print() score = int((correct_guesses/len(questions)) * 100) print(f"Your score is: {score}%") # 优化:使用f-string更简洁 def play_again(): response = input("Do you wanna play again? (yes or no?): ").strip().lower() # 修复:执行lower()方法,增加strip()处理空格 return response == "yes" questions = { "Qual a data de nascimento de Second?": "B", "Qual o ditador favorito de Packat?": "B", "Qual a segunda lei da termodinâmica?": "C", "Qual a melhor obra asiática já feita?": "D" } options = [ ["A. 25/12/2004", "B. 31/03/2004", "C. 31/04/2003", "D. 21/06/2003"], ["A. Josef Stalin", "B. Nicolás Maduro", "C. Xin Jin Ping", "D. Kim Jon Un"], ["A. Ação e reação", "B. Princípio da Conservação de Energia", "C. Entropia", "D. Princípio da Incerteza"], ["A. Naruto", "B. HunterxHunter", "C. One Piece", "D. Solo Leveling"] ] new_game() while play_again(): # 修复:调用函数获取返回值作为循环条件 new_game() print("Byeeee")
内容的提问来源于stack exchange,提问作者luiz_second
相关产品推荐
相关产品推荐

