1

I'm trying to build a path-finder(specifically using Dijkstra's algorithm) representation. when printing the path result onto the screen, it all happens to fast. so fast in fact, that the path seems to be printed in one shot.

I've tried adding the following line after each print:

milliseconds = 500
pygame.time.delay(milliseconds) 

which according to the documentation (https://www.pygame.org/docs/ref/time.html#pygame.time.delay) should simply pause the game:

pygame.time.delay()

pause the program for an amount of time

delay(milliseconds) -> time

but this just makes the Window collapse. is there another way to do this?

p.s. I haven't added the entire code, because it composes of several packages and files, but the algorithm is being called from the main loop (that runs the graphics) if that of any help

edit:

i would like to clarify my question: the main loop calls other methods. one of which generates the minimum path. how can I make sure that printing the path is timed, even when its generated outside the main loop?

i've tried to add a clock, but that still doesn't seem to work. I think it will be best if I provide the main loop and the algorithm as reference:

    def __init__(self, ...):
    self.fps = FPS
    self.clock = pygame.time.Clock()
    self.run_button = pygame.Rect(WIDTH - BUTTON_WIDTH, 0, BUTTON_WIDTH, 
    BUTTON_HEIGHT)  # button that runs dijkstra
    ...


    def run_visuals(self):
    """
    runs the visuals in a loop
    """
    run = True
    self.draw_grid()
    pygame.draw.rect(self.window, GREY, self.run_button)  # run button
    while run:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                run = False
            if event.type == pygame.MOUSEBUTTONDOWN:
                x, y = event.pos
                if self.run_button.collidepoint(x, y):
                    dijkstra(self.graph, self.source_node, self.window, self.dest_node,self.clock)
        self.add_bad_nodes_with_mouse()
        self.draw_nodes("bad")
    pygame.display.update()

def dijkstra(graph, source, window, dest,clock):
    source.set_dist_from_source(0)
    Q = build_min_heap(graph)  # O(V)
    while Q:  # O(V)
        clock.tick(FPS)
        u = heapq.heappop(Q)  # pops the min val based on dist from source (get value and remove from heap) O(logV)
        if u == dest:
            break
        neighbors_of_u = graph.get_neighbors()[u.name]
        for v in neighbors_of_u:  # O(E)
            # drawing neighbors:
            block = get_block_from_node(v)
            block.draw_block(window, VISITED_COLOR)
            # checking min path:
            weight_u_v = graph.get_edge_weight(u.name, v.name)
            v_dist = v.dist_from_source
            u_dist = u.dist_from_source
            if v_dist > u_dist + weight_u_v:
                v.set_dist_from_source(u_dist + weight_u_v)
                v.set_prev(u)
                heapq.heappush(Q, v)  # O(logV)
    print_path(window, source, dest)
Hadar
  • 658
  • 4
  • 17
  • 1
    `it all happens to fast. so fast in fact, that the path seems to be printed in one shot.` Are you blitting/drawing all at once and flipping at the end, or do you flip after each blit/draw? The latter would probably go slower. Also wouldn't Pygame's `clock.tick()` be what you want? – Random Davis Oct 12 '20 at 15:08
  • I have a list of nodes, which make up the path. each node has a corresponding pixel on the screen. so I iterate over that list and draw each node. it's not a long list, so it prints all the elements super fast (instantaneously) – Hadar Oct 12 '20 at 15:23

1 Answers1

3

You need to set the Frame per second (FPS) for any simplest game you develop.

FPS=30       
fpsClock=pygame.time.Clock()

At the end of the program add the lines as ,

pygame.display.update()
    fpsClock.tick(FPS)
kirti purohit
  • 401
  • 1
  • 4
  • 18
  • I've added those lines, but what happens is that the programs lag initially, but then proceeds to print everything as before. the prints happen outside the main loop. does this matter? – Hadar Oct 12 '20 at 15:31