Pygame: секреты тёмной магии программирования игр
Часть 1
Оглавление
Глава 1. Открываем дверь в мир игор
Глава 2. Художник-мазилка, или как нарисовать квадрат Малевича за 5 минут
Глава 3. Мастер размытых снимков и обрезанных голов
Глава 4: "Движение - это жизнь, или как заставить игру плясать под нашу дудку"
Глава 5. "Анимация, звуки и буквы, или как превратить квадрат в звезду экрана"
Глава 6: "Столкновения и взаимодействия, или как подружить (или подрать) квадраты"
Глава 7. "Змейка": От гастрономического восторга до полного обжорства!
Глава 8. Платформер
Глава 1. Открываем дверь в мир игр
Для начала, представьте себе, что Pygame - это не просто библиотека, а волшебный набор инструментов, с помощью которых мы будем создавать настоящие чудеса на экране нашего компьютера.
Шаг 1: Установка волшебного набора
Как и любому волшебнику, нам нужно сначала установить Pygame. Для этого открываем наш магический терминал (командную строку) и произносим заклинание:
pip install pygame
После этого Pygame будет установлен, и мы сможем приступить к созданию нашей игры.
Шаг 2: Создание волшебного окна
Теперь нам нужно создать окно, в котором будет происходить все волшебство. Для этого мы используем следующие команды:
import pygame # Импортируем наш волшебный набор
() # Запускаем магический кристалл
screen = ((800, 600)) # Открываем портал в другой мир
Здесь мы создали окно размером 800 на 600 пикселей. Это будет наш холст, на котором мы будем рисовать нашу игру.
Шаг 3: Запускаем волшебный цикл
Теперь нам нужно запустить бесконечный цикл, в котором будет происходить все действие нашей игры. Для этого мы используем следующий код:
running = True # Начинаем наше приключение
while running: # Пока приключение не закончится
for event in (): # Получаем все события, которые произошли
if == pygame.QUIT: # Если нажали на крестик
running = False # Закрываем портал
() # Рисуем нашу магию на экране
В этом цикле мы постоянно проверяем, не произошло ли каких-либо событий, например, нажатие клавиши или движение мыши. Если произошло событие выхода из игры, то мы завершаем цикл и закрываем окно.
Шаг 4: Завершение волшебства
После того, как цикл завершен, нам нужно закрыть окно и завершить работу с Pygame. Для этого мы используем следующую команду:
()# Закрываем портал
Вот и все! Мы создали нашу первую игру на Pygame! Конечно, пока она ничего не делает, но это только начало нашего волшебного путешествия в мир разработки игр.

В следующих уроках мы будем добавлять в нашу игру различные элементы, такие как персонажи, враги, препятствия и многое другое. И, конечно же, мы будем делать это с юмором и комическими комментариями, чтобы обучение было не только полезным, но и интересным!
Глава 2. Художник-мазилка, или как нарисовать квадрат Малевича за 5 минут
Привет, юные Пикассо! Сегодня мы с вами будем постигать тайны живописи в мире Pygame. Забудьте про кисти и холсты, ведь у нас есть кое-что покруче — функции для рисования!
Шаг 1: Разминаем пальцы
Для начала, как и перед любой зарядкой, разомнем наши пальцы, то есть импортируем Pygame и запустим его магический кристалл:
import pygame
()
Шаг 2: Холст размером с экран
Теперь нам нужен холст, на котором мы будем творить наши шедевры. Создадим окошко, размером с хороший такой монитор:
screen = ((800, 600))
Шаг 3: Краски, кисти... эй, где они?
А вот и наши краски! Точнее, функции для рисования. Pygame предлагает нам целую палитру возможностей:
() — рисует прямоугольники, как будто вы вырезаете их из бумаги.
() — рисует круги, такие же ровные, как блинчики на сковородке.
() — рисует линии, прямые, как стрела, или кривые, как... ну, вы поняли.
Шаг 4: Мастер-класс по рисованию квадрата Малевича
Давайте нарисуем что-нибудь простое, например, квадрат. Берем нашу "кисть" (), выбираем "краску" (цвет) и рисуем:
(screen, (255, 0, 0), (100, 100, 200, 150))
Этот код нарисует красный квадрат с координатами (100, 100), шириной 200 и высотой 150. Красота!
Важно! Цвет мы указуем у формате RGB (red, green, blue). В интернете поищите что это такое...
Шаг 5: А теперь круг!
А теперь попробуем нарисовать круг. Берем "кисть" (), выбираем "краску" и рисуем:
(screen, (0, 255, 0), (400, 300), 50)
Этот код нарисует зеленый круг с центром в точке (400, 300) и радиусом 50. Ну, разве не чудо?
Шаг 6: Линия жизни
И напоследок, нарисуем линию. Берем "кисть" (), выбираем "краску" и рисуем:
(screen, (0, 0, 255), (50, 50), (750, 550), 5)
Этот код нарисует синюю линию толщиной 5 пикселей, идущую из точки (50, 50) в точку (750, 550). Прямо как линия жизни на кардиограмме!
Шаг 7: Запускаем и любуемся
Чтобы увидеть наши шедевры на экране, нужно запустить игровой цикл и обновлять экран с помощью функции ():
running = True
while running:
for event in ():
if == pygame.QUIT:
running = False
# Рисуем фигуры здесь
()
()
Вставьте код для рисования фигур внутрь игрового цикла перед функцией (), и вы увидите их на экране.

