import tkinter as tk
from tkinter import messagebox
import random

CELL_SIZE = 30   # 每个格子像素大小
MAZE_W = 21      # 迷宫宽度（格子数，奇数）
MAZE_H = 21      # 迷宫高度（格子数，奇数）

class MazeGame:
    def __init__(self, root):
        self.root = root
        self.root.title("迷宫小游戏")
        # 创建画布
        self.canvas = tk.Canvas(root, width=MAZE_W*CELL_SIZE, height=MAZE_H*CELL_SIZE, bg="white")
        self.canvas.pack(padx=10, pady=10)

        self.maze = []
        self.player_x = 1
        self.player_y = 1
        self.end_x = MAZE_W - 2
        self.end_y = MAZE_H - 2

        self.generate_maze()
        self.draw_all()
        # 监听键盘方向键
        self.root.bind("<KeyPress>", self.on_key)

    # DFS深度优先 随机生成迷宫
    def generate_maze(self):
        # 全部初始化为墙：1=墙，0=通路
        self.maze = [[1 for _ in range(MAZE_W)] for _ in range(MAZE_H)]
        stack = []
        x, y = 1, 1
        self.maze[y][x] = 0
        stack.append((x, y))
        dirs = [(-2, 0), (2, 0), (0, -2), (0, 2)]

        while stack:
            cx, cy = stack[-1]
            random.shuffle(dirs)
            has_next = False
            for dx, dy in dirs:
                nx = cx + dx
                ny = cy + dy
                if 0 < nx < MAZE_W-1 and 0 < ny < MAZE_H-1 and self.maze[ny][nx] == 1:
                    self.maze[ny][nx] = 0
                    self.maze[cy + dy//2][cx + dx//2] = 0
                    stack.append((nx, ny))
                    has_next = True
                    break
            if not has_next:
                stack.pop()

    def draw_all(self):
        self.canvas.delete("all")
        # 绘制迷宫墙体
        for y in range(MAZE_H):
            for x in range(MAZE_W):
                if self.maze[y][x] == 1:
                    self.canvas.create_rectangle(
                        x*CELL_SIZE, y*CELL_SIZE,
                        (x+1)*CELL_SIZE, (y+1)*CELL_SIZE,
                        fill="#222222"
                    )
        # 终点（绿色方块）
        self.canvas.create_rectangle(
            self.end_x*CELL_SIZE, self.end_y*CELL_SIZE,
            (self.end_x+1)*CELL_SIZE, (self.end_y+1)*CELL_SIZE,
            fill="#39c5bb"
        )
        # 玩家（红色方块）
        self.player = self.canvas.create_rectangle(
            self.player_x*CELL_SIZE+3, self.player_y*CELL_SIZE+3,
            (self.player_x+1)*CELL_SIZE-3, (self.player_y+1)*CELL_SIZE-3,
            fill="#ff5555"
        )

    def on_key(self, event):
        dx, dy = 0, 0
        if event.keysym == "Up":
            dy = -1
        elif event.keysym == "Down":
            dy = 1
        elif event.keysym == "Left":
            dx = -1
        elif event.keysym == "Right":
            dx = 1
        else:
            return

        nx = self.player_x + dx
        ny = self.player_y + dy
        # 检测是否不是墙
        if 0 <= nx < MAZE_W and 0 <= ny < MAZE_H and self.maze[ny][nx] == 0:
            self.player_x = nx
            self.player_y = ny
            self.canvas.move(self.player, dx*CELL_SIZE, dy*CELL_SIZE)
            # 判断到达终点
            if self.player_x == self.end_x and self.player_y == self.end_y:
                messagebox.showinfo("🎉恭喜", "成功通关！即将生成新迷宫")
                # 重置迷宫和玩家位置
                self.generate_maze()
                self.player_x = 1
                self.player_y = 1
                self.draw_all()

if __name__ == "__main__":
    window = tk.Tk()
    game = MazeGame(window)
    window.mainloop()
