class Main: def __init__(self): # Initialization pygame.init() self.visualizer = Visualizer() self.algorithm = Algorithm() self.speed_scl = 1 self.released = {} self.last_tick = current_time_millis() self.current_tick = current_time_millis() print("------------------------") print(" Controls: ") print("[WASD]: Move the graph.") print("[UP ARROW]: Zoom in.") print("[DOWN ARROW]: Zoom out.") print("[LEFT ARROW]: Slow down.") print("[RIGHT ARROW]: Speed up.") print("------------------------") # Main loop while True: if self.current_tick - self.last_tick > 1000 / SPEED: self.tick() self.last_tick = current_time_millis() else: self.current_tick = current_time_millis() def tick(self): # Handle program quit event for event in pygame.event.get(): if event.type == pygame.QUIT: sys.exit() # Key handling pressed = pygame.key.get_pressed() # Increase speed if pressed[pygame.K_RIGHT] != 0: if pygame.K_RIGHT in self.released: if self.released[pygame.K_RIGHT]: self.speed_up() self.released[pygame.K_RIGHT] = False elif pressed[pygame.K_RIGHT] == 0: self.released[pygame.K_RIGHT] = True # Decrease speed if pressed[pygame.K_LEFT] != 0: if pygame.K_LEFT in self.released: if self.released[pygame.K_LEFT]: self.slow_down() self.released[pygame.K_LEFT] = False elif pressed[pygame.K_LEFT] == 0: self.released[pygame.K_LEFT] = True # Reset if pressed[pygame.K_r] != 0: self.algorithm.reset() # Pause if pressed[pygame.K_SPACE] != 0: if pygame.K_SPACE in self.released: if self.released[pygame.K_SPACE]: if self.speed_scl != 0: self.stop() else: self.default_speed() self.released[pygame.K_SPACE] = False elif pressed[pygame.K_SPACE] == 0: self.released[pygame.K_SPACE] = True # Advance the algorithm points = self.algorithm.advance() self.visualizer.update_points(points) # Visualizer tick self.visualizer.tick() self.visualizer.draw_t(self.algorithm.t) self.visualizer.draw_speed(self.speed_scl) pygame.display.flip() # Buffer def slow_down(self): self.speed_scl = max(-4, self.speed_scl - 1) self.algorithm.time_increment = SPEEDS[self.speed_scl] def speed_up(self): self.speed_scl = min(4, self.speed_scl + 1) self.algorithm.time_increment = SPEEDS[self.speed_scl] def stop(self): self.speed_scl = 0 self.algorithm.time_increment = SPEEDS[self.speed_scl] def default_speed(self): self.speed_scl = 1 self.algorithm.time_increment = SPEEDS[self.speed_scl]