import turtle

# Настройка экрана
screen = turtle.Screen()
screen.setup(700, 700)
screen.tracer(0)  # Отключаем автоматическую анимацию

# Создание черепашки для игрока-квадрата
player = turtle.Turtle()
player.shape("square")
player.color("blue")
player.penup()
player.speed(0)  # Самая высокая скорость

# Создание черепашки для рисования лабиринта
maze_drawer = turtle.Turtle()
maze_drawer.hideturtle()
maze_drawer.speed(0)
maze_drawer.penup()

# Параметры лабиринта (измените, чтобы создать свой лабиринт)
maze = [
    "XXXXXXXXXXXXXXXXXXXXXXXXX",
    "X XXXXXXXXXXXXXXXXXXXXXXX",
    "X   X   X   X   X   X   X",
    "XXX X XXX X XXX X XXX X X",
    "X   X   X   X   X   X   X",
    "X XXX X XXX X XXX X XXX X",
    "X   X   X   X   X   X   X",
    "X XXX X XXX X XXX X XXX X",
    "X   X   X   X   X   X   X",
    "X XXXXXXXXXXXXXXXX XXXXXX",
    "X                       X",
    "XXXXXXXXXXXXXXXXXXXXX X X",
    "X                       X",
    "XXXXXXXXXXXXXXXXXXXXX X X",
    "X                       X",
    "XXXXXXXXXXXXXXXXXXXXX X X",
    "X                       X",
    "XXXXXXXXXXXXXXXXXXXXX X X",
    "X   X   X   X   X   X   X",
    "X XXX X XXX X XXX X XXX X",
    "X   X   X   X   X   X   X",
    "X XXX X XXX X XXX X XXX X",
    "X   X   X   X   X   X   X",
    "XXXXXXXXXXXXXXXXXXXXXXXXX"
]

# Размеры лабиринта и клетки
CELL_SIZE = 24
MAZE_WIDTH = len(maze[0])
MAZE_HEIGHT = len(maze)

# Начальная позиция игрока
start_x = -MAZE_WIDTH * CELL_SIZE / 2 + CELL_SIZE / 2
start_y = MAZE_HEIGHT * CELL_SIZE / 2 - CELL_SIZE / 2
player.goto(start_x, start_y)

# Функция для рисования лабиринта
def draw_maze():
    for y in range(MAZE_HEIGHT):
        for x in range(MAZE_WIDTH):
            char = maze[y][x]
            screen_x = -MAZE_WIDTH * CELL_SIZE / 2 + (x * CELL_SIZE)
            screen_y = MAZE_HEIGHT * CELL_SIZE / 2 - (y * CELL_SIZE)
            maze_drawer.goto(screen_x, screen_y)

            if char == "X":
                maze_drawer.color("forest green")
                maze_drawer.stamp() # ставит квадратную печать

# Функция для проверки столкновений
def is_collision(x, y):
    cell_x = int((x + MAZE_WIDTH * CELL_SIZE / 2) // CELL_SIZE)
    cell_y = int((MAZE_HEIGHT * CELL_SIZE / 2 - y) // CELL_SIZE)

    if cell_x < 0 or cell_x >= MAZE_WIDTH or cell_y < 0 or cell_y >= MAZE_HEIGHT:
        return True

    return maze[cell_y][cell_x] == "X"

#Функция определения победы
def is_win(x, y):
    cell_x = int((x + MAZE_WIDTH * CELL_SIZE / 2) // CELL_SIZE)
    cell_y = int((MAZE_HEIGHT * CELL_SIZE / 2 - y) // CELL_SIZE)

    if cell_x == MAZE_WIDTH - 2 and cell_y == MAZE_HEIGHT -2 :
        return True

    return False

# Функция для движения игрока
def move_up():
    x = player.xcor()
    y = player.ycor() + CELL_SIZE
    if not is_collision(x, y):
        player.goto(x, y)
        if is_win(x,y):
            show_win()
    else:
        game_over()

def move_down():
    x = player.xcor()
    y = player.ycor() - CELL_SIZE
    if not is_collision(x, y):
        player.goto(x, y)
        if is_win(x,y):
            show_win()
    else:
        game_over()

def move_left():
    x = player.xcor() - CELL_SIZE
    y = player.ycor()
    if not is_collision(x, y):
        player.goto(x, y)
        if is_win(x,y):
            show_win()
    else:
        game_over()

def move_right():
    x = player.xcor() + CELL_SIZE
    y = player.ycor()
    if not is_collision(x, y):
        player.goto(x, y)
        if is_win(x,y):
            show_win()
    else:
        game_over()

def game_over():
    player.goto(0,0)
    player.color("red")
    player.write("Вы проиграли!", align="center", font=("Arial", 30, "normal"))

def show_win():
    player.goto(0,0)
    player.color("green")
    player.write("Вы победили!", align="center", font=("Arial", 30, "normal"))


# Настройка управления
screen.listen()
screen.onkeypress(move_up, "Up")
screen.onkeypress(move_down, "Down")
screen.onkeypress(move_left, "Left")
screen.onkeypress(move_right, "Right")

# Основной цикл игры
draw_maze()
screen.update() # Обновляем экран один раз после отрисовки лабиринта

screen.mainloop()

