import pygame
import sys
import random
from pygame.locals import *

# 初始化 Pygame
pygame.init()

# 游戏窗口设置
WIDTH, HEIGHT = 1000, 700
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("迷宫探险 - 寻宝之旅")

# 颜色定义
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
RED = (255, 50, 50)
GREEN = (50, 255, 50)
BLUE = (50, 100, 255)
YELLOW = (255, 255, 50)
PURPLE = (180, 50, 230)
ORANGE = (255, 165, 0)
CYAN = (0, 255, 255)
PINK = (255, 182, 193)
GRAY = (100, 100, 100)
LIGHT_GRAY = (200, 200, 200)
DARK_GRAY = (50, 50, 50)
WALL_COLOR = (80, 60, 40)
FLOOR_COLOR = (200, 180, 150)
PATH_COLOR = (220, 200, 170)

# 加载字体
try:
    font_large = pygame.font.Font(None, 48)
    font_medium = pygame.font.Font(None, 36)
    font_small = pygame.font.Font(None, 24)
    font_tiny = pygame.font.Font(None, 20)
except:
    font_large = pygame.font.SysFont(None, 48)
    font_medium = pygame.font.SysFont(None, 36)
    font_small = pygame.font.SysFont(None, 24)
    font_tiny = pygame.font.SysFont(None, 20)

# 音效初始化
try:
    pygame.mixer.init()
    move_sound = pygame.mixer.Sound(bytearray([random.randint(0, 255) for _ in range(50)]))
    collect_sound = pygame.mixer.Sound(bytearray([random.randint(0, 255) for _ in range(50)]))
    enemy_sound = pygame.mixer.Sound(bytearray([random.randint(0, 255) for _ in range(50)]))
    victory_sound = pygame.mixer.Sound(bytearray([random.randint(0, 255) for _ in range(50)]))
    game_over_sound = pygame.mixer.Sound(bytearray([random.randint(0, 255) for _ in range(50)]))
except:
    class SilentSound:
        def play(self): pass
    move_sound = SilentSound()
    collect_sound = SilentSound()
    enemy_sound = SilentSound()
    victory_sound = SilentSound()
    game_over_sound = SilentSound()

# 游戏参数
CELL_SIZE = 35  # 增加单元格大小，让移动更明显
MAZE_WIDTH = 20  # 减小迷宫宽度
MAZE_HEIGHT = 15  # 减小迷宫高度
OFFSET_X = (WIDTH - MAZE_WIDTH * CELL_SIZE) // 2
OFFSET_Y = (HEIGHT - MAZE_HEIGHT * CELL_SIZE) // 2

# 速度控制参数
PLAYER_MOVE_DELAY = 15  # 玩家移动延迟（帧数），数值越大移动越慢
ENEMY_MOVE_DELAY = 30   # 敌人移动延迟（帧数）

