Глава 21 · Проект: космический шутер
Уничтожаем врагов
colliderect() проверяет столкновения — попадание уничтожает врага, а враг может уничтожить корабль.
Уничтожаем врагов
Столкновение пули с врагом проверяет готовый метод Rect.colliderect()
— при попадании оба удаляются из своих списков, а счёт увеличивается:
unichtozhenie_vragov.py
novye_puli = []
novye_vragi = list(vragi)
for pulya in puli:
popala = False
for vrag in list(novye_vragi):
if pulya.colliderect(vrag):
novye_vragi.remove(vrag)
schet += 10
popala = True
break
if not popala:
novye_puli.append(pulya)
puli = novye_puli
vragi = novye_vragi
Почему не удалять элементы прямо во время перебора списка?
Удаление элемента из списка
vragi прямо внутри цикла for vrag in vragi: может пропустить соседние элементы — список «сдвигается» под ногами цикла. Безопаснее собрать новые списки уцелевших пуль и врагов, как показано выше.Уничтожаем космический корабль!
Если враг долетел до низа экрана или столкнулся с кораблём — игра заканчивается:
unichtozhenie_korablya.py
for vrag in vragi:
if vrag.bottom >= VYSOTA or vrag.colliderect(korabl):
igra_okonchena = True
break
Практика в Jupyter Notebook
21-06-unichtozhenie.ipynb · столкновения пуль, врагов и корабля