$ sudo teach IT
Модуль 1 · Первое окно · Урок 1.2

Установка и первое окно

Вы поставите Python и pygame-ce в отдельное виртуальное окружение и откроете окно, которое закрывается крестиком.

Теория + практика~25 минутНовичок

Мы знаем, что игра — это бесконечная смена кадров. Но пока это были слова: чтобы картина ожила, нужно поставить инструменты и открыть окно, которое ведёт себя как нормальное.

Python и папка проекта

Сначала проверим, что Python у вас вообще есть. Нужна версия 3.15 с python.org. На Windows при установке поставьте галочку Add python.exe to PATH, иначе терминал не найдёт команду python. Откройте терминал и спросите версию.

Терминал
python --version
Вывод
Python 3.15.2

На macOS и Linux команда может называться python3 — тогда подставляйте её вместо python везде ниже.

Создайте папку проекта kometa (наша аркада «Комета») и перейдите в неё.

Терминал
mkdir kometa
cd kometa

Виртуальное окружение

Представьте, что у каждого проекта есть своя коробка с инструментами: библиотеки одного проекта не мешают другому. Без коробок всё свалилось бы в общую кучу, и проекты спорили бы о версиях.

Такая коробка называется виртуальным окружением (venv) — это папка внутри проекта, где живут его пакеты. Создаёт её встроенный модуль venv; папку принято называть .venv.

Терминал
python -m venv .venv

Теперь окружение нужно активировать — сказать терминалу, что работаем с этой коробкой.

Терминал · Windows
.venv\Scripts\activate
Терминал · macOS и Linux
source .venv/bin/activate

В начале строки появится (.venv) — коробка открыта. В каждом новом терминале активацию повторяют.

Windows и политика запуска скриптов

Если PowerShell ругается на запрет запуска скриптов, выполните ту же команду в обычной командной строке cmd.

Ставим pygame-ce

Пакеты ставит программа pip — она скачивает их из каталога PyPI. Мы берём не классический pygame, а живую ветку pygame-ce; в коде она подключается тем же import pygame.

Терминал
pip install pygame-ce

Проверим встроенным примером — готовой игрой из самой библиотеки.

Терминал
python -m pygame.examples.aliens

Открылась космическая стрельба — значит, всё настроено. Закройте её крестиком.

Почему pygame-ce, а не pygame

Классический pygame 2.6.1 (2024) собран только до Python 3.13 и на 3.15 не поставится готовым. У pygame-ce сборки есть для 3.10–3.15. Ставьте что-то одно: оба пакета дают модуль pygame и конфликтуют.

Первое окно

Откройте kometa в VS Code и создайте файл main.py. Сначала подключим библиотеку и попросим показать окно.

Python · фрагмент
import pygame

pygame.init()
screen = pygame.display.set_mode((960, 640))
pygame.display.set_caption("Комета")

Разбор по строкам

  • import pygame — подключаем библиотеку.
  • pygame.init() — запускает внутренние части библиотеки; вызываем один раз в начале.
  • pygame.display.set_mode((960, 640)) — создаёт окно 960 на 640 пикселей. Пара чисел в скобках — кортеж (tuple): несколько значений как одно. Ширина и высота передаются одним аргументом, отсюда двойные скобки.
  • screen = ... — функция возвращает поверхность (Surface), прямоугольник из пикселей, который показывает окно. Всё в игре мы рисуем на screen.
  • pygame.display.set_caption("Комета") — заголовок окна.

Числа и название вынесем в константы — переменные с именами заглавными буквами, которые не меняются: WIDTH = 960, HEIGHT = 640, TITLE = "Комета". Так размер правится в одном месте. Ещё BG_COLOR = (12, 14, 32) — цвет (красный, зелёный, синий), числа от 0 до 255: тёмно-синий, как ночное небо.

Почему окно закрывается или «не отвечает»

