Загрузка данных


from turtle import *
from random import randint
from time import sleep
speed(5)

hideturtle()
s_width = 200
s_height = 180
bgcolor("#bff542")


class Sprite(Turtle):
   def __init__(self, x, y, shape, color):
       super().__init__()
       self.penup()
       self.goto(x, y)
       self.color(color)
       self.shape(shape)
       self.step = 10
       self.points = 0

   def move_up(self):
       self.goto(self.xcor(), self.ycor() + self.step)

   def move_down(self):
       self.goto(self.xcor(), self.ycor() - self.step)

   def move_left(self):
       self.goto(self.xcor() - self.step, self.ycor())

   def move_right(self):
       self.goto(self.xcor() + self.step, self.ycor())

   def is_collide(self, sprite):
       dist = self.distance(sprite.xcor(), sprite.ycor())
       if dist < 20:
           return True
       else:
           return False


class Wall(Sprite):
    def __init__(self, x, y):
        Turtle.__init__(self)
        self.penup()
        self.speed(10)
        self.goto(x,y)
        self.shape("square")
        self.color("white")


class Enemy(Sprite):
   def __init__(self, x, y, shape, color):
       Sprite.__init__(self, x, y, shape, color)
       self.goto(x, y)
       self.color(color)
       self.shape(shape)
       self.step = 20
       self.speed(10)

   def move(self, x_start, y_start, x_end, y_end):
       self.x_start = x_start
       self.y_start = y_start
       self.x_end = x_end
       self.y_end = y_end
       self.goto(x_start, y_start)
       self.setheading(self.towards(x_end, y_end))



   def make_step(self):
       self.forward(self.step)  # направление уже есть
       if self.distance(self.x_end, self.y_end) < self.step:
           self.move(self.x_end, self.y_end, self.x_start, self.y_start)

class Enemy_Wall(Sprite):
    def __init__(self, x, y):
        Turtle.__init__(self)
        self.penup()
        self.speed(10)
        self.goto(x,y)
        self.shape("square")
        self.color("red")


walls = []
for i in range(10, 400, 20):
    walls.append(Wall(i, -50))
for i in range(-50, -200, -20):
    walls.append(Wall(10, i))
for i in range(-50, 150, 20):
    walls.append(Wall(150, i))
for i in range(10, 400, 20):
    walls.append(Wall(i, 50))
for i in range(10, -200, -20):
    walls.append(Wall(i, -50))


enemy_walls = []
for i in range(-400, 500, 20):
    walls.append(Enemy_Wall(i, -250))
for i in range(-400, 500, 20):
    walls.append(Enemy_Wall(i, 250))
for i in range(-250, 250, 20):
    walls.append(Enemy_Wall(-350, i))
for i in range(-250, 250, 20):
    walls.append(Enemy_Wall(500, i))


player = Sprite(0, 0, 'turtle', 'green')
enemy1 = Enemy(s_width, -90, 'triangle', 'red')
enemy1.move(s_width + 100, -90, -s_width, -90)
enemy2 = Enemy(-s_width, 90, 'triangle', 'red')
enemy2.move(-s_width, 90, s_width, 90)
enemy3 = Enemy(-90, s_height, 'triangle', 'red')
enemy3.move(-90, s_height, -90, -s_height)
enemy4 = Enemy(-90, s_height, 'triangle', 'red')
enemy4.move(300, s_height, 300, -s_height)
goal = Sprite(50, -130, 'turtle', 'blue')
tp1 = Sprite(100, -5, 'circle', 'purple')
tp2 = Sprite(200, -5, 'circle', 'purple')

scr = player.getscreen()
scr.onkey(player.move_up, 'Up')
scr.onkey(player.move_left, 'Left')
scr.onkey(player.move_right, 'Right')
scr.onkey(player.move_down, 'Down')
scr.listen()

while player.points < 2:
   enemy1.make_step()
   enemy2.make_step()
   enemy3.make_step()
   enemy4.make_step()

   # Замените ваш текущий блок проверки стен на этот:

   for wall in walls:
       if player.is_collide(wall):
           # Отталкиваем игрока в противоположную сторону
           # Определяем, с какой стороны стена
           dx = player.xcor() - wall.xcor()
           dy = player.ycor() - wall.ycor()

           if abs(dx) > abs(dy):
               # Отталкиваем по горизонтали
               if dx > 0:
                   player.setx(wall.xcor() + 20)  # отодвинуть вправо от стены
               else:
                   player.setx(wall.xcor() - 20)  # отодвинуть влево от стены
           else:
               # Отталкиваем по вертикали
               if dy > 0:
                   player.sety(wall.ycor() + 20)  # отодвинуть вверх от стены
               else:
                   player.sety(wall.ycor() - 20)  # отодвинуть вниз от стены

   for enemy_wall in enemy_walls:
       if player.is_collide(enemy_walls):
           player.write('Ты проиграл', font=('Arial', 100, 'bold'))
           sleep(5)
           clearscreen()
           break

   if player.is_collide(goal):
       player.points += 1
       if player.points != 2:
           goal.write('Ещё чуть-чуть', font=('Arial', 12, 'bold'))
       goal.goto(randint(-80, 80), randint(-80, 80))

   if player.is_collide(tp1):
       player.teleport(tp2.xcor() + 25, tp2.ycor())

   if player.is_collide(tp2):
       player.teleport(tp1.xcor() - 25, tp1.ycor())

   if player.is_collide(enemy1) or player.is_collide(enemy2) or player.is_collide(enemy3):
       goal.hideturtle()
       break

if player.points == 2:
   goal.write('Победа!', font=('Arial', 12, 'bold'))
   enemy1.hideturtle()
   enemy2.hideturtle()
   enemy3.hideturtle()
   enemy4.hideturtle()

done()