Домашнее задание
Нарисуйте на экране разноцветные фигуры, как будто вы попали в мир абстракционизма.
Попробуйте создать свою собственную картину, используя только фигуры. Может быть, это будет портрет вашего кота или пейзаж за окном?
Не бойтесь экспериментировать и творить! Удачи вам в мире Pygame!
Глава 3. Мастер размытых снимков и обрезанных голов
Сегодня мы поработаем с картинками (или фотографиями).
Шаг 1: Готовим сцену
Как и перед любым представлением, нам нужно подготовить сцену. То есть, импортировать Pygame и создать окно:
import pygame
()
screen = ((800, 600))
Шаг 2: Ищем картинки
Теперь нам нужно найти картинки, которые мы будем показывать в игре. Вы можете взять любые картинки, которые вам нравятся, главное, чтобы они были в формате PNG, JPG или BMP.
Шаг 3: Загружаем картинки
После того, как вы нашли картинки, их нужно загрузить в Pygame. Для этого используется функция (). Ей нужно передать путь к файлу с картинкой:
image = ("")
Шаг 4: Показываем картинки
Теперь, когда картинка загружена, ее можно показать на экране с помощью функции (). Ей нужно передать картинку и координаты, где ее нужно показать:
(image, (100, 100))
Шаг 5: Запускаем и любуемся
Чтобы увидеть картинку на экране, нужно запустить игровой цикл и обновить экран с помощью функции ():
running = True
while running:
for event in ():
if == pygame.QUIT:
running = False
(image, (100, 100))
()
()
Вставьте код для загрузки и отображения картинки внутрь игрового цикла перед функцией (), и вы увидите ее на экране.

