Beispiel #1
0
def main():
    clock = pygame.time.Clock()
    #map
    map = pygame.sprite.Group()
    map.add(maps.Map(0, 0, 1))

    # start_x = maps.MAP_NAVS[0][0]
    # start_y = maps.MAP_NAVS[0][1]
    start_x = 150
    start_y = 3
    print(start_x, start_y)
    maps.FINISH_INDEX = len(maps.MAP_NAVS) - 2

    #test route.
    route_1 = [[155.0, 3.0],[155.0, 124.0], [214.0, 124.0], [214.0, 283.0],
             [150.0, 283.0], [150.0, 478.0], [41.0, 478.0], [41.0, 700.0]]
    route_2 = [[0.0, 186.0], [74.0, 186.0], [74.0, 0.0]]
    route_3 = [[494.0, 0.0], [494.0, 185.0], [595.0, 185.0], [595.0, 383.0], [549.0, 383.0], [549.0, 597.0],
               [740.0, 597.0], [740.0, 480.0], [870.0, 480.0], [870.0, 700.0]]
    #car
    # start_angle = calculate_angle(maps.MAP_NAVS[0][0], maps.MAP_NAVS[0][1], maps.MAP_NAVS[1][0], maps.MAP_NAVS[1][1])
    cars = pygame.sprite.Group()
    cars2 = pygame.sprite.Group()
    cars3 = pygame.sprite.Group()
    cars.add(car.Car(route_1[0][0], route_1[0][1], route_1[1][0], route_1[1][1]))
    cars2.add(car.Car(route_2[0][0], route_2[0][1], route_2[1][0], route_2[1][1]))
    cars3.add(car.Car(route_3[0][0], route_3[0][1], route_3[1][0], route_3[1][1]))

    running = True
    k = 0
    while running:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
                break

        screen.blit(background, (0, 0))

        # update thay doi
        map.draw(screen)


        cars.update(route_1)
        cars2.update(route_2)
        cars3.update(route_3)



        cars.draw(screen)
        cars2.draw(screen)
        cars3.draw(screen)

        #render again
        pygame.display.flip()
        # Toc do Frame rate
        clock.tick(1000000)
