import turtle

# 1. 定义迷宫地图 (1代表墙，0代表路，E代表出口)
# 你可以自由修改这个矩阵来改变迷宫布局
maze_map = [
    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
    [1, 0, 0, 0, 1, 0, 0, 0, 0, 1],
    [1, 0, 1, 0, 1, 0, 1, 1, 0, 1],
    [1, 0, 1, 0, 0, 0, 1, 0, 0, 1],
    [1, 0, 1, 1, 1, 1, 1, 0, 1, 1],
    [1, 0, 0, 0, 0, 0, 0, 0, 0, 1],
    [1, 1, 1, 0, 1, 1, 1, 1, 0, 1],
    [1, 0, 0, 0, 1, 0, 0, 0, 0, 1],
    [1, 0, 1, 1, 1, 0, 1, 1, "E", 1],
    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
]

# 游戏配置
UNIT = 40  # 每个格子的像素大小


class MazeGame:
    def __init__(self):
        self.window = turtle.Screen()
        self.window.title("Python 简易迷宫")
        self.window.setup(width=600, height=600)
        self.window.tracer(0)  # 关闭动画，瞬间画好迷宫

        self.drawer = turtle.Turtle()  # 用于画墙
        self.player = turtle.Turtle()  # 玩家
        self.player_pos = [1, 1]      # 玩家初始坐标 (行, 列)

        self.setup_maze()
        self.setup_player()

        # 绑定键盘事件
        self.window.listen()
        self.window.onkey(lambda: self.move(-1, 0), "Up")
        self.window.onkey(lambda: self.move(1, 0), "Down")
        self.window.onkey(lambda: self.move(0, -1), "Left")
        self.window.onkey(lambda: self.move(0, 1), "Right")

    def setup_maze(self):
        """根据地图数据画墙"""
        self.drawer.penup()
        self.drawer.speed(0)
        self.drawer.shape("square")
        self.drawer.shapesize(UNIT/20)  # 默认20像素，缩放到UNIT大小

        for r in range(len(maze_map)):
            for c in range(len(maze_map[r])):
                item = maze_map[r][c]
                # 计算屏幕坐标
                screen_x = -200 + (c * UNIT)
                screen_y = 200 - (r * UNIT)

                if item == 1:  # 画墙
                    self.drawer.goto(screen_x, screen_y)
                    self.drawer.color("gray")
                    self.drawer.stamp()
                elif item == "E":  # 画出口
                    self.drawer.goto(screen_x, screen_y)
                    self.drawer.color("red")
                    self.drawer.stamp()
        self.window.update()

    def setup_player(self):
        """初始化玩家小球"""
        self.player.shape("circle")
        self.player.color("blue")
        self.player.penup()
        self.player.shapesize((UNIT-10)/20)
        self.update_player_screen_pos()

    def update_player_screen_pos(self):
        """将逻辑坐标转换为屏幕坐标并移动"""
        screen_x = -200 + (self.player_pos[1] * UNIT)
        screen_y = 200 - (self.player_pos[0] * UNIT)
        self.player.goto(screen_x, screen_y)
        self.window.update()

    def move(self, dr, dc):
        """移动逻辑"""
        new_r = self.player_pos[0] + dr
        new_c = self.player_pos[1] + dc

        target = maze_map[new_r][new_c]

        if target != 1:  # 只要不是墙就能走
            self.player_pos = [new_r, new_c]
            self.update_player_screen_pos()

            if target == "E":
                turtle.messagebox.showinfo("胜利", "恭喜你找到了出口！")
                self.window.bye()


if __name__ == "__main__":
    game = MazeGame()
    turtle.done()