Домашнее задание
Найдите в интернете несколько разных картинок и попробуйте показать их на экране.
Глава 4: "Движение - это жизнь, или как заставить игру плясать под нашу дудку"
Привет, юные режиссеры-мультипликаторы! Сегодня мы будем учить наши игры двигаться. Да-да, как настоящие звезды Голливуда!
Шаг 1: Разгоняемся
Как и перед любым забегом, нам нужно размяться. То есть, импортировать Pygame и создать окно:
import pygame
()
screen = ((800, 600))
Шаг 2: Создаем подопытного
Теперь нам нужен объект, который мы будем двигать. Это может быть что угодно - квадрат, круг, картинка с котиком. Давайте для примера создадим красный квадрат:
x = 100
y = 100
width = 50
height = 50
color = (255, 0, 0)
Шаг 3: Запускаем двигатель
Чтобы наш квадрат начал двигаться, нам нужно изменять его координаты. Для этого мы можем использовать переменные x и y, которые мы задали ранее. Например, чтобы квадрат двигался вправо, мы можем увеличивать значение x на 1 каждый кадр:
x += 1
Шаг 4: Управляем движением
Конечно, просто двигать квадрат вправо - это не очень интересно. Гораздо интереснее, когда мы можем управлять движением с помощью клавиатуры или мыши. Для этого Pygame предоставляет специальные функции. Например, чтобы квадрат двигался вверх при нажатии на клавишу "W", мы можем использовать следующий код:
keys = ()
if keys[pygame.K_w]:
y -= 1
Интересно!
Представьте себе, что ваш экран - это волшебная доска, где всё наоборот. Вместо того, чтобы идти вверх, когда вы увеличиваете число, вы идёте вниз! А чтобы пойти вверх, нужно уменьшить число!
Это как будто вы попали в Зазеркалье, где всё наоборот. Там, чтобы подняться на гору, нужно копать яму, а чтобы спуститься - строить башню!
Вот и с координатами в Pygame такая же история. Чтобы ваш квадратик пополз вверх, как жучок, нужно уменьшить его координату Y. Ведь чем меньше это число, тем ближе квадратик к "верху" экрана, который на самом деле находится внизу!
Это может показаться запутанным, но на самом деле всё очень просто. Главное - запомнить, что в Pygame, как и в Зазеркалье, всё наоборот!
Шаг 5: Запускаем и любуемся
Чтобы увидеть, как наш квадрат двигается, нужно запустить игровой цикл и обновить экран с помощью функции ():
running = True
while running:
for event in ():
if == pygame.QUIT:
running = False
((0, 0, 0)) # Очищаем экран (заливаем черным цветом)
# Рисуем квадрат
(screen, color, (x, y, width, height))
# Обновляем экран
()
()
Вставьте код для изменения координат и управления движением внутрь игрового цикла перед функцией (), и вы увидите, как ваш квадрат начнет двигаться.

Домашнее задание
Создайте игру, в которой персонаж может двигаться по экрану с помощью клавиш.
Внимание! Пока наш персонаж будет двигаться резковато, но всё это дело времени...
Глава 5. "Анимация, звуки и буквы, или как превратить квадрат в звезду экрана"
Я думаю вы серьёзно отнеслись к выполнению домашнего задания и научили нашу "звезду" бегать по экрану. Берём наш проект, он сейчас выглядит как-то так:
import pygame
()
screen = ((800, 600))
# Шаг 2: Создаем подопытного (красный квадрат)
x = 100 # Начальная координата X
y = 100 # Начальная координата Y
width = 50 # Ширина квадрата
height = 50 # Высота квадрата
color = (255, 0, 0) # Красный цвет
running = True
while running:
for event in ():
if == pygame.QUIT:
running = False
((0, 0, 0)) # Очищаем экран (заливаем черным цветом)
# Рисуем квадрат
(screen, color, (x, y, width, height))
keys = ()
if keys[pygame.K_w]:
y -= 1
if keys[pygame.K_s]:
y += 1
if keys[pygame.K_d]:
x += 1
if keys[pygame.K_a]:
x -= 1
# Обновляем экран
()
()
И продолжаем работу. Сегодня наш квадрат будет не просто ползать, а танцевать! Для этого нам нужно несколько кадров анимации. Представьте себе, что это как комикс, где каждый кадр показывает немного изменённое положение квадрата.
Способ 1: Изменение параметров квадрата
Самый простой способ — это изменять параметры квадрата (например, размер, цвет, положение) в каждом кадре.
# В игровом цикле:
# ... (другой код)
# Анимация: изменяем размер квадрата
if width < 100:
width += 1
else:
width = 50
# ... (другой код)
"Наш квадрат решил стать то толстым, то худым! Прямо как настоящий актёр!" Но это не наш уровень... Мы же великие хацкеры! У нас должно быть всё по крутому!