Beispiel #2
0
def main():
    # Loop until the user clicks the close button.
    running = True

    # Used to manage how fast the screen updates
    clock = pygame.time.Clock()

    cam = camera.Camera()

    # traffic_lamp1 = traffic_lamp.TrafficLamp(1610, 420, 90, 0)
    # traffic_lamp2 = traffic_lamp.TrafficLamp(2710, 1520, 90, 1)

    stone_impediment = stone.Stone(200, 200, 90, 0)

    map_s = pygame.sprite.Group()
    map_s.add(maps.Map(0, 0, 2))

    start_x = maps.MAP_NAVS[0][0]
    start_y = maps.MAP_NAVS[0][1]
    maps.FINISH_INDEX = len(maps.MAP_NAVS) - 2

    traffic_lamp1 = traffic_lamp.TrafficLamp(maps.TRAFFIC_LAMP_COORDINATES[0])
    traffic_lamp2 = traffic_lamp.TrafficLamp(maps.TRAFFIC_LAMP_COORDINATES[1])

    print(maps.TRAFFIC_LAMP_COORDINATES[0])
    print(maps.TRAFFIC_LAMP_COORDINATES[1])

    start_angle = calculate_angle(maps.MAP_NAVS[0][0], maps.MAP_NAVS[0][1],
                                  maps.MAP_NAVS[1][0], maps.MAP_NAVS[1][1])
    # print("Start angle: ", start_angle)
    # print("Finish index: ", maps.FINISH_INDEX)

    controlled_car = car.Car(start_x, start_y, start_angle)

    cars = pygame.sprite.Group()
    cars.add(controlled_car)

    traffic_lamps = pygame.sprite.Group()
    traffic_lamps.add(traffic_lamp1)
    traffic_lamps.add(traffic_lamp2)

    stones = pygame.sprite.Group()
    stones.add(stone_impediment)

    stone_status = (stone_impediment.status, len(maps.MAP_NAVS) - 1)

    cam.set_pos(controlled_car.x, controlled_car.y)
    flag = 0
    # -------- Main Program Loop -----------

    while running:
        flag += 1
        keys = pygame.key.get_pressed()

        # --- Main event loop
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
                break
            if event.type == pygame.KEYUP:
                if keys[K_p]:
                    pass

                if keys[K_q]:
                    pygame.quit()
                    sys.exit(0)

            if event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE:
                running = False
                break

            # mouse event

            if event.type == pygame.MOUSEBUTTONDOWN:
                pressed1, pressed2, pressed3 = pygame.mouse.get_pressed()
                if pressed1:
                    print("left click")
                    current_index = controlled_car.current_nav_index
                    random_index = random.randrange(current_index + 3,
                                                    current_index + 6)
                    if random_index <= (len(maps.MAP_NAVS) -
                                        3) and stone_impediment.status == 0:
                        x = maps.MAP_NAVS[random_index][0]
                        y = maps.MAP_NAVS[random_index][1]
                        stone_impediment.switch_status(x, y)
                        stone_status = (stone_impediment.status, random_index)
                    else:
                        stone_impediment.switch_status(0, 0)
                        stone_status = (0, len(maps.MAP_NAVS) - 1)

        cam.set_pos(controlled_car.x, controlled_car.y)

        screen.blit(background, (0, 0))

        # update and render map
        # map_s.update(start_x, start_y)
        # map_s.update(cam.x, cam.y)
        map_s.draw(screen)

        # update and render traffic lamps
        traffic_lamps_status = []
        traffic_lamps.update(cam.x, cam.y)
        traffic_lamps.draw(screen)

        # stones.update(cam.x, cam.y)
        stones.draw(screen)

        # for lamp in traffic_lamps:
        #     lamp_status = lamp.render(screen)
        #     traffic_lamps_status.append(lamp_status)
        lamp_status1 = traffic_lamp1.render(screen)
        lamp_status2 = traffic_lamp2.render(screen)

        traffic_lamps_status.append(lamp_status1)
        traffic_lamps_status.append(lamp_status2)
        # update and render car
        cars.update(cam.x, cam.y, traffic_lamps_status, stone_status, flag)

        # screen.blit(cars.sprites[-1],[cam.x, cam.y])
        cars.draw(screen)

        # --- Go ahead and update the screen with what we've drawn.
        pygame.display.flip()

        # --- Limit to 60 frames per second
        clock.tick(60)
