import tkinter as tk
from random import choice

class MazeGame:
    def __init__(self, width=20, height=15, cell_size=30):
        self.width = width  # 迷宫宽度（列数）
        self.height = height  # 迷宫高度（行数）
        self.cell_size = cell_size  # 每个单元格的大小
        self.maze = [[1 for _ in range(width)] for _ in range(height)]  # 1=墙，0=路径
        self.player_x, self.player_y = 1, 1  # 玩家起始位置（索引）
        self.exit_x, self.exit_y = width-2, height-2  # 出口位置
        
        # 创建窗口
        self.root = tk.Tk()
        self.root.title("迷宫游戏")
        self.canvas = tk.Canvas(self.root, width=width*cell_size, height=height*cell_size, bg='white')
        self.canvas.pack()
        
        # 绑定键盘事件
        self.root.bind('<KeyPress>', self.move_player)
        self.root.focus_set()
        
        # 生成迷宫
        self.generate_maze(1, 1)
        # 设置入口和出口为路径
        self.maze[1][1] = 0
        self.maze[self.exit_y][self.exit_x] = 0
        
        # 绘制迷宫和玩家
        self.draw_maze()
        self.draw_player()
    
    def generate_maze(self, x, y):
        """递归回溯算法生成迷宫"""
        self.maze[y][x] = 0  # 当前位置为路径
        directions = [(0, 2), (2, 0), (0, -2), (-2, 0)]  # 右、下、左、上（步长2，避免相邻）
        choice(directions)  # 随机化顺序
        for dx, dy in directions:
            nx, ny = x + dx, y + dy
            if 1 <= nx < self.width-1 and 1 <= ny < self.height-1 and self.maze[ny][nx] == 1:
                self.maze[y + dy//2][x + dx//2] = 0  # 打通中间墙
                self.generate_maze(nx, ny)
    
    def draw_maze(self):
        """绘制迷宫"""
        self.canvas.delete("all")
        for y in range(self.height):
            for x in range(self.width):
                color = 'black' if self.maze[y][x] == 1 else 'white'
                self.canvas.create_rectangle(
                    x*self.cell_size, y*self.cell_size,
                    (x+1)*self.cell_size, (y+1)*self.cell_size,
                    fill=color, outline='gray'
                )
        # 绘制出口（绿色）
        self.canvas.create_rectangle(
            self.exit_x*self.cell_size, self.exit_y*self.cell_size,
            (self.exit_x+1)*self.cell_size, (self.exit_y+1)*self.cell_size,
            fill='green', outline='gray'
        )
    
    def draw_player(self):
        """绘制玩家"""
        self.canvas.create_rectangle(
            self.player_x*self.cell_size + 5, self.player_y*self.cell_size + 5,
            (self.player_x+1)*self.cell_size - 5, (self.player_y+1)*self.cell_size - 5,
            fill='blue', outline='darkblue'
        )
    
    def move_player(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
        
        new_x, new_y = self.player_x + dx, self.player_y + dy
        
        # 检查边界和墙壁
        if (0 <= new_x < self.width and 0 <= new_y < self.height and
            self.maze[new_y][new_x] != 1):
            self.player_x, self.player_y = new_x, new_y
            self.draw_maze()  # 重新绘制迷宫（擦除旧玩家）
            self.draw_player()
            
            # 检查是否到达出口
            if new_x == self.exit_x and new_y == self.exit_y:
                self.root.after(1000, lambda: self.root.quit())  # 1秒后退出
                self.canvas.create_text(
                    self.width*self.cell_size//2, self.height*self.cell_size//2,
                    text="恭喜！通关！", font=('Arial', 20), fill='red'
                )
    
    def run(self):
        """运行游戏"""
        self.root.mainloop()

# 运行游戏
if __name__ == "__main__":
    game = MazeGame()
    game.run()