Способ 2: Загрузка изображений
Более сложный, но и более интересный способ — это загрузить несколько изображений, которые будут представлять разные кадры анимации.
import pygame
()
screen = ((800, 600))
# Шаг 2: Создаем подопытного (красный квадрат)
x = 100 # Начальная координата X
y = 100 # Начальная координата Y
# Загружаем изображения для анимации
try:
image1 = ("квадрат1.png")
image2 = ("квадрат2.png")
image3 = ("квадрат3.png")
images = [image1, image2, image3] # Список изображений
current_image = 0 # Индекс текущего изображения
except FileNotFoundError:
print("Ошибка: не удалось загрузить изображения. Проверьте наличие файлов квадрат1.png, квадрат2.png и квадрат3.png в папке с игрой.")
()
exit()
running = True
while running:
for event in ():
if == pygame.QUIT:
running = False
# ***ВОТ ОН, ГЛАВНЫЙ ГЕРОЙ!***
((0, 0, 0)) # Очищаем экран (заливаем черным цветом)
# Анимация: показываем разные изображения по очереди
(images[current_image], (x, y)) # Отображаем текущее изображение
current_image = (current_image + 1) % len(images) # Переключаемся на следующее изображение (зацикливаем)
keys = ()
if keys[pygame.K_w]:
y -= 1
if keys[pygame.K_s]:
y += 1
if keys[pygame.K_a]:
x -= 1
if keys[pygame.K_d]:
x += 1
# Шаг 5: Обновляем экран
()
()
#Так, здесь я решил добавить ещё обработку ошибок, ну вы код посмотрите, там всё просто;)
"Наш квадрат решил примерить разные костюмы! Сегодня он будет то в полоску, то в горошек, то в клеточку!"
Способ 3: Использование спрайтов
Самый продвинутый способ — это использовать спрайты. Спрайты — это специальные объекты, которые предназначены для хранения и управления анимацией. Здесь всё сложно, поэтому без шуток!
Часть 1.
import pygame
()
screen = ((800, 600))
# Создаём класс спрайта
class MySprite():
def __init__(self):
__init__(self)
try:
self.images = [("квадрат1.png"), ("квадрат2.png"), ("квадрат3.png")]
self.image = self.images[0]
self.rect = self.image.get_rect()
self. = [100, 100]
self.frame = 0
self.x = 100 # Для перемещения
self.y = 100 # Для перемещения
self.speed = 5 # Скорость перемещения
except FileNotFoundError:
print("Ошибка: не удалось загрузить изображения. Проверьте наличие файлов квадрат1.png, квадрат2.png и квадрат3.png в папке с игрой.")
()
exit()
class MySprite(): - Создаем класс MySprite, который "наследуется" от класса Это значит, что наш спрайт будет обладать всеми свойствами спрайтов Pygame.
(self) - Инициализируем родительский класс Sprite. Это нужно сделать обязательно.
= [...] - Загружаем изображения для анимации и сохраняем их в списке Тут предполагается, что у вас есть три файла: квадрат1.png, квадрат2.png и квадрат3.png.
= [0] - Устанавливаем текущее изображение спрайта на первое из загруженных.
= () - Получаем прямоугольник (rect) изображения. Rect хранит информацию о положении и размере изображения. Он нам нужен для отрисовки и обработки столкновений.
= [100, 100] - Устанавливаем начальное положение спрайта.
= 0 - Переменная для хранения текущего кадра анимации.
self.x = 100, self.y = 100, = 5 - Переменные для хранения координат и скорости спрайта. Они нужны для перемещения.
try...except - Конструкция для обработки ошибок. Если файлы изображений не будут найдены, программа выведет сообщение и завершит работу.
Часть 2.
def update(self):
self.image = self.images[self.frame]
self.frame = (self.frame + 1) % len(self.images)
keys = ()
if keys[pygame.K_w]:
self.y -= self.speed
if keys[pygame.K_s]:
self.y += self.speed
if keys[pygame.K_a]:
self.x -= self.speed
if keys[pygame.K_d]:
self.x += self.speed
self. = [self.x, self.y] # Обновляем положение спрайта
= [] - Меняем изображение спрайта на текущий кадр анимации.
= ( + 1) % len() - Переключаемся на следующий кадр анимации. % len() обеспечивает циклическое переключение.
Обработка нажатий клавиш W, A, S, D - Изменяем координаты self.x и self.y для перемещения спрайта.
= [self.x, self.y] - Самое важное: обновляем положение rect спрайта в соответствии с новыми координатами. Без этого спрайт не будет двигаться на экране.
Часть 3.
# Создаём группу спрайтов
all_sprites = ()
my_sprite = MySprite()
(my_sprite)
all_sprites = () - Создаем группу спрайтов. В этой группе будут храниться все наши спрайты.
my_sprite = MySprite() - Создаем экземпляр нашего спрайта.
(my_sprite) - Добавляем спрайт в группу.
Часть 4.
running = True
while running:
for event in ():
if == pygame.QUIT:
running = False
((0, 0, 0)) # Очищаем экран
() # Обновляем спрайты (анимация и перемещение)
(screen) # Рисуем *только* спрайты
() # Обновляем экран
()
((0, 0, 0)) - Очищаем экран.
() - Обновляем состояние всех спрайтов в группе (анимация и перемещение).
(screen) - Отрисовываем все спрайты на экране. Pygame сам позаботится о правильном порядке отрисовки.
() - Обновляем экран.

