首页 > 解决方案 > Python程序一次遍历整个for in range循环并像while循环一样进行迭代

问题描述

import csv
import random
from datetime import date
import pygame
from pygame.locals import *
import sys

mainClock = pygame.time.Clock()
pygame.init()
pygame.display.set_caption('Game')
screen = pygame.display.set_mode((900, 600), 0, 32)
# noinspection PyTypeChecker
answer_font = pygame.font.SysFont(None, 50)
# noinspection PyTypeChecker
question_font = pygame.font.SysFont(None, 30)


class QuestionAnswerControls:
    def __init__(self):
        self.score = 0
        self.questions = []
        self.answers = []
        self.correctAnswers = []

    def get_question_answer(self):

        questions_and_answers = []

        with open('questions.txt', newline='') as f:
            reader = csv.reader(f, delimiter='\t')
            for row in reader:
                questions_and_answers.append(row)

        random.shuffle(questions_and_answers)
        for q in questions_and_answers:
            self.questions.append(q[0])
            self.correctAnswers.append(q[1])
            del q[0]
            random.shuffle(q)
            self.answers.append(q)

    def get_number_of_questions(self):
        noq = int(len(self.questions))
        return noq

    def get_question(self, question_number):
        question = self.questions[question_number]
        return question

    def get_answers(self, answer_set_number):
        answer_set = self.answers[answer_set_number]
        return answer_set

    def get_correct_answer(self, correct_answer_number):
        correct_answer = self.correctAnswers[correct_answer_number]
        return correct_answer

    def increase_score(self):
        self.score += 1

    def export_scores(self):
        with open('scores.txt', mode='a') as scores:
            scores = csv.writer(scores, delimiter='\t')

            today = date.today()
            date_format = today.strftime("%d/%m/%Y")

            scores.writerow([date_format, self.score])


def draw_text(text, font, colour, surface, x, y):
    textobj = font.render(text, 1, colour)
    textrect = textobj.get_rect()
    textrect.topleft = (x, y)
    surface.blit(textobj, textrect)


click = False


def question_answer_gui():
    global click
    game_menu = True
    while game_menu:

        screen.fill((0, 0, 0))
        mx, my = pygame.mouse.get_pos()

        question_rect = pygame.Rect(100, 100, 700, 100)
        button_answer_one = pygame.Rect(100, 250, 325, 100)
        button_answer_two = pygame.Rect(475, 250, 325, 100)
        button_answer_three = pygame.Rect(100, 400, 325, 100)
        button_answer_four = pygame.Rect(475, 400, 325, 100)

        click = False
        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()
                sys.exit()
            if event.type == KEYDOWN:
                if event.key == K_ESCAPE:
                    pygame.quit()
                    sys.exit()
            if event.type == MOUSEBUTTONDOWN:
                if event.button == 1:
                    click = True

        for c in range(0, questionAnswerGame.get_number_of_questions()):
            screen.fill((0, 0, 0))
            question_answered = False
            question = questionAnswerGame.get_question(c)
            correct_answer = questionAnswerGame.get_correct_answer(c)
            answers = questionAnswerGame.get_answers(c)
            answer_chosen = ""

            print(question, answers, correct_answer)

            pygame.draw.rect(screen, (255, 0, 0), question_rect)
            draw_text(str(question), question_font, (255, 255, 255), screen, 200, 135)
            pygame.draw.rect(screen, (255, 0, 0), button_answer_one)
            draw_text(str(answers[0]), answer_font, (255, 255, 255), screen, 175, 285)
            pygame.draw.rect(screen, (255, 0, 0), button_answer_two)
            draw_text(str(answers[1]), answer_font, (255, 255, 255), screen, 525, 285)
            pygame.draw.rect(screen, (255, 0, 0), button_answer_three)
            draw_text(str(answers[2]), answer_font, (255, 255, 255), screen, 175, 435)
            pygame.draw.rect(screen, (255, 0, 0), button_answer_four)
            draw_text(str(answers[3]), answer_font, (255, 255, 255), screen, 525, 435)

            if button_answer_one.collidepoint((mx, my)):
                if click:
                    answer_chosen = answers[0]
                    question_answered = True
            if button_answer_two.collidepoint((mx, my)):
                if click:
                    answer_chosen = answers[1]
                    question_answered = True
            if button_answer_three.collidepoint((mx, my)):
                if click:
                    answer_chosen = answers[2]
                    question_answered = True
            if button_answer_four.collidepoint((mx, my)):
                if click:
                    answer_chosen = answers[3]
                    question_answered = True

            click = False

            print(answer_chosen)

            if answer_chosen == correct_answer:
                questionAnswerGame.increase_score()
                print("Correct")

            if question_answered:
                pygame.display.update()
                mainClock.tick(60)

        pygame.display.update()
        mainClock.tick(60)


questionAnswerGame = QuestionAnswerControls()
questionAnswerGame.get_question_answer()
question_answer_gui()

for c in range 循环中的打印语句仅用于测试目的,它们不应出现在最终产品中。

这是我为 A-Level 编程项目制作的游戏的一部分,这只是其中的一个模块。

我的问题是 for c in range 循环将遍历整个 for 语句,而无需等待用户选择答案。print(question, answers, correct_answer) 语句证明了这一点。此外,这个 for 循环似乎在某种程度上起到了 while 循环的作用。当程序只是坐在那里运行时,它会一遍又一遍地按顺序打印出所有问题。

应该发生的是游戏显示问题和答案,用户选择一个答案,他们的分数增加,然后向用户显示下一个问题,用户选择答案等。程序当前正确呈现第一个问题,用户将选择一个答案,然后程序不会转到下一个问题,而是快速循环所有问题,然后直接返回第一个问题。

请帮忙。我需要 for c in range 语句等到用户选择了答案后再问下一个问题。

我尝试在最后使用 if 语句仅在选择答案后更新显示,但这只会影响渲染而不影响实际的 for 循环。

附件是一些屏幕截图,以帮助演示该问题。

游戏是什么样子的

控制台从用于调试的打印语句中显示的内容

标签: pythonfor-looppygamelogicpython-3.8

解决方案


推荐阅读