Гуманитарные науки

Естественные науки

⚛️ Физика

Программирование

🐍 PYTHON ЧЕРЕЗ СОЗДАНИЕ ИГР ☕ Java
Лекторий / PYTHON ЧЕРЕЗ СОЗДАНИЕ ИГР / Урок 3. Управление героем: условия и события
Конспект 🐍 PYTHON ЧЕРЕЗ СОЗДАНИЕ ИГР 21.07.2026

Урок 3. Управление героем: условия и события

УЧЕБНИК КУРСА: «PYTHON ЧЕРЕЗ СОЗДАНИЕ ИГР»

УРОК 3. Управление героем: условия и события

Время на изучение: 1.5-2 часа (включая практику и домашнее задание)


ЦЕЛИ УРОКА

После изучения этого урока ты сможешь:

  • Понимать, как компьютер обрабатывает нажатия клавиш.

  • Использовать условия if/else для проверки событий.

  • Заставить героя двигаться только тогда, когда ты нажимаешь кнопки.

  • Реализовать управление с клавиатуры (стрелки или WASD).

  • Добавить проверку границ экрана (герой не улетит за пределы).

  • Подготовить код к добавлению врагов (на следующем уроке).


СВЯЗЬ С ПРОШЛЫМ УРОКОМ

Что было в Уроке 2Что будет в Уроке 3
Квадрат двигался сам по себеКвадрат двигается только когда ты нажимаешь кнопки
Переменные для позиции игрокаУсловия для проверки нажатий
Игрок улетал за экранИгрок остаётся в пределах окна
Нет взаимодействияТы управляешь игрой своими руками!

💡 НАПОМИНАНИЕ: Если ты пропустил Урок 2 или что-то забыл — открой предыдущую главу учебника. Особенно раздел про систему координат и движение.


3.1. ВВЕДЕНИЕ: ОТ АНИМАЦИИ К ИГРЕ

Привет! В прошлый раз ты создал движущийся квадрат. Он перемещался по экрану автоматически, как заводная игрушка.

Но это ещё не игра.

Игра отличается от анимации тем, что игрок влияет на то, что происходит на экране. Без управления это просто заставка.

Задача Урока 3: Превратить анимацию в игру. Ты научишься:

  1. Отслеживать нажатия клавиш.

  2. Реагировать на них с помощью условий.

  3. Ограничивать движение границами экрана.

К концу урока у тебя будет полноценное управление: герой слушается твоих команд!


3.2. ПОДГОТОВКА ПРОЕКТА

Продолжаем развивать код из Урока 2.

Шаг 1. Создай копию файла

  1. Открой папку Lesson2 в VS Code.

  2. Найди файл main.py.

  3. Сделай копию и назови её main_backup.py (резервная версия).

  4. Создай новую папку Lesson3 и скопируй туда main.py.

Шаг 2. Проверь запуск

  1. Открой main.py в VS Code.

  2. Нажми F5 или кнопку ▶️.

  3. Убедись, что квадрат двигается автоматически (как в Уроке 2).

Если что-то не работает — вернись к Уроку 2, раздел «Частые ошибки».


3.3. УСЛОВИЯ: КАК КОМПЬЮТЕР ПРИНИМАЕТ РЕШЕНИЯ

В жизни ты постоянно принимаешь решения:

  • Если на улице дождь → то возьму зонт.

  • Иначе → пойду без зонта.

В программировании это называется условием.

Конструкция if/else:

# Пример из жизни
погода = "дождь"

if погода == "дождь":
    print("Беру зонт!")
else:
    print("Иду без зонта")

Как это работает:

ЧастьЧто делает

if

«Если условие верно — выполни код ниже»

==

Проверка на равенство (не путать с =!)

:

Двоеточие обязательно! Открывает блок кода
ОтступКод внутри if должен быть сдвинут вправо (4 пробела или Tab)

else

«Иначе — выполни этот код» (необязательно)

Важное правило:

# ПРАВИЛЬНО:
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
ПлюсыМинусы
Плавное движение (пока держишь кнопку)Не подходит для одиночных действий
Идеально для управления героем 

Какой способ использовать?

ДействиеСпособ
Движение героя (влево/вправо)

get_pressed()

Выстрел (один раз на нажатие)

KEYDOWN

Прыжок (один раз на нажатие)

KEYDOWN

Закрытие игры

QUIT


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:

ВыражениеРезультат

True or False

True

False or True

True

True or True

True

False or False

False

💡 ЗАПОМНИ: 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Добавить управление WASD2
4Настроить проверку границ экрана2
5Изменить скорость на комфортную1
6Сделать скриншот и отправить в чат1

ИТОГО

 

10

Как сдать:

  1. Сделай скриншот окна с игроком:

    • Windows: Win + Shift + S

    • Mac: Command + Shift + 4

  2. Сохрани файл как Lesson3_ТвоёИмя.png.

  3. Отправь файл в чат группы.

  4. Если возникла ошибка — сделай скриншот текста ошибки и отправь с вопросом.

🏆 БОНУС: Если выполнишь Задание 4 («Телепорт») — получишь +3 балла сверх нормы!


3.11. ПРОВЕРЬ СЕБЯ

Ответь на вопросы перед выполнением ДЗ.

  1. Какой оператор используется для проверки равенства?

  2. Что делает pygame.key.get_pressed()?

  3. Почему проверка границ должна быть ПОСЛЕ движения?

  4. Что означает оператор or?

  5. Почему player_x > WIDTH - player_width, а не просто WIDTH?

👉 Нажми, чтобы увидеть ответы

  1. == (два знака равно)

  2. Возвращает состояние всех клавиш (нажаты или нет)

  3. Потому что сначала мы двигаем игрока, потом проверяем, не вышел ли он за границы

  4. «Или» — достаточно одного истинного условия

  5. Потому что координата — это левый край квадрата, нужно учесть его ширину


3.12. ЧАСТЫЕ ОШИБКИ И ИХ РЕШЕНИЕ

ПроблемаПричинаРешение
Герой не двигаетсяКод проверки не в цикле whileПроверь отступы! Код должен быть внутри цикла
Ошибка IndentationErrorНеправильные отступы после ifУбедись, что код внутри if сдвинут на 4 пробела или 1 табуляцию
Герой проходит сквозь границыПроверка границ перед движениемПеремести проверку границ ПОСЛЕ изменения координат
Ошибка NameErrorОпечатка в имени переменнойПроверь, везде ли player_x написан одинаково
Движение «дёрганое»

player_speed слишком большой

Уменьши скорость до 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

  1. Условия: if проверяет, == сравнивает (не путать с =!).

  2. Управление: pygame.key.get_pressed() для плавного движения.

  3. Границы: Проверяй ПОСЛЕ движения, учитывай размер игрока.

  4. Логика: or позволяет использовать несколько клавиш для одного действия.


Учебник подготовлен для курса «Python через создание игр».

МВ
Материал подготовил
Михаил Владимирович С.
Преподаватель физики и информатики
Страница преподавателя →