Домашнее задание
А вы думали я забуду?;)
Создайте спрайт квадрата с анимацией (например, изменение цвета или размера). Квадрат должен "танцевать" (изменять анимацию) при нажатии на пробел.
Придумайте для квадрата "танцевальные движения" и опишите их в комментариях к коду.
Подсказка: Используйте () для обработки нажатия клавиши пробел.
Глава 6: "Столкновения и взаимодействия, или как подружить (или подрать) квадраты"
Шаг 1. Готовим арену
import pygame
()
screen = ((800, 600))
clock = () # Для контроля FPS (частоты кадров)
Шаг 2: Создаём наших гладиаторов (спрайты) - теперь каждый сам по себе!
Сегодня у нас будет два квадрата - один главный герой (наш "чемпион"), а другой - его "спарринг-партнер" (или "злодей"). Создадим для каждого отдельный класс, чтобы они не путались под ногами друг у друга:
class Player(): # Наш "чемпион"
def __init__(self, image_path, x, y):
__init__(self)
try:
self.image = (image_path)
self.rect = self.image.get_rect()
self. = [x, y]
self.x = x
self.y = y
self.speed = 5
self.move_direction = [0, 0] # Вектор направления
except FileNotFoundError:
print(f"Ошибка: не удалось загрузить изображение {image_path}")
()
exit()
def update(self): # Движение "чемпиона"
self.x += self.move_direction[0] * self.speed
self.y += self.move_direction[1] * self.speed
self. = [self.x, self.y]
class Enemy(): # Наш "злодей"
def __init__(self, image_path, x, y):
__init__(self)
try:
self.image = (image_path)
self.rect = self.image.get_rect()
self. = [x, y]
self.x = x
self.y = y
self.speed = 3 # Скорость "злодея" может отличаться
except FileNotFoundError:
print(f"Ошибка: не удалось загрузить изображение {image_path}")
()
exit()
def update(self): # Автоматическое движение "злодея" (пример)
self.x += self.speed
if self.x > 800 - self.image.get_width() or self.x < 0:
self.speed *= -1 # Меняем направление
self. = [self.x, self.y]
# Создаём наших бойцов
player = Player("квадрат1.png", 100, 100) # "Чемпион"
enemy = Enemy("квадрат2.png", 300, 200) # "Злодей"
# Создаём группы спрайтов - для каждого своя "банда"!
all_sprites = () # Все, кто на арене
(player)
(enemy)
enemies = () # Только "злодеи"
(enemy)
players = () # Только "чемпионы"
(player)
Шаг 3: Пишем сценарий боя
Самое зрелищное сегодня - это научить наших квадратов сталкиваться! Для этого у Pygame есть специальная функция () (наш "судья"):
# Проверяем столкновения
collisions = (players, enemies, False, True)
# Обрабатываем столкновения
if collisions:
print("Столкновение!")
for enemy in collisions:
(enemy)
Это можете засунуть либо перед событиями, либо после...
Шаг 4: Оживляем гладиаторов (обновление и отрисовка) - с учетом плавности!
running = True
while running:
for event in ():
if == pygame.QUIT:
running = False
if == pygame.KEYDOWN:
if == pygame.K_w:
player.move_direction[1] = -1
if == pygame.K_s:
player.move_direction[1] = 1
if == pygame.K_a:
player.move_direction[0] = -1
if == pygame.K_d:
player.move_direction[0] = 1
if == pygame.KEYUP:
if == pygame.K_w or == pygame.K_s:
player.move_direction[1] = 0
if == pygame.K_a or == pygame.K_d:
player.move_direction[0] = 0
((0, 0, 0))
Шаг 5. Опускаем занавес
()
(screen)
()
(60) # Контролируем FPS
()

