|
1 | 1 | import pygame |
2 | | -import menu |
3 | | -import game_modes |
4 | | -from utils import load_game, save_game |
5 | | -import os |
| 2 | +import sys |
| 3 | +from player import Player |
| 4 | +from enemy import SoundEnemy, LightEnemy, PatrolEnemy |
| 5 | +from maze import generate_maze |
| 6 | +from lighting import draw_lighting |
| 7 | +from items import Item |
| 8 | +from hud import draw_hud |
| 9 | +from utils import draw_text, LEVELS |
6 | 10 |
|
| 11 | +# Initialization |
7 | 12 | pygame.init() |
8 | | -pygame.mixer.init() |
9 | 13 |
|
| 14 | +# Constants |
| 15 | +SCREEN_WIDTH = 800 |
| 16 | +SCREEN_HEIGHT = 600 |
| 17 | +TILE_SIZE = 40 |
| 18 | +FPS = 60 |
| 19 | +MAX_LEVEL = 5 |
| 20 | + |
| 21 | +# Colors |
| 22 | +BLACK = (0, 0, 0) |
| 23 | +WHITE = (255, 255, 255) |
| 24 | + |
| 25 | +# Screen |
| 26 | +screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT)) |
| 27 | +pygame.display.set_caption("Shadow Labyrinth") |
| 28 | + |
| 29 | +# Main game function |
10 | 30 | def main(): |
11 | | - high_score, championship_standings, settings = load_game() |
12 | | - flags = pygame.FULLSCREEN if settings["fullscreen"] else 0 |
13 | | - screen = pygame.display.set_mode(settings["resolution"], flags) |
14 | | - pygame.display.set_caption("F1 Manager & Racer") |
15 | | - font = pygame.font.SysFont("arial", 36) |
16 | | - if os.path.exists("music.mp3"): |
17 | | - pygame.mixer.music.load("music.mp3") |
18 | | - pygame.mixer.music.set_volume(settings["music_volume"]) |
19 | | - pygame.mixer.music.play(-1) |
20 | | - |
21 | | - while True: |
22 | | - choice, settings = menu.main_menu(screen, font, settings, high_score) |
23 | | - flags = pygame.FULLSCREEN if settings["fullscreen"] else 0 |
24 | | - screen = pygame.display.set_mode(settings["resolution"], flags) |
25 | | - if choice == "race_setup": |
26 | | - track_name, num_opponents, max_laps, car_type, tire_type, settings = menu.race_setup_menu(screen, font, settings) |
27 | | - if track_name: |
28 | | - high_score = game_modes.race_mode(screen, track_name, num_opponents, max_laps, car_type, tire_type, settings, high_score) |
29 | | - save_game(high_score, championship_standings, settings) |
30 | | - elif choice == "championship": |
31 | | - result = game_modes.championship_mode(screen, font, settings, championship_standings) |
32 | | - if result: |
33 | | - high_score, championship_standings = result |
34 | | - save_game(high_score, championship_standings, settings) |
35 | | - elif choice == "practice": |
36 | | - track_name, duration, car_type, tire_type, settings = menu.practice_setup_menu(screen, font, settings) |
37 | | - if track_name: |
38 | | - game_modes.practice_mode(screen, track_name, duration, car_type, tire_type, settings) |
39 | | - elif choice == "time_attack": |
40 | | - track_name, car_type, tire_type, settings = menu.time_attack_setup_menu(screen, font, settings) |
41 | | - if track_name: |
42 | | - high_score = game_modes.race_mode(screen, track_name, 0, None, car_type, tire_type, settings, high_score) |
43 | | - save_game(high_score, championship_standings, settings) |
44 | | - elif choice == "settings": |
45 | | - settings = menu.settings_menu(screen, font, settings) |
46 | | - save_game(high_score, championship_standings, settings) |
| 31 | + clock = pygame.time.Clock() |
| 32 | + current_level = 1 |
| 33 | + score = 0 |
| 34 | + paused = False |
| 35 | + |
| 36 | + while current_level <= MAX_LEVEL: |
| 37 | + maze_width, maze_height = LEVELS[current_level - 1] |
| 38 | + walls = generate_maze(maze_width, maze_height) |
| 39 | + player = Player(TILE_SIZE * 2, TILE_SIZE * 2) |
| 40 | + enemies = pygame.sprite.Group() |
| 41 | + num_sound = current_level * 2 |
| 42 | + num_light = current_level |
| 43 | + num_patrol = current_level |
| 44 | + for _ in range(num_sound): |
| 45 | + enemies.add(SoundEnemy(walls)) |
| 46 | + for _ in range(num_light): |
| 47 | + enemies.add(LightEnemy(walls)) |
| 48 | + for _ in range(num_patrol): |
| 49 | + enemies.add(PatrolEnemy(walls)) |
| 50 | + |
| 51 | + items = pygame.sprite.Group() |
| 52 | + for _ in range(10 + current_level * 2): |
| 53 | + items.add(Item('battery', walls)) |
| 54 | + for _ in range(5 + current_level): |
| 55 | + items.add(Item('torch', walls)) |
| 56 | + for _ in range(3 + current_level): |
| 57 | + items.add(Item('health', walls)) |
| 58 | + for _ in range(2 + current_level): |
| 59 | + items.add(Item('speed', walls)) |
| 60 | + |
| 61 | + # Exit position |
| 62 | + exit_rect = pygame.Rect((maze_width - 2) * TILE_SIZE, (maze_height - 2) * TILE_SIZE, TILE_SIZE, TILE_SIZE) |
| 63 | + |
| 64 | + running = True |
| 65 | + while running: |
| 66 | + for event in pygame.event.get(): |
| 67 | + if event.type == pygame.QUIT: |
| 68 | + running = False |
| 69 | + sys.exit() |
| 70 | + if event.type == pygame.KEYDOWN: |
| 71 | + if event.key == pygame.K_p: |
| 72 | + paused = not paused |
| 73 | + |
| 74 | + if paused: |
| 75 | + draw_text(screen, "Paused", (SCREEN_WIDTH // 2, SCREEN_HEIGHT // 2), WHITE, 50) |
| 76 | + pygame.display.flip() |
| 77 | + clock.tick(10) |
| 78 | + continue |
| 79 | + |
| 80 | + # Player update |
| 81 | + player.update(walls, items) |
| 82 | + |
| 83 | + # Collect items |
| 84 | + collected = pygame.sprite.spritecollide(player, items, True) |
| 85 | + for item in collected: |
| 86 | + score += player.collect_item(item) |
| 87 | + |
| 88 | + # Enemies update |
| 89 | + sound_pos = player.get_sound_position() if player.moving else None |
| 90 | + light_positions = player.get_light_positions() |
| 91 | + for enemy in enemies: |
| 92 | + enemy.update(player, walls, sound_pos, light_positions) |
| 93 | + |
| 94 | + # Enemy collisions |
| 95 | + collided_enemies = pygame.sprite.spritecollide(player, enemies, False) |
| 96 | + for enemy in collided_enemies: |
| 97 | + player.take_damage(enemy.damage) |
| 98 | + if player.health <= 0: |
| 99 | + draw_text(screen, "Game Over! Score: " + str(score), (SCREEN_WIDTH // 2, SCREEN_HEIGHT // 2), WHITE, 40) |
| 100 | + pygame.display.flip() |
| 101 | + pygame.time.wait(3000) |
| 102 | + running = False |
| 103 | + sys.exit() |
| 104 | + |
| 105 | + # Check exit |
| 106 | + if player.rect.colliderect(exit_rect): |
| 107 | + score += 100 * current_level |
| 108 | + current_level += 1 |
| 109 | + if current_level > MAX_LEVEL: |
| 110 | + draw_text(screen, "Victory! Total Score: " + str(score), (SCREEN_WIDTH // 2, SCREEN_HEIGHT // 2), WHITE, 40) |
| 111 | + pygame.display.flip() |
| 112 | + pygame.time.wait(3000) |
| 113 | + running = False |
| 114 | + sys.exit() |
| 115 | + else: |
| 116 | + draw_text(screen, "Level Complete! Score: " + str(score), (SCREEN_WIDTH // 2, SCREEN_HEIGHT // 2), WHITE, 40) |
| 117 | + pygame.display.flip() |
| 118 | + pygame.time.wait(2000) |
| 119 | + break |
| 120 | + |
| 121 | + # Drawing |
| 122 | + screen.fill(BLACK) |
| 123 | + walls.draw(screen) |
| 124 | + items.draw(screen) |
| 125 | + enemies.draw(screen) |
| 126 | + screen.blit(player.image, player.rect) |
| 127 | + pygame.draw.rect(screen, (0, 255, 0), exit_rect) |
| 128 | + |
| 129 | + # Lighting |
| 130 | + draw_lighting(screen, player, walls, enemies, items, light_positions) |
| 131 | + |
| 132 | + # HUD |
| 133 | + draw_hud(screen, player, score, current_level) |
| 134 | + |
| 135 | + pygame.display.flip() |
| 136 | + clock.tick(FPS) |
| 137 | + |
| 138 | + pygame.quit() |
| 139 | + sys.exit() |
47 | 140 |
|
48 | 141 | if __name__ == "__main__": |
49 | 142 | main() |
0 commit comments