Beispiel #3
0
def main():
    fps_clock = pygame.time.Clock()
    map_city = map.Map(0, 0)

    flag = 0
    tracks = MAP_NAVS
    lights_pos = LIGHTS_POS
    # stones_pos = STONES_POS

    path = [0, 1, 2, 3, 14, 15, 13, 10]
    target_pos = tracks[path[-1]]
    rect_target = pygame.draw.circle(
        screen, (255, 0, 0),
        (math.floor(target_pos[0]), math.floor(target_pos[1])), 20, 20)
    car_player = car.Car()
    lights = []
    lights_on_path = {}
    # stones_on_path = {}
    # stones = []
    for i in range(len(lights_pos)):
        lights.append(
            light.Light(lights_pos[i][0], lights_pos[i][1], lights_pos[i][2]))
    # for i in range(len(stones_pos)):
    #     stones.append(stone.Stone(stones_pos[i][0], stones_pos[i][1], stones_pos[i][2]))
    rock = stone.Stone(0, 0, 0)

    moving = False
    running = True
    is_playing = -1
    while running:
        if is_playing == -1:
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    running = False
                elif event.type == pygame.KEYDOWN:
                    if event.key == pygame.K_SPACE:
                        is_playing = 0
                elif event.type == MOUSEBUTTONDOWN:
                    distance = math.hypot(event.pos[0] - rect_target.center[0],
                                          event.pos[1] - rect_target.center[1])
                    if distance < 20:
                        moving = True
                    print(event.pos)
                elif event.type == MOUSEBUTTONUP:
                    moving = False
                elif event.type == MOUSEMOTION and moving:
                    rect_target.move_ip(event.rel)
                else:
                    pass
        elif is_playing == 0:
            path = map_city.get_shortest_path(rect_target.center)
            rect_target.center = (math.floor(tracks[path[-1]][0]),
                                  math.floor(tracks[path[-1]][1]))
            car_player.set_path(path)
            for index_nav in path:
                for i in range(len(lights_pos)):
                    if index_nav == lights_pos[i][2]:
                        lights_on_path[index_nav] = lights[i]
                        break
                # for i in range(len(stones_pos)):
                #     if index_nav == stones_pos[i][2]:
                #         stones_on_path[index_nav] = stones[i]
                #         break

            car_player.set_light(lights_on_path)
            car_player.set_stone(rock)
            # car_player.set_stone(stones_on_path)

            # for event in pygame.event.get():
            #     if event.type == pygame.QUIT:
            #         running = False
            #     elif event.type == pygame.KEYDOWN:
            #         if event.key == pygame.K_SPACE:
            #             is_playing = 1
            #     elif event.type == MOUSEBUTTONDOWN:
            #         print(event.pos)
            is_playing = 1

        else:
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    running = False
                elif event.type == MOUSEBUTTONDOWN:
                    # index_stone = map_city.find_nearest_stone(event.pos)
                    # if index_stone != -1:
                    #     stones[index_stone].toggle_stone()

                    # print(event.pos)
                    nor_pos, indx_nav = map_city.nor_stone_position(
                        event.pos, car_player.path)
                    print(nor_pos, indx_nav)
                    if not math.isnan(indx_nav):
                        rock.show_stone(nor_pos, indx_nav, 4)
                    # print(index_stone)
            for i in range(len(lights)):
                lights[i].update()
            rock.update_time_remaining()
            car_player.move()

        screen.blit(map_city.image, map_city.rect)
        rect_target = pygame.draw.circle(screen, config.RED,
                                         rect_target.center, 15, 15)
        # for i in range(len(path) -1):
        #     point1 = (math.floor(tracks[path[i]][0]), math.floor(tracks[path[i]][1]))
        #     point2 = (math.floor(tracks[path[i +1]][0]), math.floor(tracks[path[i +1]][1]))
        #     pygame.draw.line(screen, config.BLUE, point1, point2, 7)

        for i in range(len(lights)):
            lights[i].render(screen)
        rock.render(screen)
        # for i in range(len(stones)):
        #     stones[i].render(screen)

        # for i in range(len(tracks)):
        #     image = font.render(str(i), True, config.RED)
        #     screen.blit(image, (math.floor(tracks[i][0]), math.floor(tracks[i][1])))
        #     pygame.draw.circle(screen, config.BLACK, (math.floor(tracks[i][0]), math.floor(tracks[i][1])), 5, 5)

        # for i in range(len(stones_pos)):
        #     pygame.draw.circle(screen, config.BLACK, (math.floor(stones_pos[i][0]), math.floor(stones_pos[i][1])), 5, 5)

        car_player.render(screen)
        pygame.display.flip()
        fps_clock.tick(config.FPS)