Если вы заметили, то здесь мы используем другой способ получения нажатия клавиш, так как движение при нём более плавное! Этот способ немного сложнее, поэтому покажу как его использовать на примере урока 4!
(Так вы точно всё поймёте, надеюсь...)
import pygame
()
screen = ((800, 600))
# Шаг 2: Создаем подопытного (красный квадрат)
x = 100 # Начальная координата X
y = 100 # Начальная координата Y
width = 50 # Ширина квадрата
height = 50 # Высота квадрата
color = (255, 0, 0) # Красный цвет
running = True
while running:
for event in ():
if == pygame.QUIT:
running = False
if == pygame.KEYDOWN:
if == pygame.K_w:
y -= 5 # Поставьте пять пикселей (один мало)
if == pygame.K_s:
y += 5
if == pygame.K_a:
x -= 5
if == pygame.K_d:
x += 5
((0, 0, 0)) # Очищаем экран (заливаем черным цветом)
# Рисуем квадрат
(screen, color, (x, y, width, height))
# Обновляем экран
()
()
Домашнее задание
Реакция на "удар": Добавьте разные реакции на столкновение (например, "чемпион" теряет "здоровье", игра заканчивается).
Глава 7. "Змейка": От гастрономического восторга до полного обжорства!
Приветствую, юные программисты-кулинары! Сегодня мы с вами не просто код напишем, а сотворим гастрономическое чудо! Мы создадим... ЗМЕЙКУ! Да-да, ту самую, что ползает по экрану и уплетает всё, что под руку попадётся. Приготовьтесь к захватывающему путешествию в мир пиксельной кулинарии!
Шаг 1: "Кухня" (Инициализация)
Для начала нам понадобится "кухня", где мы будем колдовать над нашей змейкой. Импортируем Pygame (наш "кухонный комбайн") и настраиваем всё необходимое:
import pygame
import random # Для случайного расположения "еды" (а вдруг это просроченные чипсы?)
() # "Врубаем комбайн на полную мощность!"
# Цвета...ммм, пальчики оближешь!
black = (0, 0, 0) # "Ночной кошмар гурмана" (фон)
red = (213, 50, 80) # "Помидорка-убийца" (game over)
green = (0, 255, 0) # "Огурец-соблазнитель" (еда)
blue = (50, 153, 213) # "Небесно-голубая мечта обжоры" (фон)
# Размеры "стола" (дисплея)
dis_width = 800
dis_height = 600
dis = ((dis_width, dis_height)) # "Накрываем на стол скатерть-самобранку"
('Snake Game: Объедение') # "Объявляем меню из 1000 блюд"
clock = () # "Ставим таймер, чтобы всё не сгорело"
snake_block = 10 # Размер "кубика" змейки (наш "ингредиент")
snake_speed = 15 # Скорость "поедания" пикселей (чем быстрее, тем больше съешь!)
font_style = ("bahnschrift", 25) # Шрифт для "криков" "Game Over" ("Ой, всё!")
score_font = ("comicsansms", 35) # Шрифт для "хвастовства" (счет) ("А я сегодня съел 200 пикселей!")
Шаг 2: "Рецепты" (Функции)
Теперь нам нужны "рецепты", то есть функции, которые будут отвечать за разные аспекты игры:
def your_score(score): # "Хвастаемся" количеством съеденного ("А я сегодня - 10!")
value = ("Your Score: " + str(score), True, black) # "Пишем мелом на доске почёта"
(value, [0, 0]) # "Вешаем доску в угол"
def our_snake(snake_block, snake_list): # "Сервируем" змейку (как умеем!)
for x in snake_list:
(dis, black, [x[0], x[1], snake_block, snake_block]) # Рисуем "кубики" ("Вот они, мои любимые!")
def message(msg, color): # "Кричим" "Game Over" ("Всё, я больше не могу!")
mesg = (msg, True, color) # "Пишем транспарант"
(mesg, [dis_width / 6, dis_height / 3]) # "Вешаем транспарант на самое видное место"
# ... (gameLoop() будет ниже)
Шаг 3: "Готовим блюдо" (gameLoop())
Самое интересное — это "приготовление блюда", то есть основной игровой цикл:
def gameLoop():
game_over = False # "Всё съедено?" (Ещё нет!)
game_close = False # "Объелись?" (Пока держимся!)
x1 = dis_width / 2 # Начальное положение змейки - "в центре стола" (где больше всего вкусняшек)
y1 = dis_height / 2
x1_change = 0 # Изменение координат по X (как ползём?)
y1_change = 0 # Изменение координат по Y (иногда и боком можно)
snake_List = [] # "Список ингредиентов" (сегменты змейки - "чем больше, тем лучше!")
Length_of_snake = 1 # "Длина колбаски" (начальная длина - "скромненько, но со вкусом")
foodx = round((0, dis_width - snake_block) / 10.0) * 10.0 # "Где лежит огурец?" (случайное положение еды - "а вдруг это завалялось в холодильнике?")
foody = round((0, dis_height - snake_block) / 10.0) * 10.0
while not game_over: # "Пока змейка голодна..." (и любопытна)
while game_close == True: # "Ой, кажется, объелись!" (или врезались в стену от переедания)
(blue) # "Чистим стол" (от объедков)
message("You Lost! Press Q-Quit or C-Play Again", red) # "Кричим" о поражении ("Ай-яй-яй!")
your_score(Length_of_snake - 1) # "Хвастаемся" последним счетом ("Могло быть и лучше!")
() # "Показываем результат" (чтобы все видели, какой ты обжора!)
for event in (): # "Разбираем жалобы" (события - "на боль в животе")
if == pygame.KEYDOWN:
if == pygame.K_q: # "Уходим с кухни" ("Всё, я на диету!")
game_over = True
game_close = False
if == pygame.K_c: # "Готовим еще раз!" ("Ну, ещё разочек!")
gameLoop() # "Повторяем подвиг!"
for event in (): # "Получаем команды от повара" (события - "куда ползти, ненасытная?")
if == pygame.QUIT: # "Повар ушел" ("Оставив змейку голодной!")
game_over = True
if == pygame.KEYDOWN: # "Получили указание, куда ползти" ("Главное - к еде!")
if == pygame.K_LEFT and x1_change != snake_block: # "Влево! Там, кажется, что-то блестит!" (но не врезаться в себя!)
x1_change = -snake_block
y1_change = 0
elif == pygame.K_RIGHT and x1_change != -snake_block: # "Вправо! Может, там вкуснее?" (и снова - не врезаться!)
x1_change = snake_block
y1_change = 0
elif == pygame.K_UP and y1_change != snake_block: # "Вверх! А вдруг там висит что-то вкусненькое?" (и опять - не врезаться!)
y1_change = -snake_block
x1_change = 0
elif == pygame.K_DOWN and y1_change != -snake_block: # "Вниз! Может, там кто-то уронил что-то съедобное?" (и в последний раз - не врезаться!)
y1_change = snake_block
x1_change = 0
if x1 >= dis_width or x1 < 0 or y1 >= dis_height or y1 < 0: # "Врезались в стену
game_close = True # "Всё, финита ля комедия!" (врезались)
x1 += x1_change # "Ползём дальше" (если не врезались)
y1 += y1_change
(blue) # "Чистим стол" (готовим для новых подвигов)
(dis, green, [foodx, foody, snake_block, snake_block]) # "Кладём огурец на стол" (случайным образом)
snake_Head = [] # "Головка змейки" (самый важный ингредиент)
(x1) # "Добавляем голову в список" (чтобы знать, где она была)
(y1)
(snake_Head) # "Записываем координаты головы" (для истории)
if len(snake_List) > Length_of_snake: # "Если змейка слишком длинная..." (пора "урезать")
del snake_List[0] # "Удаляем последний элемент" (хвост)
for x in snake_List[:-1]: # "Проверяем, не съела ли змейка сама себя" (а то всякое бывает)
if x == snake_Head: # "Ой, кажется, объелись!" (и врезались в себя)
game_close = True # "Всё, это фиаско!"
our_snake(snake_block, snake_List) # "Сервируем змейку" (на блюде)
your_score(Length_of_snake - 1) # "Хвастаемся счетом" (пока есть чем хвастаться)
() # "Показываем блюдо" (во всей красе)
if x1 == foodx and y1 == foody: # "Змейка нашла огурец!" (и съела его)
foodx = round((0, dis_width - snake_block) / 10.0) * 10.0 # "Ищем новый огурец" (а то змейка опять проголодается)
foody = round((0, dis_height - snake_block) / 10.0) * 10.0
Length_of_snake += 1 # "Змейка подросла!" (от обжорства)
(snake_speed) # "Запускаем таймер" (чтобы змейка не ползала слишком быстро)
() # "Убираем со стола" (закрываем игру)
quit() # "Всё, мы закончили!" (можно отдохнуть)
gameLoop() # "Начинаем готовить!" (запускаем игру)