Запустите этот фрагмент: окно мигнёт и пропадёт, ведь программа дошла до конца файла и завершилась. Нужен игровой цикл: программа живёт, пока игрок сам не закроет окно.

Но одного цикла мало. Система присылает программе сообщения: мышь двинулась, нажат крестик. Если их не читать, окно получит пометку «Не отвечает». В pygame эти сообщения называются событиями (events) и копятся в очереди событий; каждый кадр мы забираем их все.

Python · фрагмент
import pygame

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

pygame.quit()

Разбор по строкам

  • running = True — флаг: пока он истинен, игра идёт.
  • while running: — один проход цикла — один кадр.
  • pygame.event.get() — отдаёт события из очереди и очищает её.
  • for event in ... — перебирает события; текущее лежит в event.
  • event.type == pygame.QUIT — у события есть тип; pygame.QUIT значит, что игрок нажал крестик.
  • running = False — опускаем флаг, и цикл завершится.
  • pygame.quit() — выключает то, что включил init().

Осталось показать результат: каждый кадр закрашиваем окно методом fill и вызываем pygame.display.flip() — «показать нарисованное». Считайте, что рисуем за кулисами, а flip раздвигает занавес; подробности — в следующем уроке.

Практика: окно «Кометы»

Соберём всё в kometa/main.py (окружение активно).

Python · kometa/main.py
import pygame

WIDTH = 960
HEIGHT = 640
TITLE = "Комета"
BG_COLOR = (12, 14, 32)

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(BG_COLOR)
    pygame.display.flip()

pygame.quit()

Разбор по строкам

  • Строки 3–6 — константы.
  • Строки 8–10 — включаем pygame, создаём и подписываем окно.
  • Строки 12–16 — цикл и обработка крестика.
  • Строка 18 — fill красит поверхность; стоит внутри while, но вне for: раз за кадр, а не на каждое событие.
  • Строки 19 и 21 — показываем кадр и выключаем pygame после цикла.

Запустите python main.py. Должно открыться тёмно-синее окно 960 на 640 с заголовком «Комета», которое закрывается крестиком.

Проверьте себя

  • В терминале перед приглашением видно (.venv), а python -m pygame.examples.aliens открывает игру.
  • Окно с заголовком «Комета» и тёмно-синим (не чёрным) фоном.
  • Крестик закрывает окно, ошибок в терминале нет.
  • Если убрать цикл событий, окно перестаёт реагировать на крестик — верните всё обратно.

Частые ошибки

ModuleNotFoundError: No module named 'pygame'

Почему: запущен не тот Python, куда ставили пакет.

Что делать: активируйте .venv, повторите pip install pygame-ce и запускайте из той же консоли.

Окно открылось и сразу пропало

Почему: нет цикла while, программа завершилась.

Что делать: добавьте while running.

Окно висит с надписью «Не отвечает», крестик не работает

Почему: события не читаются.

Что делать: поставьте for event in pygame.event.get() внутрь while.

AttributeError: partially initialized module 'pygame' has no attribute 'init'

Почему: файл назван pygame.py и импортируется вместо библиотеки.

Что делать: переименуйте в main.py.

Что важно запомнить

  • У каждого проекта своё виртуальное окружение: python -m venv .venv, затем активация; активировать нужно в каждом новом терминале.
  • Ставим pip install pygame-ce, а в коде пишем import pygame. Пакеты pygame и pygame-ce вместе не ставим.
  • Окно создаёт pygame.display.set_mode((WIDTH, HEIGHT)), размер передаётся одной парой чисел.
  • Без цикла программа сразу завершается, а без чтения событий окно «не отвечает».
  • Крестик приходит как событие pygame.QUIT; в ответ опускаем флаг running, выходим из цикла и вызываем pygame.quit().
  • В каждом кадре: события, fill, flip.

Дальше заставим цикл работать по-настоящему: часы, 60 кадров в секунду и dt — время кадра в секундах.

На следующий урок