class Maze:
    """迷宫类 - 生成随机迷宫"""
    def __init__(self, width, height):
        self.width = width
        self.height = height
        self.grid = [[1 for _ in range(height)] for _ in range(width)]
        self.start = (1, 1)
        self.end = (width-2, height-2)
        self.generate_maze()
        self.show_path = False
        
    def generate_maze(self):
        """使用深度优先搜索生成迷宫"""
        for x in range(self.width):
            for y in range(self.height):
                self.grid[x][y] = 1
        
        visited = [[False for _ in range(self.height)] for _ in range(self.width)]
        
        stack = [(1, 1)]
        self.grid[1][1] = 0
        visited[1][1] = True
        
        while stack:
            x, y = stack[-1]
            
            neighbors = []
            for dx, dy in [(0, -2), (2, 0), (0, 2), (-2, 0)]:
                nx, ny = x + dx, y + dy
                if 0 <= nx < self.width and 0 <= ny < self.height and not visited[nx][ny]:
                    neighbors.append((dx, dy, nx, ny))
            
            if neighbors:
                dx, dy, nx, ny = random.choice(neighbors)
                self.grid[x + dx//2][y + dy//2] = 0
                self.grid[nx][ny] = 0
                visited[nx][ny] = True
                stack.append((nx, ny))
            else:
                stack.pop()
        
        self.grid[self.start[0]][self.start[1]] = 0
        self.grid[self.end[0]][self.end[1]] = 0
        
        for _ in range(self.width * self.height // 20):
            x = random.randint(1, self.width-2)
            y = random.randint(1, self.height-2)
            if self.grid[x][y] == 1:
                path_count = 0
                for dx, dy in [(0, -1), (1, 0), (0, 1), (-1, 0)]:
                    nx, ny = x + dx, y + dy
                    if 0 <= nx < self.width and 0 <= ny < self.height and self.grid[nx][ny] == 0:
                        path_count += 1
                
                if 1 <= path_count <= 2:
                    self.grid[x][y] = 0
    
    def draw(self, screen):
        """绘制迷宫"""
        for x in range(self.width):
            for y in range(self.height):
                rect = pygame.Rect(OFFSET_X + x * CELL_SIZE, OFFSET_Y + y * CELL_SIZE, CELL_SIZE, CELL_SIZE)
                if self.grid[x][y] == 1:
                    pygame.draw.rect(screen, WALL_COLOR, rect)
                    pygame.draw.rect(screen, DARK_GRAY, rect, 1)
                else:
                    if self.show_path and (x, y) in self.get_solution_path():
                        pygame.draw.rect(screen, PATH_COLOR, rect)
                    else:
                        pygame.draw.rect(screen, FLOOR_COLOR, rect)
                    pygame.draw.rect(screen, (180, 160, 140), rect, 1)
        
        start_rect = pygame.Rect(OFFSET_X + self.start[0] * CELL_SIZE, 
                                OFFSET_Y + self.start[1] * CELL_SIZE, 
                                CELL_SIZE, CELL_SIZE)
        end_rect = pygame.Rect(OFFSET_X + self.end[0] * CELL_SIZE, 
                              OFFSET_Y + self.end[1] * CELL_SIZE, 
                              CELL_SIZE, CELL_SIZE)
        
        pygame.draw.rect(screen, GREEN, start_rect, 3)
        pygame.draw.rect(screen, RED, end_rect, 3)
        
        start_text = font_tiny.render("起点", True, GREEN)
        end_text = font_tiny.render("终点", True, RED)
        screen.blit(start_text, (start_rect.x + 5, start_rect.y + 5))
        screen.blit(end_text, (end_rect.x + 5, end_rect.y + 5))
    
    def can_move(self, x, y):
        """检查位置是否可移动"""
        return 0 <= x < self.width and 0 <= y < self.height and self.grid[x][y] == 0
    
    def get_solution_path(self):
        """获取解决方案路径"""
        path = []
        x, y = self.start
        
        while (x, y) != self.end:
            path.append((x, y))
            if x < self.end[0] and self.can_move(x+1, y):
                x += 1
            elif y < self.end[1] and self.can_move(x, y+1):
                y += 1
            elif x > 0 and self.can_move(x-1, y):
                x -= 1
            elif y > 0 and self.can_move(x, y-1):
                y -= 1
            else:
                break
        
        path.append(self.end)
        return path

class Player:
    """玩家类"""
    def __init__(self, maze):
        self.maze = maze
        self.x, self.y = maze.start
        self.radius = CELL_SIZE // 2 - 3
        self.color = BLUE
        self.treasures = 0
        self.score = 0
        self.steps = 0
        self.health = 100
        self.invincible = False
        self.invincible_timer = 0
        self.blink = False
        self.blink_timer = 0
        self.move_timer = 0  # 移动计时器
        self.last_move_time = 0  # 上次移动时间
        
    def can_move_now(self):
        """检查当前是否可以移动"""
        current_time = pygame.time.get_ticks()
        if current_time - self.last_move_time > PLAYER_MOVE_DELAY * 10:  # 转换为毫秒
            return True
        return False
    
    def move(self, dx, dy):
        """移动玩家"""
        if not self.can_move_now():
            return False
            
        new_x, new_y = self.x + dx, self.y + dy
        
        if self.maze.can_move(new_x, new_y):
            self.x, self.y = new_x, new_y
            self.steps += 1
            self.last_move_time = pygame.time.get_ticks()
            move_sound.play()
            return True
        return False
    
    def update(self):
        """更新玩家状态"""
        if self.invincible:
            self.invincible_timer -= 1
            if self.invincible_timer <= 0:
                self.invincible = False
            
            self.blink_timer += 1
            if self.blink_timer >= 5:
                self.blink = not self.blink
                self.blink_timer = 0
    
    def draw(self, screen):
        """绘制玩家"""
        if self.invincible and self.blink:
            return
            
        x = OFFSET_X + self.x * CELL_SIZE + CELL_SIZE // 2
        y = OFFSET_Y + self.y * CELL_SIZE + CELL_SIZE // 2
        
        pygame.draw.circle(screen, self.color, (x, y), self.radius)
        
        eye_radius = self.radius // 3
        pygame.draw.circle(screen, WHITE, (x - eye_radius, y - eye_radius), eye_radius)
        pygame.draw.circle(screen, WHITE, (x + eye_radius, y - eye_radius), eye_radius)
        
        pygame.draw.circle(screen, BLACK, (x - eye_radius, y - eye_radius), eye_radius // 2)
        pygame.draw.circle(screen, BLACK, (x + eye_radius, y - eye_radius), eye_radius // 2)
        
        mouth_rect = pygame.Rect(x - eye_radius, y + eye_radius, eye_radius * 2, eye_radius)
        pygame.draw.arc(screen, RED, mouth_rect, 0, 3.14, 2)
        
        if self.health < 30:
            pygame.draw.line(screen, RED, (x - eye_radius, y + eye_radius), (x - eye_radius - 5, y + eye_radius + 5), 2)
            pygame.draw.line(screen, RED, (x + eye_radius, y + eye_radius), (x + eye_radius + 5, y + eye_radius + 5), 2)
    
    def take_damage(self, amount):
        """受到伤害"""
        if not self.invincible:
            self.health -= amount
            self.invincible = True
            self.invincible_timer = 60
            enemy_sound.play()
            return True
        return False
    
    def heal(self, amount):
        """恢复生命值"""
        self.health = min(100, self.health + amount)
        self.score += 10
        
    def collect_treasure(self, value):
        """收集宝藏"""
        self.treasures += 1
        self.score += value
        collect_sound.play()
    
    def is_at_exit(self):
        """检查是否到达出口"""
        return (self.x, self.y) == self.maze.end
    
    def get_rect(self):
        """获取玩家的碰撞矩形"""
        x = OFFSET_X + self.x * CELL_SIZE
        y = OFFSET_Y + self.y * CELL_SIZE
        return pygame.Rect(x, y, CELL_SIZE, CELL_SIZE)

class Enemy:
    """敌人类"""
    def __init__(self, maze, x, y, enemy_type=1):
        self.maze = maze
        self.x, self.y = x, y
        self.type = enemy_type
        self.radius = CELL_SIZE // 2 - 4
        self.speed = 1
        self.move_timer = 0
        self.last_move_time = 0
        self.direction = random.choice([(0, 1), (1, 0), (0, -1), (-1, 0)])
        
        if enemy_type == 1:
            self.color = RED
            self.speed = 2
            self.damage = 10
            self.move_delay = ENEMY_MOVE_DELAY * 1.5  # 最慢
        elif enemy_type == 2:
            self.color = PURPLE
            self.speed = 1
            self.damage = 20
            self.move_delay = ENEMY_MOVE_DELAY  # 中等
        else:
            self.color = ORANGE
            self.speed = 3
            self.damage = 15
            self.move_delay = ENEMY_MOVE_DELAY * 0.7  # 最快
    
    def can_move_now(self):
        """检查当前是否可以移动"""
        current_time = pygame.time.get_ticks()
        if current_time - self.last_move_time > self.move_delay * 10:  # 转换为毫秒
            return True
        return False
    
    def update(self, player_x, player_y):
        """更新敌人位置"""
        if not self.can_move_now():
            return
            
        dx = player_x - self.x
        dy = player_y - self.y
        
        if abs(dx) > abs(dy):
            if dx > 0 and self.maze.can_move(self.x + 1, self.y):
                self.x += 1
            elif dx < 0 and self.maze.can_move(self.x - 1, self.y):
                self.x -= 1
            elif dy > 0 and self.maze.can_move(self.x, self.y + 1):
                self.y += 1
            elif dy < 0 and self.maze.can_move(self.x, self.y - 1):
                self.y -= 1
        else:
            if dy > 0 and self.maze.can_move(self.x, self.y + 1):
                self.y += 1
            elif dy < 0 and self.maze.can_move(self.x, self.y - 1):
                self.y -= 1
            elif dx > 0 and self.maze.can_move(self.x + 1, self.y):
                self.x += 1
            elif dx < 0 and self.maze.can_move(self.x - 1, self.y):
                self.x -= 1
        
        self.last_move_time = pygame.time.get_ticks()
    
    def draw(self, screen):
        """绘制敌人"""
        x = OFFSET_X + self.x * CELL_SIZE + CELL_SIZE // 2
        y = OFFSET_Y + self.y * CELL_SIZE + CELL_SIZE // 2
        
        pygame.draw.circle(screen, self.color, (x, y), self.radius)
        
        eye_radius = self.radius // 4
        pygame.draw.circle(screen, WHITE, (x - eye_radius, y - eye_radius), eye_radius)
        pygame.draw.circle(screen, WHITE, (x + eye_radius, y - eye_radius), eye_radius)
        
        pygame.draw.circle(screen, BLACK, (x - eye_radius, y - eye_radius), eye_radius // 2)
        pygame.draw.circle(screen, BLACK, (x + eye_radius, y - eye_radius), eye_radius // 2)
        
        if self.type == 1:
            pygame.draw.line(screen, BLACK, (x - eye_radius, y + eye_radius), 
                           (x + eye_radius, y + eye_radius), 2)
        elif self.type == 2:
            pygame.draw.arc(screen, BLACK, (x - eye_radius, y, eye_radius * 2, eye_radius), 
                          3.14, 0, 2)
        else:
            pygame.draw.ellipse(screen, BLACK, (x - eye_radius, y + eye_radius, 
                                              eye_radius * 2, eye_radius))
    
    def collides_with(self, player_x, player_y):
        """检查是否与玩家碰撞"""
        return self.x == player_x and self.y == player_y
    
    def get_rect(self):
        """获取敌人的碰撞矩形"""
        x = OFFSET_X + self.x * CELL_SIZE
        y = OFFSET_Y + self.y * CELL_SIZE
        return pygame.Rect(x, y, CELL_SIZE, CELL_SIZE)

class Treasure:
    """宝藏类"""
    def __init__(self, x, y, treasure_type="gold"):
        self.x, self.y = x, y
        self.type = treasure_type
        self.collected = False
        self.rotation = 0
        self.size = CELL_SIZE - 6
        
        if treasure_type == "gold":
            self.color = YELLOW
            self.value = 100
            self.symbol = "G"
        elif treasure_type == "silver":
            self.color = LIGHT_GRAY
            self.value = 50
            self.symbol = "S"
        else:  # gem
            self.color = CYAN
            self.value = 200
            self.symbol = "B"
        
    def draw(self, screen):
        """绘制宝藏"""
        if self.collected:
            return
            
        x = OFFSET_X + self.x * CELL_SIZE + CELL_SIZE // 2
        y = OFFSET_Y + self.y * CELL_SIZE + CELL_SIZE // 2
        
        pygame.draw.circle(screen, self.color, (x, y), self.size // 2)
        
        self.rotation = (self.rotation + 2) % 360
        
        for i in range(8):
            angle = (self.rotation + i * 45) * 3.14159 / 180
            px1 = x + (self.size // 2) * 0.7
            py1 = y + (self.size // 2) * 0.7
            px2 = x + (self.size // 2 + 5) * 0.7
            py2 = y + (self.size // 2 + 5) * 0.7
            
            if i % 2 == 0:
                pygame.draw.line(screen, YELLOW, (int(px1), int(py1)), (int(px2), int(py2)), 2)
        
        symbol_font = pygame.font.Font(None, 20)
        symbol_surface = symbol_font.render(self.symbol, True, BLACK)
        symbol_rect = symbol_surface.get_rect(center=(x, y))
        screen.blit(symbol_surface, symbol_rect)
    
    def collides_with(self, player_x, player_y):
        """检查是否与玩家碰撞"""
        return not self.collected and self.x == player_x and self.y == player_y
    
    def collect(self):
        """收集宝藏"""
        if not self.collected:
            self.collected = True
            return self.value
        return 0

class Game:
    """游戏主类"""
    def __init__(self):
        self.maze = None
        self.player = None
        self.enemies = []
        self.treasures = []
        self.level = 1
        self.total_treasures = 0
        self.score = 0
        self.game_state = "start"
        self.start_time = pygame.time.get_ticks()
        self.level_time_limit = 180  # 增加到180秒，让玩家有更多时间
        
        self.init_level()
    
    def init_level(self):
        """初始化关卡"""
        self.maze = Maze(MAZE_WIDTH, MAZE_HEIGHT)
        self.player = Player(self.maze)
        self.enemies = []
        self.treasures = []
        
        self.total_treasures = 3 + self.level  # 减少宝藏数量
        for _ in range(self.total_treasures):
            while True:
                x = random.randint(0, self.maze.width - 1)
                y = random.randint(0, self.maze.height - 1)
                
                if self.maze.can_move(x, y) and (x, y) != self.maze.start and (x, y) != self.maze.end:
                    if not any(t.x == x and t.y == y for t in self.treasures):
                        treasure_type = random.choice(["gold", "silver", "gem"])
                        self.treasures.append(Treasure(x, y, treasure_type))
                        break
        
        enemy_count = min(2 + self.level, 6)  # 减少敌人数量
        for _ in range(enemy_count):
            while True:
                x = random.randint(0, self.maze.width - 1)
                y = random.randint(0, self.maze.height - 1)
                
                if self.maze.can_move(x, y) and (x, y) != self.maze.start and (x, y) != self.maze.end:
                    if not any(t.x == x and t.y == y and not t.collected for t in self.treasures):
                        enemy_type = random.choice([1, 2, 3])
                        self.enemies.append(Enemy(self.maze, x, y, enemy_type))
                        break
        
        self.start_time = pygame.time.get_ticks()
    
    def update(self):
        """更新游戏状态"""
        if self.game_state != "playing":
            return
        
        self.player.update()
        
        for enemy in self.enemies:
            enemy.update(self.player.x, self.player.y)
            
            if enemy.collides_with(self.player.x, self.player.y):
                if self.player.take_damage(enemy.damage):
                    if self.player.health <= 0:
                        self.game_state = "game_over"
                        game_over_sound.play()
        
        for treasure in self.treasures:
            if treasure.collides_with(self.player.x, self.player.y):
                value = treasure.collect()
                self.player.collect_treasure(value)
                self.score += value
        
        if self.player.is_at_exit():
            if self.player.treasures >= self.total_treasures * 0.6:  # 降低到60%
                if self.level >= 5:
                    self.game_state = "victory"
                    victory_sound.play()
                else:
                    self.game_state = "level_complete"
                    victory_sound.play()
        
        elapsed_time = (pygame.time.get_ticks() - self.start_time) // 1000
        if elapsed_time >= self.level_time_limit:
            self.game_state = "game_over"
            game_over_sound.play()
    
    def draw(self, screen):
        """绘制游戏"""
        screen.fill((30, 30, 50))
        
        title_text = font_medium.render(f"迷宫探险 - 第 {self.level} 关", True, YELLOW)
        screen.blit(title_text, (WIDTH // 2 - 100, 10))
        
        self.maze.draw(screen)
        
        for treasure in self.treasures:
            treasure.draw(screen)
        
        for enemy in self.enemies:
            enemy.draw(screen)
        
        self.player.draw(screen)
        
        self.draw_hud(screen)
        
        if self.game_state == "start":
            self.draw_start_screen(screen)
        elif self.game_state == "level_complete":
            self.draw_level_complete_screen(screen)
        elif self.game_state == "game_over":
            self.draw_game_over_screen(screen)
        elif self.game_state == "victory":
            self.draw_victory_screen(screen)
    
    def draw_hud(self, screen):
        """绘制游戏信息界面"""
        elapsed_time = (pygame.time.get_ticks() - self.start_time) // 1000
        time_left = max(0, self.level_time_limit - elapsed_time)
        
        score_text = font_small.render(f"分数: {self.score}", True, WHITE)
        screen.blit(score_text, (20, 20))
        
        treasure_text = font_small.render(f"宝藏: {self.player.treasures}/{self.total_treasures}", True, YELLOW)
        screen.blit(treasure_text, (20, 50))
        
        steps_text = font_small.render(f"步数: {self.player.steps}", True, WHITE)
        screen.blit(steps_text, (20, 80))
        
        health_text = font_small.render(f"血量: {self.player.health}", True, 
                                       GREEN if self.player.health > 50 else YELLOW if self.player.health > 20 else RED)
        screen.blit(health_text, (20, 110))
        
        health_bar_width = 200
        health_bar_height = 20
        health_percent = self.player.health / 100
        
        pygame.draw.rect(screen, DARK_GRAY, (20, 140, health_bar_width, health_bar_height))
        pygame.draw.rect(screen, 
                        GREEN if health_percent > 0.5 else YELLOW if health_percent > 0.2 else RED,
                        (22, 142, int((health_bar_width - 4) * health_percent), health_bar_height - 4))
        
        time_text = font_small.render(f"时间: {time_left}秒", True, 
                                     GREEN if time_left > 60 else YELLOW if time_left > 20 else RED)
        screen.blit(time_text, (WIDTH - 150, 20))
        
        time_bar_width = 200
        time_bar_height = 20
        time_percent = time_left / self.level_time_limit
        
        pygame.draw.rect(screen, DARK_GRAY, (WIDTH - 220, 50, time_bar_width, time_bar_height))
        pygame.draw.rect(screen, 
                        GREEN if time_percent > 0.3 else YELLOW if time_percent > 0.1 else RED,
                        (WIDTH - 218, 52, int((time_bar_width - 4) * time_percent), time_bar_height - 4))
        
        controls = [
            "控制: 方向键或WASD移动",
            "H: 显示/隐藏路径",
            "R: 重新开始关卡",
            "ESC: 返回主菜单"
        ]
        
        for i, control in enumerate(controls):
            control_text = font_tiny.render(control, True, LIGHT_GRAY)
            screen.blit(control_text, (WIDTH - 200, 100 + i * 25))
        
        if self.player.treasures < self.total_treasures * 0.6:
            target_text = font_tiny.render(f"需要收集至少{int(self.total_treasures * 0.6)}个宝藏", True, YELLOW)
            screen.blit(target_text, (WIDTH // 2 - 100, HEIGHT - 40))
        
        # 显示移动速度提示
        speed_text = font_tiny.render(f"玩家移动延迟: {PLAYER_MOVE_DELAY}帧", True, CYAN)
        screen.blit(speed_text, (WIDTH - 200, HEIGHT - 50))
    
    def draw_start_screen(self, screen):
        """绘制开始画面"""
        overlay = pygame.Surface((WIDTH, HEIGHT), pygame.SRCALPHA)
        overlay.fill((0, 0, 0, 200))
        screen.blit(overlay, (0, 0))
        
        title_text = font_large.render("迷宫探险", True, YELLOW)
        screen.blit(title_text, (WIDTH // 2 - 100, HEIGHT // 2 - 150))
        
        subtitle_text = font_medium.render("寻宝之旅", True, CYAN)
        screen.blit(subtitle_text, (WIDTH // 2 - 60, HEIGHT // 2 - 100))
        
        instructions = [
            "游戏目标: 找到迷宫出口并收集宝藏",
            "",
            "控制说明:",
            "方向键或WASD: 移动（有移动延迟）",
            "H键: 显示/隐藏解决方案路径",
            "R键: 重新开始当前关卡",
            "ESC键: 返回主菜单",
            "",
            "游戏元素:",
            "蓝色圆圈: 玩家 - 控制角色在迷宫中移动",
            "红色/紫色/橙色圆圈: 敌人 - 碰到会减少血量",
            "金色/银色/蓝色圆圈: 宝藏 - 收集获得分数",
            "绿色方块: 起点 - 从这里开始",
            "红色方块: 终点 - 到达这里完成关卡",
            "",
            "游戏调整:",
            "✓ 已降低玩家和敌人的移动速度",
            "✓ 增加了游戏时间（每关180秒）",
            "✓ 减少了迷宫大小和敌人数量",
            "✓ 降低了过关所需的宝藏收集比例",
            "",
            "提示: 时间充足，但也要注意敌人的追击!"
        ]
        
        for i, instruction in enumerate(instructions):
            color = YELLOW if i == 0 else WHITE
            instruction_text = font_tiny.render(instruction, True, color)
            screen.blit(instruction_text, (WIDTH // 2 - 250, HEIGHT // 2 - 80 + i * 20))
        
        start_text = font_medium.render("按空格键开始游戏", True, GREEN)
        screen.blit(start_text, (WIDTH // 2 - 100, HEIGHT - 100))
    
    def draw_level_complete_screen(self, screen):
        """绘制关卡完成画面"""
        overlay = pygame.Surface((WIDTH, HEIGHT), pygame.SRCALPHA)
        overlay.fill((0, 0, 0, 200))
        screen.blit(overlay, (0, 0))
        
        level_text = font_large.render(f"第 {self.level} 关完成!", True, GREEN)
        screen.blit(level_text, (WIDTH // 2 - 100, HEIGHT // 2 - 100))
        
        elapsed_time = (pygame.time.get_ticks() - self.start_time) // 1000
        time_bonus = max(0, self.level_time_limit - elapsed_time) * 10
        
        stats = [
            f"收集宝藏: {self.player.treasures}/{self.total_treasures}",
            f"使用步数: {self.player.steps}",
            f"当前分数: {self.score}",
            f"时间奖励: +{time_bonus}分",
            f"剩余血量: {self.player.health}%"
        ]
        
        for i, stat in enumerate(stats):
            stat_text = font_medium.render(stat, True, WHITE)
            screen.blit(stat_text, (WIDTH // 2 - 100, HEIGHT // 2 - 50 + i * 40))
        
        if self.level < 5:
            next_text = font_medium.render("按空格键进入下一关", True, YELLOW)
            screen.blit(next_text, (WIDTH // 2 - 120, HEIGHT // 2 + 120))
        else:
            next_text = font_medium.render("按空格键查看最终胜利", True, YELLOW)
            screen.blit(next_text, (WIDTH // 2 - 120, HEIGHT // 2 + 120))
        
        menu_text = font_small.render("按ESC键返回主菜单", True, LIGHT_GRAY)
        screen.blit(menu_text, (WIDTH // 2 - 100, HEIGHT // 2 + 170))
    
    def draw_game_over_screen(self, screen):
        """绘制游戏结束画面"""
        overlay = pygame.Surface((WIDTH, HEIGHT), pygame.SRCALPHA)
        overlay.fill((0, 0, 0, 200))
        screen.blit(overlay, (0, 0))
        
        game_over_text = font_large.render("游戏结束!", True, RED)
        screen.blit(game_over_text, (WIDTH // 2 - 100, HEIGHT // 2 - 100))
        
        stats = [
            f"到达关卡: {self.level}",
            f"最终分数: {self.score}",
            f"收集宝藏: {self.player.treasures}",
            f"总步数: {self.player.steps}"
        ]
        
        for i, stat in enumerate(stats):
            stat_text = font_medium.render(stat, True, WHITE)
            screen.blit(stat_text, (WIDTH // 2 - 100, HEIGHT // 2 - 50 + i * 40))
        
        restart_text = font_medium.render("按R键重新开始本关", True, GREEN)
        screen.blit(restart_text, (WIDTH // 2 - 100, HEIGHT // 2 + 100))
        
        menu_text = font_medium.render("按ESC键返回主菜单", True, YELLOW)
        screen.blit(menu_text, (WIDTH // 2 - 100, HEIGHT // 2 + 150))
    
    def draw_victory_screen(self, screen):
        """绘制胜利画面"""
        overlay = pygame.Surface((WIDTH, HEIGHT), pygame.SRCALPHA)
        overlay.fill((0, 0, 0, 200))
        screen.blit(overlay, (0, 0))
        
        victory_text = font_large.render("恭喜通关!", True, YELLOW)
        screen.blit(victory_text, (WIDTH // 2 - 100, HEIGHT // 2 - 150))
        
        complete_text = font_medium.render("你成功完成了所有迷宫挑战!", True, GREEN)
        screen.blit(complete_text, (WIDTH // 2 - 150, HEIGHT // 2 - 100))
        
        elapsed_time = (pygame.time.get_ticks() - self.start_time) // 1000
        time_bonus = max(0, self.level_time_limit - elapsed_time) * 10
        
        stats = [
            f"最终分数: {self.score + time_bonus}",
            f"总收集宝藏: {self.player.treasures}",
            f"总步数: {self.player.steps}",
            f"通关时间: {elapsed_time}秒",
            f"时间奖励: +{time_bonus}分"
        ]
        
        for i, stat in enumerate(stats):
            stat_text = font_medium.render(stat, True, WHITE)
            screen.blit(stat_text, (WIDTH // 2 - 100, HEIGHT // 2 - 50 + i * 40))
        
        restart_text = font_medium.render("按R键重新开始游戏", True, GREEN)
        screen.blit(restart_text, (WIDTH // 2 - 100, HEIGHT // 2 + 120))
        
        menu_text = font_medium.render("按ESC键返回主菜单", True, YELLOW)
        screen.blit(menu_text, (WIDTH // 2 - 100, HEIGHT // 2 + 170))
    
    def next_level(self):
        """进入下一关"""
        elapsed_time = (pygame.time.get_ticks() - self.start_time) // 1000
        time_bonus = max(0, self.level_time_limit - elapsed_time) * 10
        self.score += time_bonus
        
        self.level += 1
        if self.level > 5:
            self.game_state = "victory"
        else:
            self.init_level()
            self.game_state = "playing"
    
    def restart_level(self):
        """重新开始当前关卡"""
        self.init_level()
        self.game_state = "playing"
    
    def restart_game(self):
        """重新开始游戏"""
        self.level = 1
        self.score = 0
        self.init_level()
        self.game_state = "playing"

def main():
    """主游戏函数"""
    clock = pygame.time.Clock()
    game = Game()
    
    running = True
    while running:
        clock.tick(60)
        
        for event in pygame.event.get():
            if event.type == QUIT:
                running = False
            elif event.type == KEYDOWN:
                if event.key == K_ESCAPE:
                    if game.game_state in ["playing", "level_complete", "game_over", "victory"]:
                        game.game_state = "start"
                    else:
                        running = False
                elif event.key == K_SPACE:
                    if game.game_state == "start":
                        game.game_state = "playing"
                    elif game.game_state == "level_complete":
                        game.next_level()
                    elif game.game_state == "victory":
                        game.restart_game()
                elif event.key == K_r:
                    if game.game_state in ["playing", "game_over", "victory"]:
                        game.restart_level()
                elif event.key == K_h:
                    game.maze.show_path = not game.maze.show_path
                elif event.key == K_EQUALS or event.key == K_PLUS:  # + 键增加玩家速度
                    global PLAYER_MOVE_DELAY
                    if PLAYER_MOVE_DELAY > 5:
                        PLAYER_MOVE_DELAY -= 2
                elif event.key == K_MINUS:  # - 键降低玩家速度
                    if PLAYER_MOVE_DELAY < 50:
                        PLAYER_MOVE_DELAY += 2
        
        keys = pygame.key.get_pressed()
        
        if game.game_state == "playing":
            moved = False
            if keys[K_UP] or keys[K_w]:
                moved = game.player.move(0, -1)
            if keys[K_DOWN] or keys[K_s]:
                moved = game.player.move(0, 1)
            if keys[K_LEFT] or keys[K_a]:
                moved = game.player.move(-1, 0)
            if keys[K_RIGHT] or keys[K_d]:
                moved = game.player.move(1, 0)
            
            if moved:
                game.update()
        
        if game.game_state == "playing":
            game.update()
        
        game.draw(screen)
        
        pygame.display.flip()
    
    pygame.quit()
    sys.exit()

if __name__ == "__main__":
    main()