import tkinter as tk
import random

# 迷宫基础配置
CELL_SIZE = 35    # 每个格子像素大小
MAZE_W = 25       # 迷宫列数
MAZE_H = 20       # 迷宫行数

class MazeGame:
    def __init__(self, root):
        self.root = root
        self.root.title("迷宫闯关小游戏")
        # 画布
        self.canvas = tk.Canvas(root, bg="#f0f0f0")
        self.canvas.pack(padx=10, pady=10)
        # 信息标签
        self.info = tk.Label(root, text="方向键 ↑ ↓ ← → 移动，R重新开局", font=("微软雅黑",12))
        self.info.pack(pady=5)

        # 迷宫数组 1=墙 0=通路
        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("<Up>", self.move_up)
        self.root.bind("<Down>", self.move_down)
        self.root.bind("<Left>", self.move_left)
        self.root.bind("<Right>", self.move_right)
        self.root.bind("r", self.restart)
        self.root.bind("R", self.restart)

    # 深度优先随机生成迷宫
    def generate_maze(self):
        # 初始化全墙
        self.maze = [[1 for _ in range(MAZE_W)] for _ in range(MAZE_H)]
        stack = []
        start_x, start_y = 1, 1
        self.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)
            has_next = False
            for dx, dy in dirs:
                nx = x + dx
                ny = y + dy
                if 0 < nx < MAZE_W-1 and 0 < ny < MAZE_H-1 and self.maze[ny][nx] == 1:
                    # 打通中间墙
                    self.maze[y + dy//2][x + dx//2] = 0
                    self.maze[ny][nx] = 0
                    stack.append((nx, ny))
                    has_next = True
                    break
            if not has_next:
                stack.pop()
        # 起点终点
        self.player_x, self.player_y = 1, 1
        self.end_x, self.end_y = MAZE_W-2, MAZE_H-2

    # 绘制迷宫、玩家、终点
    def draw_all(self):
        self.canvas.delete(tk.ALL)
        # 画墙壁
        for y in range(MAZE_H):
            for x in range(MAZE_W):
                x1 = x * CELL_SIZE
                y1 = y * CELL_SIZE
                x2 = x1 + CELL_SIZE
                y2 = y1 + CELL_SIZE
                if self.maze[y][x] == 1:
                    self.canvas.create_rectangle(x1, y1, x2, y2, fill="#333333")
                else:
                    self.canvas.create_rectangle(x1, y1, x2, y2, outline="#dddddd")
        # 画出口（绿色）
        ex1 = self.end_x * CELL_SIZE
        ey1 = self.end_y * CELL_SIZE
        ex2 = ex1 + CELL_SIZE
        ey2 = ey1 + CELL_SIZE
        self.canvas.create_rectangle(ex1, ey1, ex2, ey2, fill="#4cd964")
        # 画玩家（红色小圆）
        px = self.player_x * CELL_SIZE + CELL_SIZE//2
        py = self.player_y * CELL_SIZE + CELL_SIZE//2
        r = CELL_SIZE // 3
        self.player = self.canvas.create_oval(px-r, py-r, px+r, py+r, fill="#ff3b30")

    # 更新玩家位置
    def update_player(self):
        px = self.player_x * CELL_SIZE + CELL_SIZE//2
        py = self.player_y * CELL_SIZE + CELL_SIZE//2
        r = CELL_SIZE // 3
        self.canvas.coords(self.player, px-r, py-r, px+r, py+r)
        # 判断是否到达终点
        if self.player_x == self.end_x and self.player_y == self.end_y:
            self.info.config(text="🎉恭喜通关！按R重新开始")

    # 上下左右移动
    def move_up(self, event):
        ny = self.player_y - 1
        if self.maze[ny][self.player_x] == 0:
            self.player_y = ny
            self.update_player()
    def move_down(self, event):
        ny = self.player_y + 1
        if self.maze[ny][self.player_x] == 0:
            self.player_y = ny
            self.update_player()
    def move_left(self, event):
        nx = self.player_x - 1
        if self.maze[self.player_y][nx] == 0:
            self.player_x = nx
            self.update_player()
    def move_right(self, event):
        nx = self.player_x + 1
        if self.maze[self.player_y][nx] == 0:
            self.player_x = nx
            self.update_player()

    # 重新生成迷宫
    def restart(self, event):
        self.info.config(text="方向键 ↑ ↓ ← → 移动，R重新开局")
        self.generate_maze()
        self.draw_all()

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