Урок 3. Управление героем: условия и события
УЧЕБНИК КУРСА: «PYTHON ЧЕРЕЗ СОЗДАНИЕ ИГР»
УРОК 3. Управление героем: условия и события
Время на изучение: 1.5-2 часа (включая практику и домашнее задание)
ЦЕЛИ УРОКА
После изучения этого урока ты сможешь:
Понимать, как компьютер обрабатывает нажатия клавиш.
Использовать условия
if/elseдля проверки событий.Заставить героя двигаться только тогда, когда ты нажимаешь кнопки.
Реализовать управление с клавиатуры (стрелки или WASD).
Добавить проверку границ экрана (герой не улетит за пределы).
Подготовить код к добавлению врагов (на следующем уроке).
СВЯЗЬ С ПРОШЛЫМ УРОКОМ
| Что было в Уроке 2 | Что будет в Уроке 3 |
|---|---|
| Квадрат двигался сам по себе | Квадрат двигается только когда ты нажимаешь кнопки |
| Переменные для позиции игрока | Условия для проверки нажатий |
| Игрок улетал за экран | Игрок остаётся в пределах окна |
| Нет взаимодействия | Ты управляешь игрой своими руками! |
💡 НАПОМИНАНИЕ: Если ты пропустил Урок 2 или что-то забыл — открой предыдущую главу учебника. Особенно раздел про систему координат и движение.
3.1. ВВЕДЕНИЕ: ОТ АНИМАЦИИ К ИГРЕ
Привет! В прошлый раз ты создал движущийся квадрат. Он перемещался по экрану автоматически, как заводная игрушка.
Но это ещё не игра.
Игра отличается от анимации тем, что игрок влияет на то, что происходит на экране. Без управления это просто заставка.
Задача Урока 3: Превратить анимацию в игру. Ты научишься:
Отслеживать нажатия клавиш.
Реагировать на них с помощью условий.
Ограничивать движение границами экрана.
К концу урока у тебя будет полноценное управление: герой слушается твоих команд!
3.2. ПОДГОТОВКА ПРОЕКТА
Продолжаем развивать код из Урока 2.
Шаг 1. Создай копию файла
Открой папку
Lesson2в VS Code.Найди файл
main.py.Сделай копию и назови её
main_backup.py(резервная версия).Создай новую папку
Lesson3и скопируй тудаmain.py.
Шаг 2. Проверь запуск
Открой
main.pyв VS Code.Нажми
F5или кнопку ▶️.Убедись, что квадрат двигается автоматически (как в Уроке 2).
Если что-то не работает — вернись к Уроку 2, раздел «Частые ошибки».
3.3. УСЛОВИЯ: КАК КОМПЬЮТЕР ПРИНИМАЕТ РЕШЕНИЯ
В жизни ты постоянно принимаешь решения:
Если на улице дождь → то возьму зонт.
Иначе → пойду без зонта.
В программировании это называется условием.
Конструкция if/else:
# Пример из жизни
погода = "дождь"
if погода == "дождь":
print("Беру зонт!")
else:
print("Иду без зонта")
Как это работает:
| Часть | Что делает |
|---|---|
| «Если условие верно — выполни код ниже» |
| Проверка на равенство (не путать с =!) |
| Двоеточие обязательно! Открывает блок кода |
| Отступ | Код внутри if должен быть сдвинут вправо (4 пробела или Tab) |
| «Иначе — выполни этот код» (необязательно) |
Важное правило:
# ПРАВИЛЬНО:
if player_x > 100:
print("Игрок справа")
# НЕПРАВИЛЬНО:
if player_x > 100 # Ошибка! Нет двоеточия
print("Игрок справа")
# НЕПРАВИЛЬНО:
if player_x > 100:
print("Игрок справа") # Ошибка! Нет отступа
💡 ЗАПОМНИ:
=присваивает значение,==проверяет равенство!
3.4. СОБЫТИЯ: КАК КОМПЬЮТЕР УЗНАЁТ О НАЖАТИЯХ
В Уроке 1 мы видели этот код:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
Он проверяет события. Но есть два способа проверить нажатие клавиш!
Способ 1. События (pygame.KEYDOWN)
for event in pygame.event.get():
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_RIGHT:
print("Нажата стрелка вправо!")
| Плюсы | Минусы |
|---|---|
| Точное срабатывание (один раз на нажатие) | Не подходит для плавного движения |
| Хорошо для одиночных действий (выстрел, прыжок) | Нужно держать и отпускать клавишу |
Способ 2. Состояние клавиш (pygame.key.get_pressed())
keys = pygame.key.get_pressed()
if keys[pygame.K_RIGHT]:
player_x = player_x + player_speed
| Плюсы | Минусы |
|---|---|
| Плавное движение (пока держишь кнопку) | Не подходит для одиночных действий |
| Идеально для управления героем |
Какой способ использовать?
| Действие | Способ |
|---|---|
| Движение героя (влево/вправо) |
|
| Выстрел (один раз на нажатие) |
|
| Прыжок (один раз на нажатие) |
|
| Закрытие игры |
|
3.5. ДОБАВЛЯЕМ УПРАВЛЕНИЕ
Теперь применим это на практике!
Шаг 1. Убираем автоматическое движение
Найди в коде строку:
player_x = player_x + player_speed
Закомментируй её (добавь # в начале):
# player_x = player_x + player_speed # Теперь движение только от кнопок!
💡 КОММЕНТАРИЙ: Строки с
#игнорируются компьютером. Это способ временно отключить код, не удаляя его.
Шаг 2. Добавляем проверку клавиш
Вставь этот код после screen.fill(COLOR) и перед отрисовкой игрока:
# === ПРОВЕРЯЕМ НАЖАТИЯ КЛАВИШ ===
keys = pygame.key.get_pressed()
# Движение влево
if keys[pygame.K_LEFT]:
player_x = player_x - player_speed
# Движение вправо
if keys[pygame.K_RIGHT]:
player_x = player_x + player_speed
# Движение вверх
if keys[pygame.K_UP]:
player_y = player_y - player_speed
# Движение вниз
if keys[pygame.K_DOWN]:
player_y = player_y + player_speed
# =================================
Шаг 3. Полный код с управлением
Вот как должен выглядеть твой игровой цикл:
# Игровой цикл
running = True
while running:
# Проверка событий
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
# Закрашивание экрана
screen.fill(COLOR)
# === ПРОВЕРЯЕМ НАЖАТИЯ КЛАВИШ ===
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
player_x = player_x - player_speed
if keys[pygame.K_RIGHT]:
player_x = player_x + player_speed
if keys[pygame.K_UP]:
player_y = player_y - player_speed
if keys[pygame.K_DOWN]:
player_y = player_y + player_speed
# =================================
# Рисуем игрока
player_rect = pygame.Rect(player_x, player_y, player_width, player_height)
pygame.draw.rect(screen, player_color, player_rect)
# Обновление экрана
pygame.display.flip()
Попробуй запустить!
Теперь квадрат двигается только когда ты нажимаешь стрелки. Это уже настоящая игра!
3.6. ПРОВЕРКА ГРАНИЦ: ИГРОК НЕ УЛЕТАЕТ ЗА ЭКРАН
Сейчас герой может уйти за пределы окна и исчезнуть. Исправим это!
Логика проверки:
Если игрок слева меньше 0 → останови его
Если игрок справа больше WIDTH → останови его
Добавляем ограничения:
Вставь этот код после проверки нажатий, но перед отрисовкой:
# === ПРОВЕРКА ГРАНИЦ ЭКРАНА ===
# Левая граница
if player_x < 0:
player_x = 0
# Правая граница
if player_x > WIDTH - player_width:
player_x = WIDTH - player_width
# Верхняя граница
if player_y < 0:
player_y = 0
# Нижняя граница
if player_y > HEIGHT - player_height:
player_y = HEIGHT - player_height
# ==============================
Почему WIDTH - player_width?
Потому что координата player_x — это левый край квадрата. Если мы разрешим ему дойти до WIDTH, то правая часть квадрата выйдет за экран.
WIDTH = 800
player_width = 50
Максимальный player_x = 800 - 50 = 750

3.7. АЛЬТЕРНАТИВА: УПРАВЛЕНИЕ WASD
Не все любят стрелки. Добавим поддержку WASD!
Код с двумя вариантами:
keys = pygame.key.get_pressed()
# Влево (стрелка ИЛИ A)
if keys[pygame.K_LEFT] or keys[pygame.K_a]:
player_x = player_x - player_speed
# Вправо (стрелка ИЛИ D)
if keys[pygame.K_RIGHT] or keys[pygame.K_d]:
player_x = player_x + player_speed
# Вверх (стрелка ИЛИ W)
if keys[pygame.K_UP] or keys[pygame.K_w]:
player_y = player_y - player_speed
# Вниз (стрелка ИЛИ S)
if keys[pygame.K_DOWN] or keys[pygame.K_s]:
player_y = player_y + player_speed
Оператор or:
| Выражение | Результат |
|---|---|
|
|
|
|
|
|
|
|
💡 ЗАПОМНИ:
orозначает «или». Достаточно одного истинного условия.
3.8. ПОЛНЫЙ КОД УРОКА 3
import pygame
import sys
# ------- НАСТРОЙКИ ИГРЫ -------
WIDTH = 800
HEIGHT = 600
TITLE = "Моя Первая Игра"
COLOR = (135, 206, 235)
# ------------------------------
# ------- НАСТРОЙКИ ИГРОКА -------
player_x = 100
player_y = 100
player_width = 50
player_height = 50
player_color = (255, 0, 0)
player_speed = 5
# --------------------------------
# Инициализация движка
pygame.init()
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption(TITLE)
# Игровой цикл
running = True
while running:
# Проверка событий
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
# Закрашивание экрана
screen.fill(COLOR)
# === ПРОВЕРЯЕМ НАЖАТИЯ КЛАВИШ ===
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT] or keys[pygame.K_a]:
player_x = player_x - player_speed
if keys[pygame.K_RIGHT] or keys[pygame.K_d]:
player_x = player_x + player_speed
if keys[pygame.K_UP] or keys[pygame.K_w]:
player_y = player_y - player_speed
if keys[pygame.K_DOWN] or keys[pygame.K_s]:
player_y = player_y + player_speed
# =================================
# === ПРОВЕРКА ГРАНИЦ ЭКРАНА ===
if player_x < 0:
player_x = 0
if player_x > WIDTH - player_width:
player_x = WIDTH - player_width
if player_y < 0:
player_y = 0
if player_y > HEIGHT - player_height:
player_y = HEIGHT - player_height
# ==============================
# Рисуем игрока
player_rect = pygame.Rect(player_x, player_y, player_width, player_height)
pygame.draw.rect(screen, player_color, player_rect)
# Обновление экрана
pygame.display.flip()
# Завершение работы
pygame.quit()
sys.exit()
3.9. ПРАКТИЧЕСКИЕ ЗАДАНИЯ
Выполни эти задания, чтобы закрепить материал.
Задание 1. «Пилот»
Запусти код и проверь управление стрелками.
Проверь управление WASD.
Вопрос: Какая система управления тебе удобнее?
Задание 2. «Гонщик»
Измени
player_speedна10— герой движется быстрее.Измени
player_speedна2— герой движется медленнее.Вопрос: Какая скорость оптимальна для управления?
Задание 3. «Дизайнер»
Измени
player_colorна зелёный(0, 255, 0).Измени размер игрока на
80x80.Вопрос: Нужно ли менять проверку границ при изменении размера?
Задание 4. «Телепорт» (для продвинутых)
Добавь проверку: если нажата клавиша
T— телепортируй игрока в центр экрана.
3.10. ДОМАШНЕЕ ЗАДАНИЕ
| № | Задание | Баллы |
|---|---|---|
| 1 | Запустить код из урока без ошибок | 2 |
| 2 | Настроить управление стрелками | 2 |
| 3 | Добавить управление WASD | 2 |
| 4 | Настроить проверку границ экрана | 2 |
| 5 | Изменить скорость на комфортную | 1 |
| 6 | Сделать скриншот и отправить в чат | 1 |
ИТОГО | 10 |
Как сдать:
Сделай скриншот окна с игроком:
Windows:
Win + Shift + SMac:
Command + Shift + 4
Сохрани файл как
Lesson3_ТвоёИмя.png.Отправь файл в чат группы.
Если возникла ошибка — сделай скриншот текста ошибки и отправь с вопросом.
🏆 БОНУС: Если выполнишь Задание 4 («Телепорт») — получишь +3 балла сверх нормы!
3.11. ПРОВЕРЬ СЕБЯ
Ответь на вопросы перед выполнением ДЗ.
Какой оператор используется для проверки равенства?
Что делает
pygame.key.get_pressed()?Почему проверка границ должна быть ПОСЛЕ движения?
Что означает оператор
or?Почему
player_x > WIDTH - player_width, а не простоWIDTH?
👉 Нажми, чтобы увидеть ответы
==(два знака равно)Возвращает состояние всех клавиш (нажаты или нет)
Потому что сначала мы двигаем игрока, потом проверяем, не вышел ли он за границы
«Или» — достаточно одного истинного условия
Потому что координата — это левый край квадрата, нужно учесть его ширину
3.12. ЧАСТЫЕ ОШИБКИ И ИХ РЕШЕНИЕ
| Проблема | Причина | Решение |
|---|---|---|
| Герой не двигается | Код проверки не в цикле while | Проверь отступы! Код должен быть внутри цикла |
Ошибка IndentationError | Неправильные отступы после if | Убедись, что код внутри if сдвинут на 4 пробела или 1 табуляцию |
| Герой проходит сквозь границы | Проверка границ перед движением | Перемести проверку границ ПОСЛЕ изменения координат |
Ошибка NameError | Опечатка в имени переменной | Проверь, везде ли player_x написан одинаково |
| Движение «дёрганое» |
| Уменьши скорость до 3-7 для плавности |
| Не работает WASD | Забыл or между условиями | Проверь: if keys[K_LEFT] or keys[K_a]: |
| Квадрат «застревает» | Границы настроены неправильно | Проверь формулу: WIDTH - player_width |
3.13. ГЛОССАРИЙ ГЛАВЫ
Условие (Condition) — проверка, которая возвращает True или False.
if — «если». Выполняет код, только если условие истинно.
else — «иначе». Выполняет код, если условие ложно.
== — оператор сравнения на равенство (не путать с =!).
or — логический оператор «или». Достаточно одного истинного условия.
Событие (Event) — действие пользователя (нажатие клавиши, клик мыши).
pygame.key.get_pressed() — функция, возвращающая состояние всех клавиш.
pygame.K_LEFT — константа для клавиши «стрелка влево».
Границы (Bounds) — пределы игрового поля, за которые герой не может выйти.
ЗАКЛЮЧЕНИЕ: ЧТО ДАЛЬШЕ?
Ты сделал это! Теперь у тебя есть:
Игровое окно.
Игрок под твоим управлением.
Проверка границ экрана.
Но игра всё ещё скучная: герой один на пустом экране. Нет цели, нет врагов...
В Уроке 4 мы добавим вызов:
| Что будет | Зачем это нужно |
|---|---|
Циклы for | Создавать множество объектов |
Списки [] | Хранить список врагов |
| Случайные числа | Враги появляются в разных местах |
| Первый вызов | Уклоняйся от падающих объектов! |
💡 СОВЕТ: Не удаляй файл
main.py. Пока просто создай копиюLesson3_backup.py. В программировании всегда полезно иметь резервную версию рабочего кода!
До встречи на Уроке 4! Там игра станет по-настоящему интересной — появятся враги!
📌 ГЛАВНОЕ С УРОКА 3
Условия:
ifпроверяет,==сравнивает (не путать с=!).Управление:
pygame.key.get_pressed()для плавного движения.Границы: Проверяй ПОСЛЕ движения, учитывай размер игрока.
Логика:
orпозволяет использовать несколько клавиш для одного действия.
Учебник подготовлен для курса «Python через создание игр».