Beispiel #4
0
def main():
    clock = pygame.time.Clock()
    running = True

    cam = camera.Camera()

    # traffic_lamp1 = traffic_lamp.TrafficLamp(1610, 420, 90, 0)
    # traffic_lamp2 = traffic_lamp.TrafficLamp(2710, 1520, 90, 1)

    stone_impediment = stone.Stone(20, 20, 90, 0)

    map_s = pygame.sprite.Group()
    map_s.add(maps.Map(0, 0, 1))

    start_x = maps.MAP_NAVS[0][0]
    start_y = maps.MAP_NAVS[0][1]
    maps.FINISH_INDEX = len(maps.MAP_NAVS) - 2

    traffic_lamp1 = traffic_lamp.TrafficLamp(maps.TRAFFIC_LAMP_COORDINATES[0])
    traffic_lamp2 = traffic_lamp.TrafficLamp(maps.TRAFFIC_LAMP_COORDINATES[1])

    print(maps.TRAFFIC_LAMP_COORDINATES[0])
    print(maps.TRAFFIC_LAMP_COORDINATES[1])

    start_angle = calculate_angle(maps.MAP_NAVS[0][0],
                                  maps.MAP_NAVS[0][1], maps.MAP_NAVS[1][0], maps.MAP_NAVS[1][1])
    print(maps.MAP_NAVS)
    # print("Start angle: ", start_angle)
    # print("Finish index: ", maps.FINISH_INDEX)

    controlled_car = car.Car(start_x, start_y, start_angle)
    cars = pygame.sprite.Group()
    cars.add(controlled_car)

    traffic_lamps = pygame.sprite.Group()
    traffic_lamps.add(traffic_lamp1)
    traffic_lamps.add(traffic_lamp2)

    stones = pygame.sprite.Group()
    stones.add(stone_impediment)

    stone_status = (stone_impediment.status, len(maps.MAP_NAVS) - 1)

    cam.set_pos(controlled_car.x, controlled_car.y)
    flag = 0

    while running:
        flag += 1
        keys = pygame.key.get_pressed()

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
                break
            if event.type == pygame.KEYUP:
                if keys[K_p]:
                    pass

                if keys[K_q]:
                    pygame.quit()
                    sys.exit(0)

            if event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE:
                running = False
                break

            # mouse event
            # if event.type == pygame.MOUSEBUTTONDOWN:
            #     pressed1, pressed2, pressed3 = pygame.mouse.get_pressed()
            #     if pressed1:
            #         print("left click")
            #         current_index = controlled_car.current_nav_index
            #         random_index = random.randrange(current_index + 3, current_index + 6)
            #         if random_index <= (len(maps.MAP_NAVS) - 3) and stone_impediment.status == 0:
            #             x = maps.MAP_NAVS[random_index][0]
            #             y = maps.MAP_NAVS[random_index][1]
            #             stone_impediment.switch_status(x, y)
            #             stone_status = (stone_impediment.status, random_index)
            #         else:
            #             stone_impediment.switch_status(0, 0)
            #             stone_status = (0, len(maps.MAP_NAVS) - 1)

        cam.set_pos(controlled_car.x, controlled_car.y)

        screen.blit(background, (0, 0))

        # update and render map
        map_s.update(cam.x, cam.y)
        map_s.draw(screen)

        # update and render traffic lamps
        traffic_lamps_status = []
        traffic_lamps.update(cam.x, cam.y)
        traffic_lamps.draw(screen)

        # update and render stone
        stones.update(cam.x, cam.y)
        stones.draw(screen)

        # for lamp in traffic_lamps:
        #     lamp_status = lamp.render(screen)
        #     traffic_lamps_status.append(lamp_status)
        lamp_status1 = traffic_lamp1.render(screen)
        lamp_status2 = traffic_lamp2.render(screen)

        traffic_lamps_status.append(lamp_status1)
        traffic_lamps_status.append(lamp_status2)
        # update and render car
        cars.update(cam.x, cam.y, traffic_lamps_status, stone_status, flag)
        cars.draw(screen)

        # update thay doi
        pygame.display.flip()

        # Toc do Frame rate
        clock.tick(100000)
Beispiel #5
0
def main():
    clock = pygame.time.Clock()
    running = True

    cam = camera.Camera()

    stone_impediment = stone.Stone(200, 200, 90, 0)

    map_s = pygame.sprite.Group()
    map_obj = maps.Map(0, 0)
    map_s.add(map_obj)

    position, alpha = map_obj.getInitProp()
    # position = map_obj.position
    # alpha = map_obj.alpha
    print("LECH TRAI:", map_obj.do_lech_trai(position))
    print("------------------------------------------------------------")
    print("TỌA ĐỘ TẤT CẢ CÁC ĐIỂM: ", map_obj.pos)
    print("------------------------------------------------------------")
    print("LIST ĐIỂM ĐƯỜNG ĐI: ", map_obj.listPoint)
    print("------------------------------------------------------------")
    print("TẬP ĐIỂM KỀ: ", map_obj.margin)
    print("------------------------------------------------------------")
    print("TẬP CẠNH: ", map_obj.margin_path)
    print("------------------------------------------------------------")
    print("ID ĐIỂM LỀ TRÁI: ", map_obj.left_point_index)
    print("------------------------------------------------------------")
    print("ID ĐIỂM LỀ PHẢI: ", map_obj.right_point_index)
    print("------------------------------------------------------------")
    start_x = maps.MAP_NAVS[0][0]
    start_y = maps.MAP_NAVS[0][1]
    maps.FINISH_INDEX = len(maps.MAP_NAVS) - 1
    alpha_update = alpha_to_car_angle(alpha / math.pi * 180)
    start_angle = calculate_angle(maps.MAP_NAVS[0][0],
                                  maps.MAP_NAVS[0][1], maps.MAP_NAVS[1][0], maps.MAP_NAVS[1][1])
