#python #python-3.x #function #math #pygame
#python #python-3.x #функция #математика #pygame
Вопрос:
Я делал проект в Pygame, который требовал рендеринга случайного уравнения из equations
списка в определенное время. Для достижения этой цели я написал функцию, в которой она отображала функцию, но я столкнулся с 2 проблемами.
-
1-я проблема заключается в том, что он повторяет функцию больше, чем я действительно хочу, я хочу, чтобы функция просто повторялась один раз. Под этим я подразумеваю, что он должен ОДИН РАЗ выбрать случайное уравнение из списка и отобразить его ОДИН РАЗ, чего не происходит.
-
2-я проблема находится на 30-й строке кода. В нем говорится
if tks > 5000: display_equation()
Но если я запускаю код, игра начинает повторять функцию, как только игра запускается, вместо того, чтобы ждать 5000-й миллисекунды игры, чтобы начать вызов функции.
Спасибо!
import pygame
import random
pygame.init()
screen = pygame.display.set_mode((640, 480))
clock = pygame.time.Clock()
done = False
equations = ['2 2', '3 1', '4 4', '7 - 4']
font = pygame.font.SysFont("comicsansms", 72)
tks = pygame.time.get_ticks()
def display_equation():
text = font.render(random.choice(list(equations)), True, (0, 128, 0))
screen.blit(text, (320 - text.get_width() // 2, 240 - text.get_height() // 2))
while not done:
for event in pygame.event.get():
if event.type == pygame.QUIT:
done = True
if event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE:
done = True
screen.fill((255, 255, 255))
tks = pygame.time.get_ticks()
if tks > 5000:
display_equation()
display_equation()
pygame.display.update()
clock.tick(60)
Ответ №1:
Чтобы код работал так, как вы хотите, внесите два изменения:
- Визуализируйте фон только один раз, перед циклом
- Создайте флаг, чтобы указать, что уравнение было отображено и нет необходимости повторно отображать его
Попробуйте этот код:
eq_done = False
screen.fill((255, 255, 255))
while not done:
for event in pygame.event.get():
if event.type == pygame.QUIT:
done = True
if event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE:
done = True
tks = pygame.time.get_ticks()
if tks > 5000 and not eq_done:
display_equation()
eq_done = True # only render once
pygame.display.update()
clock.tick(60)