import tkinter as tk
from tkinter import messagebox
import random

# 配置参数
CELL_SIZE = 30  # 每个格子的像素大小
COLS = 20       # 迷宫列数
ROWS = 15       # 迷宫行数

class MazeGame:
    def __init__(self, root):
        self.root = root
        self.root.title("随机迷宫闯关 - 方向键控制")
        
        # 初始化迷宫矩阵 (1代表墙, 0代表路)
        self.maze = [[1] * COLS for _ in range(ROWS)]
        self.visited = [[False] * COLS for _ in range(ROWS)]
        
        # 画布设置
        self.canvas = tk.Canvas(root, width=COLS * CELL_SIZE, height=ROWS * CELL_SIZE, bg="white")
        self.canvas.pack(padx=10, pady=10)
        
        # 玩家位置
        self.player_pos = [1, 1]
        self.end_pos = [ROWS - 2, COLS - 2]
        
        # 初始化
        self.generate_maze(1, 1)
        self.draw_maze()
        
        # 绑定按键
        self.root.bind("<KeyPress>", self.move_player)

    def generate_maze(self, r, c):
        """深度优先搜索生成随机迷宫"""
        self.visited[r][c] = True
        self.maze[r][c] = 0
        
        # 定义四个方向：上、下、左、右 (每次移动两步以跳过墙壁)
        dirs = [(0, 2), (0, -2), (2, 0), (-2, 0)]
        random.shuffle(dirs)
        
        for dr, dc in dirs:
            nr, nc = r + dr, c + dc
            if 0 < nr < ROWS-1 and 0 < nc < COLS-1 and not self.visited[nr][nc]:
                # 打通中间的墙壁
                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):
                if self.maze[r][c] == 1:
                    self.canvas.create_rectangle(
                        c*CELL_SIZE, r*CELL_SIZE, (c+1)*CELL_SIZE, (r+1)*CELL_SIZE, 
                        fill="#2c3e50", outline="#34495e"
                    )
        
        # 绘制终点 (绿色)
        self.canvas.create_rectangle(
            self.end_pos[1]*CELL_SIZE, self.end_pos[0]*CELL_SIZE, 
            (self.end_pos[1]+1)*CELL_SIZE, (self.end_pos[0]+1)*CELL_SIZE, 
            fill="#27ae60", outline=""
        )
        
        # 绘制玩家 (红色圆形)
        self.player_icon = self.canvas.create_oval(
            self.player_pos[1]*CELL_SIZE+5, self.player_pos[0]*CELL_SIZE+5, 
            (self.player_pos[1]+1)*CELL_SIZE-5, (self.player_pos[0]+1)*CELL_SIZE-5, 
            fill="#e74c3c", outline=""
        )

    def move_player(self, event):
        """处理玩家移动逻辑"""
        r, c = self.player_pos
        if event.keysym == "Up":    new_pos = [r - 1, c]
        elif event.keysym == "Down":  new_pos = [r + 1, c]
        elif event.keysym == "Left":  new_pos = [r, c - 1]
        elif event.keysym == "Right": new_pos = [r, c + 1]
        else: return

        # 碰撞检测：如果是路(0)则可以移动
        if self.maze[new_pos[0]][new_pos[1]] == 0:
            self.player_pos = new_pos
            # 更新玩家图标位置
            self.canvas.coords(
                self.player_icon,
                self.player_pos[1]*CELL_SIZE+5, self.player_pos[0]*CELL_SIZE+5, 
                (self.player_pos[1]+1)*CELL_SIZE-5, (self.player_pos[0]+1)*CELL_SIZE-5
            )
            
            # 检查是否到达终点
            if self.player_pos == self.end_pos:
                messagebox.showinfo("恭喜", "你成功走出了迷宫！")
                self.reset_game()

    def reset_game(self):
        """重置游戏"""
        self.maze = [[1] * COLS for _ in range(ROWS)]
        self.visited = [[False] * COLS for _ in range(ROWS)]
        self.player_pos = [1, 1]
        self.generate_maze(1, 1)
        self.draw_maze()

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