Прыгаем по кубикам и закрашиваем клетки 🎮
Сегодня мы напишем небольшую игру на Python с помощью библиотеки Pygame.
В игре маленькая птичка прыгает по пирамиде из кубиков и закрашивает клетки.
Каждый прыжок — новая клетка меняет цвет.
Это отличный проект, чтобы научиться:
- работать с изображениями
- управлять персонажем
- строить игровое поле
- писать свою первую игру.
🎮 Как выглядит игра
Игровое поле — это пирамида из кубиков.
На вершине стоит птичка:
🐦
Когда она прыгает:
⬜ → 🟦
клетка закрашивается.
⌨ Управление в игре
Используются клавиши цифровой клавиатуры находящейся сбоку:
Направления:
7 — вверх-влево
9 — вверх-вправо
1 — вниз-влево
3 — вниз-вправо
Такое управление идеально подходит для изометрических игр.
📁 Содержимое папки проекта
⌨ Программа
import pygame
import sys
pygame.init()
WIDTH, HEIGHT = 900,700
screen = pygame.display.set_mode((WIDTH,HEIGHT))
pygame.display.set_caption("Berd 2.0")
clock = pygame.time.Clock()
ROWS = 7
TILE = 90
BG = (30,30,40)
# загрузка изображений
cube = pygame.image.load("cube_day.png").convert_alpha()
cube_painted = pygame.image.load("cube_day_painted.png").convert_alpha()
bird = pygame.image.load("bird.png").convert_alpha()
cube = pygame.transform.scale(cube,(TILE,TILE))
cube_painted = pygame.transform.scale(cube_painted,(TILE,TILE))
bird = pygame.transform.scale(bird,(60,60))
# состояние кубиков
grid = []
for r in range(ROWS):
row = []
for c in range(r+1):
row.append(False)
grid.append(row)
# позиция птички
bird_r = 0
bird_c = 0
grid[0][0] = True
def cube_position(r,c):
start_x = WIDTH//2
start_y = 120
x = start_x + (c - r/2) * TILE
y = start_y + r * TILE * 0.6
return x,y
def draw_cube(x,y,painted):
if painted:
img = cube_painted
else:
img = cube
screen.blit(img,(x,y))
def draw_bird():
x,y = cube_position(bird_r,bird_c)
bx = x + TILE/2 - 30
by = y - 20
screen.blit(bird,(bx,by))
def move_bird(dr,dc):
global bird_r,bird_c
nr = bird_r + dr
nc = bird_c + dc
if nr < 0 or nr >= ROWS:
return
if nc < 0 or nc > nr:
return
bird_r = nr
bird_c = nc
grid[bird_r][bird_c] = True
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
if event.type == pygame.KEYDOWN:
# управление цифровым блоком
if event.key == pygame.K_KP1:
move_bird(1,0)
if event.key == pygame.K_KP3:
move_bird(1,1)
if event.key == pygame.K_KP7:
move_bird(-1,-1)
if event.key == pygame.K_KP9:
move_bird(-1,0)
screen.fill(BG)
for r in range(ROWS):
for c in range(r+1):
x,y = cube_position(r,c)
draw_cube(x,y,grid[r][c])
draw_bird()
pygame.display.flip()
clock.tick(60)
Изучаем код
Подключаем библиотеку и создаём окно
import pygame
import sys
pygame.init()
Здесь происходит запуск библиотеки pygame.
Теперь создадим окно игры.
WIDTH, HEIGHT = 900,700
screen = pygame.display.set_mode((WIDTH,HEIGHT))
pygame.display.set_caption("Berd 2.0")
Что делает код:
📺 создаёт окно 900×700
🏷 задаёт название окна
⏱ Игровой таймер
clock = pygame.time.Clock()
Этот объект управляет скоростью игры.
Позже мы ограничим её:
clock.tick(60)
Это значит:
🎞 игра работает 60 кадров в секунду.
🧱 Размер пирамиды
ROWS = 7
TILE = 90
Здесь задаются параметры игры.
ROWS — количество уровней пирамиды
TILE — размер кубика
🎨 Цвет фона
BG = (30,30,40)
Это RGB-цвет.
Получается тёмный фон, на котором хорошо видно кубики.
🖼 Загрузка изображений
cube = pygame.image.load("cube_day.png").convert_alpha()
cube_painted = pygame.image.load("cube_day_painted.png").convert_alpha()
bird = pygame.image.load("bird.png").convert_alpha()
Загружаются:
🧱 обычный кубик
🟦 закрашенный кубик
🐦 птичка
Функция convert_alpha() сохраняет прозрачность изображения.
📏 Масштабируем изображения
cube = pygame.transform.scale(cube,(TILE,TILE))
cube_painted = pygame.transform.scale(cube_painted,(TILE,TILE))
bird = pygame.transform.scale(bird,(60,60))
Теперь изображения будут нужного размера.
🧠 Создание игрового поля
grid = []
Это список, который хранит состояние всех кубиков.
Создаём пирамиду:
for r in range(ROWS):
row = []
for c in range(r+1):
row.append(False)
grid.append(row)
Получается структура:
False — кубик не закрашен
True — кубик закрашен
🐦 Начальная позиция птички
bird_r = 0
bird_c = 0
grid[0][0] = True
Птичка появляется на вершине пирамиды.
Первая клетка сразу закрашивается.
📍 Функция вычисления позиции кубика
def cube_position(r,c):
Она переводит координаты пирамиды в координаты экрана.
start_x = WIDTH//2
start_y = 120
Это точка вершины пирамиды.
Горизонтальное смещение
x = start_x + (c - r/2) * TILE
Формула делает так, что каждый ряд расширяется.
Вертикальное смещение
y = start_y + r * TILE * 0.6
Кубики немного перекрываются — так выглядит изометрическая графика.
🧱 Функция рисования кубика
Эта функция определяет координаты нового кубика и определяет какое изображение загрузить по этим координатам.
def draw_cube(x,y,painted):
Если клетка закрашена:
img = cube_painted
если нет:
img = cube
Затем изображение выводится на экран:
screen.blit(img,(x,y))
🐦 Функция рисования птички
Загружает изображение птички по нужным координатам.
def draw_bird():
Получаем координаты кубика:
x,y = cube_position(bird_r,bird_c)
Затем немного смещаем птичку:
bx = x + TILE/2 - 30
by = y - 20
Это нужно, чтобы она стояла сверху кубика.
🚶 Функция движения
def move_bird(dr,dc):
Здесь происходит перемещение птички.
Сначала вычисляется новая позиция:
nr = bird_r + dr
nc = bird_c + dc
Проверяем границы пирамиды
if nr < 0 or nr >= ROWS:
return
Если птичка выходит за пределы поля — движение отменяется.
Проверяем колонку
if nc < 0 or nc > nr:
return
Это защита от выхода за края пирамиды.
Перемещение
bird_r = nr
bird_c = nc
Теперь птичка перемещается.
Закрашивание клетки
grid[bird_r][bird_c] = True
Клетка меняет цвет.
🔄 Главный игровой цикл
while True:
Игра работает в бесконечном цикле.
📬 Получаем события
for event in pygame.event.get():
Здесь обрабатываются действия игрока.
❌ Закрытие игры
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
Если нажать крестик — игра закрывается.
⌨ Обработка нажатия клавиш
if event.type == pygame.KEYDOWN:
Эта строка проверяет событие клавиатуры.
В библиотеке Pygame все действия пользователя называются событиями.
Например:
нажали клавишу
кликнули мышкой
закрыли окно
Когда игрок нажимает кнопку, возникает событие:
pygame.KEYDOWN
То есть:
👉 «Клавиша была нажата»
🎮 Управление цифровой клавиатурой
if event.key == pygame.K_KP1:
move_bird(1,0)
Здесь проверяется, какая именно клавиша была нажата.
pygame.K_KP1 означает:
клавиша 1 на цифровой клавиатуре (NumPad)
Когда игрок нажимает 1, вызывается функция:
move_bird(1,0)
🐦 Что означают числа (1,0)
Функция движения принимает два параметра:
move_bird(dr, dc)
где
dr — изменение ряда (вверх или вниз)
dc — изменение позиции в ряду
Поэтому:
move_bird(1,0)
означает:
👉 перейти на один ряд вниз
👉 остаться в той же колонке
То есть птичка прыгает вниз-влево.
➡ Кнопка 3
if event.key == pygame.K_KP3:
move_bird(1,1)
Клавиша 3 означает:
вниз-вправо
Параметры:
dr = 1 → вниз
dc = 1 → правее
↖ Кнопка 7
if event.key == pygame.K_KP7:
move_bird(-1,-1)
Клавиша 7:
вверх-влево
Параметры:
dr = -1 → вверх
dc = -1 → левее
↗ Кнопка 9
if event.key == pygame.K_KP9:
move_bird(-1,0)
Клавиша 9:
вверх-вправо
🎨 Очистка экрана
screen.fill(BG)
Перед тем как рисовать новый кадр, экран нужно очистить.
Если этого не сделать:
старые кадры останутся на экране
И получится эффект «шлейфа».
Команда fill() заполняет экран цветом:
BG = (30,30,40)
Это тёмно-синий фон.
🧱 Рисование пирамиды
Теперь программа рисует все кубики.
for r in range(ROWS):
Перебираются ряды пирамиды.
Если
ROWS = 7
то получится:
1 кубик
2 кубика
3 кубика
4 кубика
5 кубиков
6 кубиков
7 кубиков
Внутренний цикл
for c in range(r+1):
Этот цикл проходит по кубикам внутри ряда.
Например:
ряд 0 → 1 кубик
ряд 1 → 2 кубика
ряд 2 → 3 кубика
Так формируется пирамида.
📍 Получение координат кубика
x,y = cube_position(r,c)
Вызывается функция:
cube_position()
Она переводит координаты поля игры в координаты экрана.
То есть определяет:
- какой это ряд
- какой это кубик в ряду
🧱 Рисование кубика
draw_cube(x,y,grid[r][c])
Функция получает:
x y — позицию
grid[r][c] — состояние кубика (закрашен или не закрашен)
Если состояние кубика:
False → обычный кубик
True → закрашенный кубик
Затем, функция выбирает нужную картинку и выводит её.
🐦 Рисование птички
draw_bird()
Эта функция рисует персонажа игры.
Она:
1️⃣ определяет кубик, на котором стоит птичка
2️⃣ вычисляет координаты
3️⃣ немного смещает её вверх
4️⃣ рисует изображение
Так создаётся эффект, будто птичка стоит на кубике.
🖥 Обновление экрана
pygame.display.flip()
Эта команда показывает новый кадр.
До этого момента всё рисуется в памяти.
После flip() изображение появляется на экране.
⏱ Ограничение скорости игры
clock.tick(60)
Это ограничивает скорость цикла.
60 кадров в секунду
Это называется FPS (Frames Per Second).
Если ограничение убрать:
игра может работать 500–1000 FPS
что:
❌ перегружает процессор
❌ делает игру нестабильной
🧠 Как работает этот код вместе
Каждый кадр программа выполняет такой алгоритм:
1 проверить нажатие клавиш
2 переместить птичку
3 очистить экран
4 нарисовать все кубики
5 нарисовать птичку
6 обновить экран
7 подождать до 60 FPS
И затем всё повторяется снова.
🎮 Что получается в итоге
Благодаря этому коду:
🐦 птичка двигается по пирамиде
🧱 клетки закрашиваются
⌨ управление работает через NumPad (цифровую клавиатуру сбоку))
🎨 игра обновляется плавно
Это уже основа полноценной игры на Python.
💡 В следующем шаге можно добавить:
🔵 случайные бонусные шары
🏆 систему очков
🏁 завершение игры, когда вся пирамида закрашена
И тогда проект превратится в настоящую аркаду в стиле
Q*bert. 🎮