python - 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 循环。
附件是一些屏幕截图,以帮助演示该问题。
解决方案
推荐阅读
- go - How to change redis passwd without downtime
- python - 如果两个列表具有相同的元素,则将这些列表的其他元素相加
- c++ - 矩阵中最有价值的“H”形区域?
- python - 加载保存的模型以恢复训练
- android - 如何忽略某些 UI 元素作为对讲的分隔符或 ImageViews?
- angular - 角度@Input获取对象对象
- javascript - Safari 和 Chrome 的 ascii 值不同
- node.js - 定义在 RabbitMQ 中删除消息时触发的 nodeJS 回调
- java - 无法在 RecyclerAdapter Android Studio 中切换视图
- node.js - 启动失败,然后监听端口