У нас два списка. Чтобы понять, кто в кого попал, надо сравнить каждую
пулю с каждым врагом. Это цикл в цикле (двойной for):
берём пулю → пробегаем всех врагов → если пересеклись, убираем обоих.
font = pygame.font.SysFont(None, 36) score = 0 # --- в игровом цикле, после движения пуль и врагов --- # ПОПАДАНИЯ: для каждой пули проверяем каждого врага for b in bullets[:]: for e in enemies[:]: if b.colliderect(e): bullets.remove(b) enemies.remove(e) score += 1 break # пуля исчезла — дальше врагов не смотрим # счёт в углу hud = font.render(f"Очки: {score}", True, WHITE) screen.blit(hud, (12, 8))
colliderect — уже знакомыйТот же приём, что в «Ловком коте» и «Арканоиде»: два прямоугольника
пересеклись или нет. b.colliderect(e) возвращает
True, если пуля задела врага.
break после попадания?Как только пуля сбила врага, мы её удалили — больше сравнивать её не с
кем. break выходит из внутреннего цикла (по врагам) и переходит к
следующей пуле. Без него можно случайно «убить» одной пулей двух врагов и
получить ошибку.
bullets[:] и enemies[:] — копии, потому что внутри
мы из обоих списков удаляем. Тот же приём, что и в прошлых уроках.
break и не идти по копиям — Python начнёт спотыкаться:
«list index out of range» или враги будут исчезать через одного. Попробуй
сломать специально и увидишь баг своими глазами.
score += 10.ENEMY_SIZE = 44 — попадать легче.len(enemies).