У вас есть некоторые ошибки в логике обработки маркеров, которые означают, что вы выполняете намного больше работы, чем нужно для каждого кадра (и некоторые из них могут не выполнять то, что вы намеревались).
Первая проблема в этой строке в классе Enemy
:
a=[] # to store the bullets per enemy
Комментарий неправильный и вводит в заблуждение.Вы не храните маркеры на врага , но у вас есть только один список в переменной класса, и все ваши экземпляры Enemy
делят его.Если вам нужен отдельный список для каждого экземпляра, вам нужно переместить эту строку в метод __init__
и написать:
self.a = []
Тот факт, что каждый экземпляр противника имеет ссылку на один и тот же список, означаетчто позже, когда вы используете вложенные циклы для итерации по enemies1
и enemy1.a
, вы фактически поражаете каждую пулю во всей игре несколько раз (по одному на каждого врага).Вероятно, это не то, что вы намеревались.
Как я упоминал выше, вы можете переместить список в экземпляры.Но альтернатива состоит в том, чтобы сохранить список переменных класса и вместо этого просто повторить его один раз, а не несколько раз.Объекты Bullet
на самом деле не заботятся о том, какие Enemy
запустили их после того, как они были созданы, поэтому вы можете достичь правильного поведения даже с одним списком пуль.Просто удалите отступ для цикла for
над пулями и итерируйте по Enemy.a
.
Другая важная проблема в вашем коде заключается в том, что вы неправильно удаляете маркеры, которые вышли за пределы.В вашем коде у вас есть del bullets
, но это только удаляет переменную bullets
из локального пространства имен, но не удаляет объект, на который ссылается это имя, из списка, который вы перебираете.Таким образом, вы постепенно накапливаете все больше и больше маркеров, что, вероятно, замедляет ваш код.
К сожалению, удаление элементов из списка во время итерации по нему немного опасно.Если вы просто исправили логику удаления, чтобы использовать индекс в списке (например, с enumerate
), вы обнаружите, что вы проверяете только некоторые из своих маркеров, а не все.Это происходит потому, что каждый раз, когда вы удаляете один маркер, все последующие перемещаются вверх по списку, и поэтому вы пропускаете следующий в списке (так как теперь он находится в индексе, который был у удаленного маркера).Хотя существует несколько возможных обходных путей (например, итерация от конца списка к началу), часто лучшим подходом является создание целого нового списка для следующего кадра, исключая те, которые находятся за пределами.
new_bullet_list = []
for bullets in Enemy.a:
if (bullets.ycor()>390 or bullets.xcor()>390 or bullets.ycor()<-390 or bullets.xcor()<-390):
bullets.hideturtle()
bullets.clear()
else:
new_bullet_list.append(bullets)
Enemy.a = new_bullet_list
В качестве дополнительного примечания, вы должны действительно попытаться улучшить имена переменных.Использование a
в качестве названия вашего списка будет излишне лаконичным.Имя типа bullets
или bullets_list
было бы гораздо более наглядным.И использование bullets
в качестве переменной цикла над списком маркеров вводит в заблуждение, поскольку это один экземпляр Bullet
, а не несколько множественных наборов маркеров.Числа в enemies1
и enemy1
также не делают ничего полезного (обычно числа в имени переменной предполагают, что вы должны использовать список, но здесь есть только одна вещь для каждого из них, числа избыточны).