import tkinter as tk
import random

CELL = 25          # 格子大小
ROWS, COLS = 21, 21  # 必须是奇数（迷宫算法要求）

class MazeGame:
    def __init__(self, root):
        self.root = root
        self.root.title("006. 迷宫游戏")
        self.root.resizable(False, False)

        self.canvas = tk.Canvas(
            root,
            width=COLS * CELL,
            height=ROWS * CELL,
            bg="white"
        )
        self.canvas.pack()

        self.maze = [[1 for _ in range(COLS)] for _ in range(ROWS)]
        self.player = [1, 1]
        self.end = [ROWS - 2, COLS - 2]

        self.generate_maze(1, 1)
        self.draw_maze()
        self.draw_player()

        self.root.bind("<Up>", lambda e: self.move(-1, 0))
        self.root.bind("<Down>", lambda e: self.move(1, 0))
        self.root.bind("<Left>", lambda e: self.move(0, -1))
        self.root.bind("<Right>", lambda e: self.move(0, 1))

    # ---------- 递归回溯生成迷宫 ----------
    def generate_maze(self, r, c):
        self.maze[r][c] = 0
        dirs = [(2, 0), (-2, 0), (0, 2), (0, -2)]
        random.shuffle(dirs)

        for dr, dc in dirs:
            nr, nc = r + dr, c + dc
            if 1 <= nr < ROWS - 1 and 1 <= nc < COLS - 1 and self.maze[nr][nc] == 1:
                self.maze[r + dr // 2][c + dc // 2] = 0
                self.generate_maze(nr, nc)

    # ---------- 画迷宫 ----------
    def draw_maze(self):
        self.canvas.delete("all")
        for r in range(ROWS):
            for c in range(COLS):
                x1 = c * CELL
                y1 = r * CELL
                x2 = x1 + CELL
                y2 = y1 + CELL

                if self.maze[r][c] == 1:
                    self.canvas.create_rectangle(
                        x1, y1, x2, y2, fill="black", outline="gray"
                    )

        # 终点
        er, ec = self.end
        self.canvas.create_rectangle(
            ec * CELL, er * CELL,
            ec * CELL + CELL,
            er * CELL + CELL,
            fill="red"
        )

    # ---------- 画玩家 ----------
    def draw_player(self):
        r, c = self.player
        self.canvas.create_oval(
            c * CELL + 4, r * CELL + 4,
            c * CELL + CELL - 4,
            r * CELL + CELL - 4,
            fill="lime", tag="player"
        )

    # ---------- 移动 ----------
    def move(self, dr, dc):
        nr = self.player[0] + dr
        nc = self.player[1] + dc

        if 0 <= nr < ROWS and 0 <= nc < COLS and self.maze[nr][nc] == 0:
            self.player = [nr, nc]
            self.canvas.delete("player")
            self.draw_player()

            if self.player == self.end:
                self.win()

    # ---------- 胜利 ----------
    def win(self):
        win = tk.Toplevel(self.root)
        win.title("胜利")
        win.resizable(False, False)
        tk.Label(
            win,
            text="🎉 恭喜你走出迷宫！",
            font=("微软雅黑", 14),
            padx=30, pady=20
        ).pack()
        tk.Button(
            win, text="再来一局",
            command=lambda: [win.destroy(), self.restart()]
        ).pack(pady=5)
        tk.Button(
            win, text="退出",
            command=self.root.quit
        ).pack(pady=5)

    # ---------- 重开 ----------
    def restart(self):
        self.maze = [[1 for _ in range(COLS)] for _ in range(ROWS)]
        self.player = [1, 1]
        self.end = [ROWS - 2, COLS - 2]
        self.generate_maze(1, 1)
        self.draw_maze()
        self.draw_player()

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