Добавим паузу!
import pygame
import random
()
# Определение цветов
black = (0, 0, 0)
red = (213, 50, 80)
green = (0, 255, 0)
blue = (50, 153, 213)
# Параметры дисплея
dis_width = 800
dis_height = 600
dis = ((dis_width, dis_height))
('Snake Game: Объеденье')
clock = ()
snake_block = 10
snake_speed = 15
font_style = ("bahnschrift", 25)
score_font = ("comicsansms", 35)
def your_score(score):
value = ("Your Score: " + str(score), True, black)
(value, [0, 0])
def our_snake(snake_block, snake_list):
for x in snake_list:
(dis, black, [x[0], x[1], snake_block, snake_block])
def message(msg, color):
mesg = (msg, True, color)
(mesg, [dis_width / 6, dis_height / 3])
def gameLoop(paused):
game_over = False
game_close = False
x1 = dis_width / 2
y1 = dis_height / 2
x1_change = 0
y1_change = 0
snake_List = []
Length_of_snake = 1
foodx = round((0, dis_width - snake_block) / 10.0) * 10.0
foody = round((0, dis_height - snake_block) / 10.0) * 10.0
while not game_over:
while game_close:
(blue)
message("You Lost! Press Q-Quit or C-Play Again", red)
your_score(Length_of_snake - 1)
()
for event in ():
if == pygame.KEYDOWN:
if == pygame.K_q:
game_over = True
game_close = False
if == pygame.K_c:
gameLoop(False) # Запускаем gameLoop с paused = False
for event in ():
if == pygame.QUIT:
game_over = True
if == pygame.KEYDOWN:
if == pygame.K_SPACE:
paused = not paused
elif not paused:
if == pygame.K_LEFT:
x1_change = -snake_block
y1_change = 0
elif == pygame.K_RIGHT:
x1_change = snake_block
y1_change = 0
elif == pygame.K_UP:
y1_change = -snake_block
x1_change = 0
elif == pygame.K_DOWN:
y1_change = snake_block
x1_change = 0
if not paused:
if x1 >= dis_width or x1 < 0 or y1 >= dis_height or y1 < 0:
game_close = True
x1 += x1_change
y1 += y1_change
(blue)
(dis, green, [foodx, foody, snake_block, snake_block])
snake_Head = []
(x1)
(y1)
(snake_Head)
if len(snake_List) > Length_of_snake:
del snake_List[0]
for x in snake_List[:-1]:
if x == snake_Head:
game_close = True
our_snake(snake_block, snake_List)
your_score(Length_of_snake - 1)
()
if x1 == foodx and y1 == foody:
foodx = round((0, dis_width - snake_block) / 10.0) * 10.0
foody = round((0, dis_height - snake_block) / 10.0) * 10.0
Length_of_snake += 1
(snake_speed)
else:
message("Пауза (Нажмите SPACE для продолжения)", red)
()
()
quit()
def start_snake_game():
paused = False # Инициализируем paused здесь
gameLoop(paused)# Здесь вся игра!
start_snake_game()

Глава 8. Платформер...
Ина этом мы остановимся;) И нет, я не забыл про платформер, просто мы разберём его в следующей части этой книги!