You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现Python Turtle答题游戏中已展示问题不重复出现?

解决Turtle答题游戏中题目重复的问题

这个问题的核心是你每次调用reset()时都重新创建了完整的题目列表,并且用random.choice()随机选取,没有记录哪些题目已经出现过。我们可以通过维护一个剩余题目列表来解决,每次选完题目就从这个列表中移除,直到所有题目都被选过再重置。

具体实现思路

  1. 结构化题目数据:把所有题目、选项和正确答案整理成一个列表字典,避免冗长的elif判断,也方便后续维护。
  2. 全局维护剩余题目:用一个全局变量保存还未展示的题目,每次选完就从列表中删除该题目。
  3. 重置时检查剩余题目:如果剩余题目为空,就重新填充为完整的题目列表,实现循环答题但不重复的效果。
  4. 提取渲染题目逻辑:把渲染题目、选项和绑定按键的代码封装成函数,每次重置后调用,避免重复代码。

修改后的完整代码

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 17:33:12