Загрузка данных
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()