如何实现Python Turtle答题游戏中已展示问题不重复出现?
解决Turtle答题游戏中题目重复的问题
这个问题的核心是你每次调用reset()时都重新创建了完整的题目列表,并且用random.choice()随机选取,没有记录哪些题目已经出现过。我们可以通过维护一个剩余题目列表来解决,每次选完题目就从这个列表中移除,直到所有题目都被选过再重置。
具体实现思路
- 结构化题目数据:把所有题目、选项和正确答案整理成一个列表字典,避免冗长的
elif判断,也方便后续维护。 - 全局维护剩余题目:用一个全局变量保存还未展示的题目,每次选完就从列表中删除该题目。
- 重置时检查剩余题目:如果剩余题目为空,就重新填充为完整的题目列表,实现循环答题但不重复的效果。
- 提取渲染题目逻辑:把渲染题目、选项和绑定按键的代码封装成函数,每次重置后调用,避免重复代码。
修改后的完整代码
import random from turtle import * import time # 结构化题目数据:每个字典存问题、选项、正确按键 questions = [ { "question": "Vad heter det största landet i Norden?", "options": ["A. Danmark", "B. Sverige", "C. Finland", "D. Norge"], "correct_key": "b" }, { "question": "Vad är William och Svens favorit språk?", "options": ["A. Java", "B. C++", "C. Python", "D. LUA"], "correct_key": "d" }, { "question": "Vad heter Sveriges statsminister?", "options": ["A. Fredrik Reignfeldt", "B. Magdalenda Andersson", "C. Sven Blomqvist", "D. Martin Nilsson"], "correct_key": "b" }, { "question": "Vad heter USA's president?", "options": ["A. Joe Biden", "B. Bill Clinton", "C. Donald Trump", "D. Albin Winqvist"], "correct_key": "a" }, { "question": "Vad är Malmös bästa skola?", "options": ["A. Borgarskolan", "B. Procivitas", "C. Bernadottegymnasiet", "D. Pauliskolan"], "correct_key": "c" } ] # 初始化剩余题目列表(拷贝原题目列表,避免修改原数据) remaining_questions = questions.copy() def reset(x, y): print("Körs") clearscreen() speed(10) hideturtle() title('Albins ofungerade spel') Screen().bgcolor("orange") # 绘制答题框 draw_question_boxes() # 检查剩余题目,为空则重置 global remaining_questions if not remaining_questions: remaining_questions = questions.copy() # 可选:提示所有题目已答完 penup() setposition(0, 200) pendown() write("Alla frågor är klara! Nu börjar vi om.", font=('Courier', 20, 'italic'), align='center') time.sleep(2) clearscreen() draw_question_boxes() # 随机选一个题目并从剩余列表移除 selected_question = random.choice(remaining_questions) remaining_questions.remove(selected_question) # 渲染选中的题目 display_question(selected_question) def draw_question_boxes(): """绘制所有选项的方框""" l = 300 w = 75 positions = [100, 0, -100, -200] penup() for y_pos in positions: goto(-150, y_pos) pendown() for _ in range(4): forward(l) left(90) penup() def display_question(question): """渲染题目和选项,并绑定按键事件""" quest_font = ('Courier', 15, 'italic') main_font = ('Courier', 25, 'italic') # 渲染题目 penup() setposition(0, 250) pendown() write(question["question"], font=main_font, align='center') # 渲染选项(对应四个y坐标) y_positions = [130, 30, -70, -170] for option, y in zip(question["options"], y_positions): penup() setposition(0, y) pendown() write(option, font=quest_font, align='center') # 绑定按键:正确按键触发good,其他触发bad correct_key = question["correct_key"] onkeypress(good, correct_key) # 绑定其他错误按键 for key in ['a', 'b', 'c', 'd']: if key != correct_key: onkeypress(bad, key) listen() def good(): penup() setposition(0, -280) pendown() write("Rätt val! Tryck på skärmen för ny fråga", font=('Courier', 25, 'italic'), align='center') onscreenclick(reset) def bad(): penup() setposition(0, -280) pendown() write("Fel val! Tryck på skärmen för ny fråga", font=('Courier', 25, 'italic'), align='center') onscreenclick(reset) # 首次启动时调用reset初始化界面 reset(0, 0) done()
关键改进点说明
- 结构化题目:把所有题目信息放到
questions列表中,后续添加或修改题目只需修改这个列表,不用动逻辑代码。 - 剩余题目管理:
remaining_questions全局变量跟踪未展示的题目,每次选完就移除,确保不会重复。当列表为空时自动重置,实现循环答题。 - 代码复用:把绘制方框和渲染题目的逻辑提取成单独函数,让
reset()更简洁,也便于维护。 - 按键绑定优化:根据当前题目的正确答案动态绑定按键,避免了原来冗长的
elif判断。
内容的提问来源于stack exchange,提问作者Utbalbwin1
相关产品推荐
相关产品推荐

