""" Saudi eLeague Pac-Man | Entry point. Run with: python main.py Controls: Arrow keys Win state: Collect every lightning pellet in the maze. """ import turtle import random from constants import ( SCREEN_WIDTH, SCREEN_HEIGHT, CELL_SIZE, COLOR_BG, COLOR_ACCENT_CYAN, COLOR_GOLD, ) from renderer import Wall, Pellet, PowerPellet, UiPen, Banner from actors import Player def init_screen(): screen = turtle.Screen() screen.tracer(0) screen.title("Saudi eLeague Pac-Man") screen.setup(SCREEN_WIDTH + 10, SCREEN_HEIGHT + 10) screen.bgcolor(COLOR_BG) return screen def bind_controls(screen, player): screen.listen() screen.onkeypress(player.turn_right, "Right") screen.onkeypress(player.turn_left, "Left") screen.onkeypress(player.turn_up, "Up") screen.onkeypress(player.turn_down, "Down") def game_loop(screen, player, score_pen, lives_pen, pellet_pen, power_pen, message_pen, player_start_x, player_start_y, state): if state["over"]: return score_pen.write_score(player.score) lives_pen.write_lives(player.lives) for (px, py), stamp_id in list(pellet_pen.stamps.items()): if player.distance(px, py) < CELL_SIZE / 2 and (px, py) != (player_start_x, player_start_y): pellet_pen.clearstamp(stamp_id) del pellet_pen.stamps[(px, py)] player.score += 2 elif player.distance(px, py) < CELL_SIZE / 2 and (px, py) == (player_start_x, player_start_y): pellet_pen.clearstamp(stamp_id) del pellet_pen.stamps[(px, py)] for (px, py), stamp_id in list(power_pen.stamps.items()): if player.distance(px, py) < CELL_SIZE / 2: power_pen.clearstamp(stamp_id) del power_pen.stamps[(px, py)] player.score += 50 player.move_speed += 3 screen.ontimer(player.reset_speed, 3000) if not pellet_pen.stamps and not power_pen.stamps: state["over"] = True message_pen.write_message( f"VICTORY! {player.score}", color=COLOR_GOLD) screen.update() return player.move() player.check_wall_collision() screen.update() screen.ontimer( lambda: game_loop( screen, player, score_pen, lives_pen, pellet_pen, power_pen, message_pen, player_start_x, player_start_y, state ), 1000 // 60, ) def main(): screen = init_screen() wall_pen = Wall() pellet_pen = Pellet() power_pen = PowerPellet() banner_pen = Banner() ui_pen = UiPen() score_pen = UiPen() lives_pen = UiPen() message_pen = UiPen() wall_pen.draw() walls = wall_pen.walls pellet_pen.draw() power_pen.draw() ui_pen.draw_ui_area() banner_pen.draw() player_start_coor = random.choice(pellet_pen.pellets) player_start_x, player_start_y = player_start_coor player = Player(walls) player.goto(player_start_x, player_start_y) bind_controls(screen, player) state = {"over": False} game_loop(screen, player, score_pen, lives_pen, pellet_pen, power_pen, message_pen, player_start_x, player_start_y, state) screen.mainloop() if __name__ == "__main__": main()