🐍
rocket_launchШаг 3 из 4

Объекты игры

Корабль игрока, сетка пришельцев 5×11, пули и их отрисовка

1 Корабль игрока — словарь

Корабль игрока — это обычный словарь с координатами, размером и количеством жизней. Именно такие структуры вы видели в ЛР №5.

Создание корабля editВведите вручную
def new_player():
    return {
        'x': WIDTH // 2 - 20,  # позиция
        'y': HEIGHT - 60,
        'w': 40,               # размер
        'h': 20,
        'lives': 3,           # жизни
    }

Визуализация: корабль на поле

y = 0 (верх экрана)
... космос ...
y = HEIGHT - 60 (внизу)

Зелёный прямоугольник — корабль игрока. Перемещается влево/вправо по нижней части экрана.

2 Сетка пришельцев — матрица 5×11

Пришельцы хранятся в двумерном списке (ЛР №6): 5 строк по 11 столбцов. Каждый пришелец — словарь с координатами и флагом alive.

Создание сетки пришельцев editВведите вручную
ALIEN_W, ALIEN_H = 36, 24
ALIEN_COLS = 11
ALIEN_ROWS = 5

def new_aliens():
    aliens = []
    for row in range(ALIEN_ROWS):    # 5 строк
        alien_row = []
        for col in range(ALIEN_COLS): # 11 столбцов
            alien_row.append({
                'x': 60 + col * 52,
                'y': 80 + row * 40,
                'alive': True,
            })
        aliens.append(alien_row)
    return aliens  # список из 5 строк

Визуализация: aliens[row][col]

col=0 col=1 col=10
row=0
всего 5 строк
row=4

55 пришельцев в матрице. Доступ к любому: aliens[row][col]

Связь с ЛР №6: двойной цикл for row in aliens: for a in row — это перебор матрицы!

3 Пули — два списка словарей

В игре два вида пуль: пули игрока летят вверх, пули пришельцев — вниз. Каждая пуля — словарь с координатами.

Создание пули и фильтрация editВведите вручную
# Два пустых списка пуль
p_bullets = []   # пули игрока (летят вверх)
a_bullets = []   # пули пришельцев (летят вниз)

# Выстрел игрока — добавляем в список
p_bullets.append({
    'x': player['x'] + 18,
    'y': player['y'] - 12,
})

# Движение пуль в каждом кадре
for b in p_bullets:
    b['y'] -= BULLET_SPEED  # вверх!
for b in a_bullets:
    b['y'] += BULLET_SPEED  # вниз!

# Удаляем вылетевшие за экран (ЛР №7!)
p_bullets = [b for b in p_bullets if b['y'] > 0]
a_bullets = [b for b in a_bullets if b['y'] < HEIGHT]
Пуля игрока

Жёлтая, летит вверх (y -= 8). Максимум 3 на экране.

Пуля пришельца

Красная, летит вниз (y += 8). Случайный пришелец стреляет раз в несколько кадров.

List comprehension из ЛР №7: строка [b for b in p_bullets if b['y'] > 0] — это фильтрация списка, которую вы изучали!

4 Функции отрисовки

Для каждого объекта — своя функция отрисовки. Пришельцев рисуем двойным циклом — как перебор матрицы в ЛР №6!

Функции отрисовки editВведите вручную
GREEN  = (0,  230, 118)
CYAN   = (0,  220, 255)
YELLOW = (255,230, 0  )
RED    = (255,60,  60 )
BLACK  = (0,  0,   0  )

def draw_player(screen, p):
    # Корпус корабля
    pygame.draw.rect(screen, GREEN,
        (p['x'], p['y'], p['w'], p['h']))
    # «Нос» корабля (маленький прямоугольник сверху)
    pygame.draw.rect(screen, GREEN,
        (p['x'] + 15, p['y'] - 10, 10, 10))

def draw_aliens(screen, aliens):
    for row in aliens:              # перебираем строки
        for a in row:              # перебираем столбцы
            if a['alive']:
                pygame.draw.rect(screen, CYAN,
                    (a['x'], a['y'], ALIEN_W, ALIEN_H))
                # Глаза пришельца
                pygame.draw.rect(screen, BLACK,
                    (a['x']+6,  a['y']+6, 6, 6))
                pygame.draw.rect(screen, BLACK,
                    (a['x']+24, a['y']+6, 6, 6))

def draw_bullets(screen, p_bullets, a_bullets):
    for b in p_bullets:
        pygame.draw.rect(screen, YELLOW, (b['x'], b['y'], 4, 12))
    for b in a_bullets:
        pygame.draw.rect(screen, RED,    (b['x'], b['y'], 4, 12))

def draw_hud(screen, font, score, lives):
    screen.blit(font.render(f"Счёт: {score}", True, (255,255,255)), (10, 10))
    screen.blit(font.render(f"Жизни: {lives}", True, (255,255,255)), (WIDTH-130, 10))

Связь с ЛР №6: двойной цикл for row in aliens: for a in row в draw_aliens — это именно перебор двумерного списка!