# khởi tạo đối tượng car với tọa độ x, y và góc hướng
    controlled_car = car.Car(start_x, start_y, start_angle)
    cars = pygame.sprite.Group()  # nhóm đối tượng car
    cars.add(controlled_car)

# sprite: 1 đối tượng trong game
# sprite.group: nhóm các đối tượng vào cùng 1 group để thực hiện việc vẽ lại đồng thời
    traffic_lamps = pygame.sprite.Group()  # nhóm các đối tượng đèn
    for lamp_pos in maps.TRAFFIC_LAMP_COORDINATES:
        traffic_lamps.add(traffic_lamp.TrafficLamp(lamp_pos))

    stones = pygame.sprite.Group()  # nhóm đối tượng stone
    stones.add(stone_impediment)

    stone_status = (stone_impediment.status, len(maps.MAP_NAVS) - 1)

# di chuyển camera theo car
    cam.set_pos(controlled_car.x, controlled_car.y)
    flag = 0
    pygame.display.flip()
    while running:
        flag += 1
        keys = pygame.key.get_pressed()

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
                break
            if event.type == pygame.KEYUP:
                if keys[K_p]:
                    pass

                if keys[K_q]:
                    pygame.quit()
                    sys.exit(0)

            if event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE:
                running = False
                break

            # mouse event

            if event.type == pygame.MOUSEBUTTONDOWN:
                pressed1, pressed2, pressed3 = pygame.mouse.get_pressed()
                if pressed1:
                    print("left click")
                    current_index = controlled_car.current_nav_index
                    random_index = random.randrange(
                        current_index + 3, current_index + 6)
                    if random_index <= (len(maps.MAP_NAVS) - 3) and stone_impediment.status == 0:
                        x = maps.MAP_NAVS[random_index][0]
                        y = maps.MAP_NAVS[random_index][1]
                        stone_impediment.switch_status(x, y)
                        stone_status = (stone_impediment.status, random_index)
                    else:
                        stone_impediment.switch_status(0, 0)
                        stone_status = (0, len(maps.MAP_NAVS) - 1)

        cam.set_pos(controlled_car.x, controlled_car.y)

        screen.blit(background, (0, 0))

        # update and render map
        map_s.update(cam.x, cam.y)
        map_s.draw(screen)

        # update and render traffic lamps
        traffic_lamps_status = []
        traffic_lamps.update(cam.x, cam.y)
        traffic_lamps.draw(screen)

        stones.update(cam.x, cam.y)
        stones.draw(screen)

        for lamp in traffic_lamps:
            lamp_status = lamp.render(screen)
            traffic_lamps_status.append(lamp_status)

        # update and render car
        deviation = map_obj.do_lech_trai(
            (cam.x, cam.y))
        # print('do lech trai:', deviation)
        cars.update(cam.x, cam.y, traffic_lamps_status,
                    stone_status, deviation, flag)
        cars.draw(screen)
        pygame.display.flip()

        clock.tick(60)
