import pygame
import random
import sys

# ===================== 配置参数 =====================
CELL_SIZE = 30      # 每个格子像素大小
MAZE_WIDTH = 21     # 迷宫列数（奇数更好看）
MAZE_HEIGHT = 15    # 迷宫行数（奇数更好看）
WALL_COLOR = (0, 0, 0)       # 墙黑色
PATH_COLOR = (255, 255, 255) # 通道白色
PLAYER_COLOR = (0, 100, 255) # 玩家蓝色
END_COLOR = (255, 30, 30)    # 终点红色
TEXT_COLOR = (255, 255, 0)   # 文字黄色

# 窗口尺寸
WIN_WIDTH = CELL_SIZE * MAZE_WIDTH
WIN_HEIGHT = CELL_SIZE * MAZE_HEIGHT

# ===================== 迷宫生成：深度优先DFS =====================
def generate_maze(w, h):
    # 初始化全墙 1=墙 0=通路
    maze = [[1 for _ in range(w)] for _ in range(h)]
    # 起始点(1,1)
    stack = [(1, 1)]
    maze[1][1] = 0
    # 四个移动方向 上下左右
    dirs = [(-2, 0), (2, 0), (0, -2), (0, 2)]
    
    while stack:
        x, y = stack[-1]
        random.shuffle(dirs)
        found = False
        for dx, dy in dirs:
            nx = x + dx
            ny = y + dy
            if 0 < nx < w-1 and 0 < ny < h-1 and maze[ny][nx] == 1:
                # 打通中间墙壁
                maze[y + dy//2][x + dx//2] = 0
                maze[ny][nx] = 0
                stack.append((nx, ny))
                found = True
                break
        if not found:
            stack.pop()
    return maze

# ===================== 游戏主类 =====================
class MazeGame:
    def __init__(self):
        pygame.init()
        self.screen = pygame.display.set_mode((WIN_WIDTH, WIN_HEIGHT))
        pygame.display.set_caption("Pygame迷宫小游戏")
        self.clock = pygame.time.Clock()
        # 修复字体报错，改用Font代替SysFont
        try:
            self.font = pygame.font.Font(None, 40)
        except:
            self.font = None
        
        # 生成迷宫
        self.maze = generate_maze(MAZE_WIDTH, MAZE_HEIGHT)
        # 玩家初始位置(1,1)
        self.player_x = 1
        self.player_y = 1
        # 终点位置(倒数第二列，倒数第二行)
        self.end_x = MAZE_WIDTH - 2
        self.end_y = MAZE_HEIGHT - 2
        self.win_flag = False

    # 绘制整个迷宫界面
    def draw(self):
        self.screen.fill(WALL_COLOR)
        # 画迷宫格子
        for y in range(MAZE_HEIGHT):
            for x in range(MAZE_WIDTH):
                rect = pygame.Rect(x*CELL_SIZE, y*CELL_SIZE, CELL_SIZE-1, CELL_SIZE-1)
                if self.maze[y][x] == 0:
                    pygame.draw.rect(self.screen, PATH_COLOR, rect)
        # 画终点
        end_rect = pygame.Rect(self.end_x*CELL_SIZE, self.end_y*CELL_SIZE, CELL_SIZE-1, CELL_SIZE-1)
        pygame.draw.rect(self.screen, END_COLOR, end_rect)
        # 画玩家
        player_rect = pygame.Rect(self.player_x*CELL_SIZE, self.player_y*CELL_SIZE, CELL_SIZE-1, CELL_SIZE-1)
        pygame.draw.rect(self.screen, PLAYER_COLOR, player_rect)
        # 通关文字，增加字体判空
        if self.win_flag and self.font is not None:
            text = self.font.render("恭喜通关！", True, TEXT_COLOR)
            self.screen.blit(text, (WIN_WIDTH//2 - 80, WIN_HEIGHT//2))

    # 移动玩家，碰撞墙壁检测
    def move_player(self, dx, dy):
        if self.win_flag:
            return
        new_x = self.player_x + dx
        new_y = self.player_y + dy
        # 不撞墙才移动
        if self.maze[new_y][new_x] == 0:
            self.player_x = new_x
            self.player_y = new_y
        # 判断到达终点
        if self.player_x == self.end_x and self.player_y == self.end_y:
            self.win_flag = True

    # 游戏主循环
    def run(self):
        while True:
            # 事件监听
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    pygame.quit()
                    sys.exit()
                # 键盘按下
                if event.type == pygame.KEYDOWN:
                    if event.key == pygame.K_UP:
                        self.move_player(0, -1)
                    elif event.key == pygame.K_DOWN:
                        self.move_player(0, 1)
                    elif event.key == pygame.K_LEFT:
                        self.move_player(-1, 0)
                    elif event.key == pygame.K_RIGHT:
                        self.move_player(1, 0)
                    # 按R重新生成迷宫
                    elif event.key == pygame.K_r:
                        self.maze = generate_maze(MAZE_WIDTH, MAZE_HEIGHT)
                        self.player_x, self.player_y = 1, 1
                        self.win_flag = False
            # 绘制画面
            self.draw()
            pygame.display.flip()
            self.clock.tick(60)

# 启动游戏
if __name__ == "__main__":
    game = MazeGame()
    game.run()