🎮 Все игры 🚀 Космос
1 2 3 4 5
Урок 3

Появляются враги

Что ты увидишь Сверху, в случайных местах, появляются красные пришельцы и медленно падают вниз. Это второй список — точно такой же приём, как с пулями. Файл: step3_enemies.py
⬇️ Скачать код урока

🆕 Новое: враги появляются по таймеру

Пулю добавлял ты — нажатием пробела. Врагов добавляет сама игра каждые несколько кадров. Для этого заводим счётчик кадров spawn_timer: он растёт каждый кадр, и когда дорастёт до SPAWN_EVERY — добавляем врага и обнуляем счётчик.

📝 Что добавилось (про врагов)

import pygame, sys, random      # random — для случайного места

ENEMY_SIZE = 32
ENEMY_SPEED = 2
SPAWN_EVERY = 45                   # через сколько кадров новый враг
enemies = []                      # СПИСОК врагов
spawn_timer = 0

def draw_enemy(e):
    """Пришелец — красный кружок с глазками."""
    ex, ey = e.center
    pygame.draw.circle(screen, ENEMY_COLOR, (ex, ey), ENEMY_SIZE // 2)
    pygame.draw.circle(screen, WHITE, (ex - 6, ey - 3), 4)
    pygame.draw.circle(screen, WHITE, (ex + 6, ey - 3), 4)
    pygame.draw.circle(screen, BG, (ex - 6, ey - 3), 2)
    pygame.draw.circle(screen, BG, (ex + 6, ey - 3), 2)

# --- в игровом цикле ---

    # каждые SPAWN_EVERY кадров ДОБАВЛЯЕМ нового врага сверху
    spawn_timer += 1
    if spawn_timer >= SPAWN_EVERY:
        spawn_timer = 0
        x = random.randint(0, WIDTH - ENEMY_SIZE)
        enemies.append(pygame.Rect(x, -ENEMY_SIZE, ENEMY_SIZE, ENEMY_SIZE))

    # враги летят вниз; улетевших за низ УБИРАЕМ
    for e in enemies[:]:
        e.y += ENEMY_SPEED
        if e.top > HEIGHT:
            enemies.remove(e)

    # рисуем каждого врага из списка
    for e in enemies:
        draw_enemy(e)

🔍 Мелочи, которые важно понять

Почему враг рождается с y = -ENEMY_SIZE?

Чтобы он «выезжал» из-за верхнего края плавно, а не появлялся резко. Минус высота — значит он сначала весь над экраном, потом постепенно вползает.

Снова та же тройка: append → for → remove

Сравни с пулями — код почти одинаковый! Это и есть сила приёма «список объектов»: один и тот же шаблон работает и для пуль, и для врагов, и для чего угодно ещё.

bullets: append / for / remove enemies: append / for / remove

Функция draw_enemy(e)

Рисовать пришельца — несколько строк (кружок + глазки). Чтобы не повторять их, завернули в функцию, как make_bricks() в Арканоиде. Вызвал draw_enemy(e) — нарисовался один враг.

🎮 Попробуй сам 1. Сделай врагов чаще: SPAWN_EVERY = 25.
2. Сделай их быстрее: ENEMY_SPEED = 4.
3. Поменяй размер ENEMY_SIZE — глазки сдвинутся сами.
← НазадУрок 2 — Выстрел