Beispiel #6
0
def main():
    clock = pygame.time.Clock()
    running = True

    cam = camera.Camera()

    # traffic_lamp1 = traffic_lamp.TrafficLamp(1610, 420, 90, 0)
    # traffic_lamp2 = traffic_lamp.TrafficLamp(2710, 1520, 90, 1)

    stone_impediment = stone.Stone(200, 200, 90, 0)

    map_s = pygame.sprite.Group()
    map_s.add(maps.Map(0, 0, 2))

    start_x = maps.MAP_NAVS[0][0]
    start_y = maps.MAP_NAVS[0][1]
    maps.FINISH_INDEX = len(maps.MAP_NAVS) - 2

    traffic_lamp1 = traffic_lamp.TrafficLamp(maps.TRAFFIC_LAMP_COORDINATES[0])
    traffic_lamp2 = traffic_lamp.TrafficLamp(maps.TRAFFIC_LAMP_COORDINATES[1])

    print('________')
    print(maps.TRAFFIC_LAMP_COORDINATES[0])
    print(maps.TRAFFIC_LAMP_COORDINATES[1])

    start_angle = calculate_angle(maps.MAP_NAVS[0][0], maps.MAP_NAVS[0][1],
                                  maps.MAP_NAVS[1][0], maps.MAP_NAVS[1][1])
    # print("Start angle: ", start_angle)
    # print("Finish index: ", maps.FINISH_INDEX)

    controlled_car = car.Car(start_x, start_y, start_angle)
    cars = pygame.sprite.Group()
    cars.add(controlled_car)

    traffic_lamps = pygame.sprite.Group()
    traffic_lamps.add(traffic_lamp1)
    traffic_lamps.add(traffic_lamp2)

    stones = pygame.sprite.Group()
    stones.add(stone_impediment)

    stone_status = (stone_impediment.status, len(maps.MAP_NAVS) - 1)

    cam.set_pos(controlled_car.x, controlled_car.y)
    flag = 0

    ##
    start = pygame.time.get_ticks()

    while running:
        flag += 1
        keys = pygame.key.get_pressed()

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
                break
            if event.type == pygame.KEYUP:
                if keys[K_p]:
                    pass

                if keys[K_q]:
                    pygame.quit()
                    sys.exit(0)

            if event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE:
                running = False
                break

        cam.set_pos(controlled_car.x, controlled_car.y)

        screen.blit(background, (0, 0))

        # update and render map
        map_s.update(cam.x, cam.y)
        map_s.draw(screen)

        # update and render traffic lamps
        traffic_lamps_status = []
        traffic_lamps.update(cam.x, cam.y)
        traffic_lamps.draw(screen)

        stones.update(cam.x, cam.y)
        stones.draw(screen)

        # for lamp in traffic_lamps:
        #     lamp_status = lamp.render(screen)
        #     traffic_lamps_status.append(lamp_status)
        lamp_status1 = traffic_lamp1.render(screen)
        lamp_status2 = traffic_lamp2.render(screen)

        traffic_lamps_status.append(lamp_status1)
        traffic_lamps_status.append(lamp_status2)
        # update and render car
        cars.update(cam.x, cam.y, traffic_lamps_status, stone_status, flag)
        cars.draw(screen)

        ##### Add for timer ~~~

        font_preferences = [
            "Bizarre-Ass Font Sans Serif",
            "They definitely dont have this installed Gothic", "Papyrus",
            "Comic Sans MS"
        ]

        counting_time = pygame.time.get_ticks() - start

        # change milliseconds into minutes, seconds, milliseconds
        counting_minutes = str(int(counting_time / 60000)).zfill(2)
        counting_seconds = str(int((counting_time % 60000) / 1000)).zfill(2)

        counting_string = "%s:%s" % (counting_minutes, counting_seconds)

        counting_text = font.render(str(counting_string), 1, (0, 0, 0))

        font_preferences = ["Comic Sans MS"]

        text = create_text(str(counting_string), font_preferences, 72,
                           (0, 0, 0))

        screen.blit(text, (500, 0))
        text_x = create_text('X ->' + str(controlled_car.x), font_preferences,
                             20, (3, 252, 78))
        text_y = create_text('Y ->' + str(controlled_car.y), font_preferences,
                             20, (3, 252, 78))
        text_speed = create_text('Speed ->' + str(controlled_car.speed),
                                 font_preferences, 20, (3, 252, 78))
        screen.blit(text_x, (0, 0))
        screen.blit(text_y, (0, 20))
        screen.blit(text_speed, (0, 40))
        ######

        pygame.display.flip()

        clock.tick(60)
