import tkinter as tk
import random

# 迷宫设置
CELL_SIZE = 30    # 格子像素
MAZE_W = 20       # 迷宫宽度（列）
MAZE_H = 15       # 迷宫高度（行）

class MazeGame:
    def __init__(self, root):
        self.root = root
        self.root.title("Tkinter迷宫游戏")
        # 画布
        self.canvas = tk.Canvas(root, width=MAZE_W*CELL_SIZE, height=MAZE_H*CELL_SIZE, bg="white")
        self.canvas.pack()
        
        # 迷宫数组 1=墙 0=通路
        self.maze = [[1 for _ in range(MAZE_W)] for _ in range(MAZE_H)]
        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)
        self.root.bind("<Down>", self.move)
        self.root.bind("<Left>", self.move)
        self.root.bind("<Right>", self.move)

    # 深度优先随机生成迷宫
    def generate_maze(self):
        stack = []
        start_x, start_y = 1, 1
        self.maze[start_y][start_x] = 0
        stack.append((start_x, start_y))
        
        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 < 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))
                    found = True
                    break
            if not found:
                stack.pop()

    # 绘制所有元素（修复fill_rect错误）
    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="#333333"
                    )
        # 终点绿色方块
        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="#4cd964"
        )
        # 玩家红色小圆
        self.player = self.canvas.create_oval(
            self.player_x*CELL_SIZE+4, self.player_y*CELL_SIZE+4,
            (self.player_x+1)*CELL_SIZE-4, (self.player_y+1)*CELL_SIZE-4,
            fill="#ff3b30"
        )

    # 玩家移动逻辑
    def move(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
        # 下一格坐标
        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.coords(self.player,
                               self.player_x*CELL_SIZE+4, self.player_y*CELL_SIZE+4,
                               (self.player_x+1)*CELL_SIZE-4, (self.player_y+1)*CELL_SIZE-4)
            # 判断到达终点
            if self.player_x == self.end_x and self.player_y == self.end_y:
                self.canvas.create_text(
                    MAZE_W*CELL_SIZE//2, MAZE_H*CELL_SIZE//2,
                    text="恭喜通关！", font=("黑体",30), fill="red"
                )

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