Найти в Дзене

Урок 34-2 🐦 Berd 2.0 — создаём игру про птичку на пирамиде в Python

Сегодня мы напишем небольшую игру на 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,(T
Оглавление

Прыгаем по кубикам и закрашиваем клетки 🎮

Сегодня мы напишем небольшую игру на Python с помощью библиотеки Pygame.

В игре маленькая птичка прыгает по пирамиде из кубиков и закрашивает клетки.

Каждый прыжок — новая клетка меняет цвет.

Это отличный проект, чтобы научиться:

  • работать с изображениями
  • управлять персонажем
  • строить игровое поле
  • писать свою первую игру.

🎮 Как выглядит игра

Игровое поле — это пирамида из кубиков.

-2

На вершине стоит птичка:

🐦

Когда она прыгает:

⬜ → 🟦

клетка закрашивается.

⌨ Управление в игре

Используются клавиши цифровой клавиатуры находящейся сбоку:

-3

Направления:

7 — вверх-влево
9 — вверх-вправо
1 — вниз-влево
3 — вниз-вправо

Такое управление идеально подходит для изометрических игр.

-4

📁 Содержимое папки проекта

-5
bird.png
bird.png
cube_day.png
cube_day.png
cube_day_painted.png
cube_day_painted.png

⌨ Программа

-9
-10
-11
-12
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. 🎮