Beispiel #7
0
def main():
    clock = pygame.time.Clock()
    running = True

    cam = camera.Camera()

    stone_impediment = stone.Stone(200, 200, 90, 0)

    map_s = pygame.sprite.Group()
    map_s.add(maps.Map(0, 0, 2))

    start_x = maps.MAP_NAVS[0][0]
    start_y = maps.MAP_NAVS[0][1]
    maps.FINISH_INDEX = len(maps.MAP_NAVS) - 1

    start_angle = calculate_angle(maps.MAP_NAVS[0][0], maps.MAP_NAVS[0][1],
                                  maps.MAP_NAVS[1][0], maps.MAP_NAVS[1][1])
    # tính góc của xe: input x1, y1, x2, y2
    print("Start angle: ", start_angle)
    print("Finish index: ", maps.FINISH_INDEX)
    # khởi tạo đối tượng car với tọa độ x, y và góc hướng
    controlled_car = car.Car(start_x, start_y, start_angle)
    cars = pygame.sprite.Group()  # nhóm đối tượng car
    cars.add(controlled_car)

    # sprite: 1 đối tượng trong game
    # sprite.group: nhóm các đối tượng vào cùng 1 group để thực hiện việc vẽ lại đồng thời
    traffic_lamps = pygame.sprite.Group()  # nhóm các đối tượng đèn
    for lamp_pos in maps.TRAFFIC_LAMP_COORDINATES:
        traffic_lamps.add(traffic_lamp.TrafficLamp(lamp_pos))

    stones = pygame.sprite.Group()  # nhóm đối tượng stone
    stones.add(stone_impediment)

    stone_status = (stone_impediment.status, len(maps.MAP_NAVS) - 1)

    # di chuyển camera theo car
    cam.set_pos(controlled_car.x, controlled_car.y)
    flag = 0
    pygame.display.flip()
    while running:
        flag += 1
        keys = pygame.key.get_pressed()

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
                break
            if event.type == pygame.KEYUP:
                if keys[K_p]:
                    pass

                if keys[K_q]:
                    pygame.quit()
                    sys.exit(0)

            if event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE:
                running = False
                break

            # mouse event

            if event.type == pygame.MOUSEBUTTONDOWN:
                pressed1, pressed2, pressed3 = pygame.mouse.get_pressed()
                if pressed1:
                    print("left click")
                    current_index = controlled_car.current_nav_index
                    random_index = random.randrange(current_index + 3,
                                                    current_index + 6)
                    if random_index <= (len(maps.MAP_NAVS) -
                                        3) and stone_impediment.status == 0:
                        x = maps.MAP_NAVS[random_index][0]
                        y = maps.MAP_NAVS[random_index][1]
                        stone_impediment.switch_status(x, y)
                        stone_status = (stone_impediment.status, random_index)
                    else:
                        stone_impediment.switch_status(0, 0)
                        stone_status = (0, len(maps.MAP_NAVS) - 1)

        cam.set_pos(controlled_car.x, controlled_car.y)

        screen.blit(background, (0, 0))

        # update and render map
        map_s.update(cam.x, cam.y)
        map_s.draw(screen)

        # update and render traffic lamps
        traffic_lamps_status = []
        traffic_lamps.update(cam.x, cam.y)
        traffic_lamps.draw(screen)

        stones.update(cam.x, cam.y)
        stones.draw(screen)

        for lamp in traffic_lamps:
            lamp_status = lamp.render(screen)
            traffic_lamps_status.append(lamp_status)

        # update and render car
        cars.update(cam.x, cam.y, traffic_lamps_status, stone_status, flag)
        cars.draw(screen)
        # blue = 230, 30, 30
        # point1 = 635, 525
        # point2 = 165, 167
        # pygame.draw.lines(screen, blue, False, [(100,100), (150,200), (200,100), point1, point2], 5)
        pygame.display.flip()

        clock.tick(60)