Объекты игры
Корабль игрока, сетка пришельцев 5×11, пули и их отрисовка
1 Корабль игрока — словарь
Корабль игрока — это обычный словарь с координатами, размером и количеством жизней. Именно такие структуры вы видели в ЛР №5.
def new_player(): return { 'x': WIDTH // 2 - 20, # позиция 'y': HEIGHT - 60, 'w': 40, # размер 'h': 20, 'lives': 3, # жизни }
Визуализация: корабль на поле
Зелёный прямоугольник — корабль игрока. Перемещается влево/вправо по нижней части экрана.
2 Сетка пришельцев — матрица 5×11
Пришельцы хранятся в двумерном списке (ЛР №6): 5 строк по 11 столбцов. Каждый пришелец — словарь с координатами и флагом alive.
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 Пули — два списка словарей
В игре два вида пуль: пули игрока летят вверх, пули пришельцев — вниз. Каждая пуля — словарь с координатами.
# Два пустых списка пуль 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!
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 — это именно перебор двумерного списка!