Ваш код беспорядок, поэтому простого решения для ваших проблем не существует.В частности:
Вы пытаетесь создать несколько врагов, но ваша функция check_collision()
и код движения предназначены только для обработки одного врага.
Вы делаете e.clone()
, но не можете сохранить результат, поэтомуэто просто засоряет экран.Черепахи, по сути, являются глобальными объектами, которые не собирают мусор, поэтому вместо клонирования новых используйте старые.
Удвоенные циклы while
кажутся странными:
while alive == True:
# ...
while True:
wn.update()
В частности,update()
не имеет большого смысла, если только tracer()
не был задушен.Таким образом, этот второй цикл фактически ничего не делает.
Бесконечные, или длительные, игровые циклы не имеют смысла в управляемом событиями мире, таком как черепаха.Имеет больше смысла использовать screen.ontimer()
.
Вот мое переписывание вашего кода, который, я считаю, делает то, что вы хотите:
from turtle import Screen, Turtle
from random import randint
WIDTH, HEIGHT = 800, 600
FONT = ("Courier", 24, "normal")
# end game
def end():
global alive
screen.bgcolor('white')
pen.write("You touched a box!", align="center", font=FONT)
alive = False
screen.update()
# collision
def check_collision():
screen.update()
for enemy in enemies:
if player.distance(enemy) < 20:
end()
break
# player movement
def p_up():
player.sety(player.ycor() + 20)
check_collision()
def p_down():
player.sety(player.ycor() - 20)
check_collision()
def p_right():
player.setx(player.xcor() + 20)
check_collision()
def p_left():
player.setx(player.xcor() - 20)
check_collision()
# main loop
def move():
for enemy in enemies:
if enemy.ycor() < -300:
enemy.hideturtle()
enemy.goto(randint(-400, 400), 300)
enemy.velocity = randint(4, 8)
enemy.showturtle()
else:
enemy.sety(enemy.ycor() - enemy.velocity)
check_collision()
if not alive:
break
if alive:
screen.ontimer(move, 50)
alive = True
screen = Screen()
screen.bgcolor('Black')
screen.setup(WIDTH, HEIGHT)
screen.tracer(False)
# player
player = Turtle()
player.shape('square')
player.color('blue')
player.penup()
# enemy
enemy_prototype = Turtle()
enemy_prototype.hideturtle()
enemy_prototype.shape('square')
enemy_prototype.color('red')
enemy_prototype.penup()
enemies = []
for _ in range(3):
enemy = enemy_prototype.clone()
enemy.goto(randint(-400, 400), 300)
enemy.velocity = randint(4, 8)
enemy.showturtle()
enemies.append(enemy)
# pen
pen = Turtle()
pen.hideturtle()
pen.penup()
pen.sety(260)
# keyboard bindind
screen.onkeypress(p_up, 'Up')
screen.onkeypress(p_down, 'Down')
screen.onkeypress(p_right, 'Right')
screen.onkeypress(p_left, 'Left')
screen.listen()
move()
screen.mainloop()