import pygame
import random

# 初始化pygame
pygame.init()

# 迷宫设置
CELL_SIZE = 30
MAZE_WIDTH = 21   # 必须奇数
MAZE_HEIGHT = 15  # 必须奇数
WINDOW_W = CELL_SIZE * MAZE_WIDTH
WINDOW_H = CELL_SIZE * MAZE_HEIGHT

# 颜色定义
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
GREEN = (0, 220, 0)
RED = (220, 0, 0)
BLUE = (0, 100, 255)

screen = pygame.display.set_mode((WINDOW_W, WINDOW_H))
pygame.display.set_caption("迷宫小游戏")
clock = pygame.time.Clock()

# 深度优先随机生成迷宫
def create_maze(w, h):
    maze = [[1 for _ in range(w)] for _ in range(h)]
    stack = []
    start_x, start_y = 1, 1
    maze[start_y][start_x] = 0
    stack.append((start_x, start_y))
    dirs = [(0, -2), (0, 2), (-2, 0), (2, 0)]
    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

# 绘制迷宫
def draw_maze(maze, player_x, player_y, end_x, end_y):
    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 maze[y][x] == 1:
                pygame.draw.rect(screen, BLACK, rect)
            else:
                pygame.draw.rect(screen, WHITE, rect)
    # 起点
    pygame.draw.rect(screen, GREEN, pygame.Rect(1*CELL_SIZE,1*CELL_SIZE,CELL_SIZE-1,CELL_SIZE-1))
    # 终点
    pygame.draw.rect(screen, RED, pygame.Rect(end_x*CELL_SIZE,end_y*CELL_SIZE,CELL_SIZE-1,CELL_SIZE-1))
    # 玩家
    pygame.draw.circle(screen, BLUE, (player_x*CELL_SIZE+CELL_SIZE//2, player_y*CELL_SIZE+CELL_SIZE//2), CELL_SIZE//2-3)

def main():
    maze = create_maze(MAZE_WIDTH, MAZE_HEIGHT)
    px, py = 1, 1
    ex, ey = MAZE_WIDTH-2, MAZE_HEIGHT-2
    game_win = False
    font = pygame.font.SysFont("simhei", 40)

    running = True
    while running:
        screen.fill((30,30,30))
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_r:
                    # 重置迷宫
                    maze = create_maze(MAZE_WIDTH, MAZE_HEIGHT)
                    px, py = 1, 1
                    game_win = False
                if not game_win:
                    nx, ny = px, py
                    if event.key == pygame.K_UP: ny -=1
                    elif event.key == pygame.K_DOWN: ny +=1
                    elif event.key == pygame.K_LEFT: nx -=1
                    elif event.key == pygame.K_RIGHT: nx +=1
                    # 判断不是墙才能移动
                    if maze[ny][nx] == 0:
                        px, py = nx, ny
                    # 到达终点
                    if px == ex and py == ey:
                        game_win = True

        draw_maze(maze, px, py, ex, ey)
        if game_win:
            text = font.render("恭喜通关！按R重新开始", True, (255,255,0))
            screen.blit(text, (WINDOW_W//2-text.get_width()//2, WINDOW_H//2))

        pygame.display.flip()
        clock.tick(60)
    pygame.quit()

if __name__ == "__main__":
    main()
