Глава 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 · столкновения пуль, врагов и корабля
Открыть ноутбук →