import tkinter as tk
from tkinter import messagebox
import random

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

class MazeGame:
    def __init__(self, root):
        self.root = root
        self.root.title("随机迷宫闯关")
        
        # 游戏状态
        self.maze = []
        self.player_pos = [0, 0]
        self.end_pos = [ROWS - 1, COLS - 1]
        
        # 创建画布
        self.canvas = tk.Canvas(root, width=WIDTH, height=HEIGHT, bg="white")
        self.canvas.pack(padx=10, pady=10)
        
        # 绑定按键
        self.root.bind("<KeyPress>", self.handle_keypress)
        
        # 初始化迷宫
        self.reset_game()

    def generate_maze(self):
        """使用DFS算法生成随机迷宫 (0: 路, 1: 墙)"""
        # 初始全为墙
        self.maze = [[1 for _ in range(COLS)] for _ in range(ROWS)]
        
        stack = [(0, 0)]
        self.maze[0][0] = 0
        visited = set([(0, 0)])

        while stack:
            curr_r, curr_c = stack[-1]
            # 查找邻居（间隔一格，确保有墙壁）
            neighbors = []
            for dr, dc in [(-2, 0), (2, 0), (0, -2), (0, 2)]:
                nr, nc = curr_r + dr, curr_c + dc
                if 0 <= nr < ROWS and 0 <= nc < COLS and (nr, nc) not in visited:
                    neighbors.append((nr, nc))
            
            if neighbors:
                next_r, next_c = random.choice(neighbors)
                # 打通中间的墙
                self.maze[(curr_r + next_r) // 2][(curr_c + next_c) // 2] = 0
                self.maze[next_r][next_c] = 0
                visited.add((next_r, next_c))
                stack.append((next_r, next_c))
            else:
                stack.pop()
        
        # 确保起点和终点是通的
        self.maze[0][0] = 0
        self.maze[ROWS-1][COLS-1] = 0

    def draw_maze(self):
        self.canvas.delete("all")
        for r in range(ROWS):
            for c in range(COLS):
                x1, y1 = c * CELL_SIZE, r * CELL_SIZE
                x2, y2 = x1 + CELL_SIZE, y1 + CELL_SIZE
                
                if self.maze[r][c] == 1:
                    self.canvas.create_rectangle(x1, y1, x2, y2, fill="#2C3E50", outline="#34495E")
                
        # 画终点
        ex, ey = self.end_pos[1] * CELL_SIZE, self.end_pos[0] * CELL_SIZE
        self.canvas.create_rectangle(ex+5, ey+5, ex+CELL_SIZE-5, ey+CELL_SIZE-5, fill="#27AE60", outline="")
        
        # 画玩家
        px, py = self.player_pos[1] * CELL_SIZE, self.player_pos[0] * CELL_SIZE
        self.player_rect = self.canvas.create_rectangle(px+5, py+5, px+CELL_SIZE-5, py+CELL_SIZE-5, fill="#3498DB", outline="")

    def handle_keypress(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

        # 碰撞检测
        nr, nc = new_pos
        if 0 <= nr < ROWS and 0 <= nc < COLS and self.maze[nr][nc] == 0:
            self.player_pos = new_pos
            # 更新玩家位置
            px, py = nc * CELL_SIZE, nr * CELL_SIZE
            self.canvas.coords(self.player_rect, px+5, py+5, px+CELL_SIZE-5, py+CELL_SIZE-5)
            
            # 检查胜利
            if self.player_pos == self.end_pos:
                messagebox.showinfo("恭喜", "你成功走出了迷宫！")
                self.reset_game()

    def reset_game(self):
        self.player_pos = [0, 0]
        self.generate_maze()
        self.draw_maze()

if __name__ == "__main__":
    root = tk.Tk()
    game = MazeGame(root)
    
    # 添加说明标签
    instr = tk.Label(root, text="使用方向键 (↑ ↓ ← →) 移动蓝色方块到绿色终点", font=("Arial", 10))
    instr.pack(pady=5)
    
    root.mainloop()