Как сделать игру на питоне
Прежде чем мы начнём программировать что-то полезное на Python, давайте закодим что-нибудь интересное. Например, свою игру, где нужно не дать шарику упасть, типа Арканоида. Вы, скорее всего, играли в детстве во что-то подобное, поэтому освоиться будет просто.
Логика игры
Есть игровое поле — простой прямоугольник с твёрдыми границами. Когда шарик касается стенки или потолка, он отскакивает в другую сторону. Если он упадёт на пол — вы проиграли. Чтобы этого не случилось, внизу вдоль пола летает платформа, а вы ей управляете с помощью стрелок. Ваша задача — подставлять платформу под шарик как можно дольше. За каждое удачное спасение шарика вы получаете одно очко.
Алгоритм
Чтобы реализовать такую логику игры, нужно предусмотреть такие сценарии поведения:
- игра начинается;
- шарик начинает двигаться;
- если нажаты стрелки влево или вправо — двигаем платформу;
- если шарик коснулся стенок, потолка или платформы — делаем отскок;
- если шарик коснулся платформы — увеличиваем счёт на единицу;
- если шарик упал на пол — выводим сообщение и заканчиваем игру.
Хитрость в том, что всё это происходит параллельно и независимо друг от друга. То есть пока шарик летает, мы вполне можем двигать платформу, а можем и оставить её на месте. И когда шарик отскакивает от стен, это тоже не мешает другим объектам двигаться и взаимодействовать между собой.
Получается, что нам нужно определить три класса — платформу, сам шарик и счёт, и определить, как они реагируют на действия друг друга. Поле нам самим определять не нужно — для этого есть уже готовая библиотека. А потом в этих классах мы пропишем методы — они как раз и будут отвечать за поведение наших объектов.
Весь кайф в том, что мы всё это задаём один раз, а потом объекты сами разбираются, как им реагировать друг на друга и что делать в разных ситуациях. Мы не прописываем жёстко весь алгоритм, а задаём правила игры — а для этого классы подходят просто идеально.
Для этого проекта вам потребуется установить и запустить среду Python. Как это сделать — читайте в нашей статье .
Начало программы
Чтобы у нас появилась графика в игре, используем библиотеку Tkinter. Она входит в набор стандартных библиотек Python и позволяет рисовать простейшие объекты — линии, прямоугольники, круги и красить их в разные цвета. Такой простой Paint, только для Python.
Чтобы создать окно, где будет видна графика, используют класс Tk(). Он просто делает окно, но без содержимого. Чтобы появилось содержимое, создают холст — видимую часть окна. Именно на нём мы будем рисовать нашу игру. За холст отвечает класс Canvas(), поэтому нам нужно будет создать свой объект из этого класса и дальше уже работать с этим объектом.
Если мы принудительно не ограничим скорость платформы, то она будет перемещаться мгновенно, ведь компьютер считает очень быстро и моментально передвинет её к другому краю. Поэтому мы будем искусственно ограничивать время движения, а для этого нам понадобится модуль Time — он тоже стандартный.
Последнее, что нам глобально нужно, — задавать случайным образом начальное положение шарика и платформы, чтобы было интереснее играть. За это отвечает модуль Random — он помогает генерировать случайные числа и перемешивать данные.
Запишем всё это в виде кода на Python:
Мы подключили все нужные библиотеки, сделали и настроили игровое поле. Теперь займёмся классами.
Шарик
Сначала проговорим словами, что нам нужно от шарика. Он должен уметь:
- задавать своё начальное положение и направление движение;
- понимать, когда он коснулся платформы;
- рисовать сам себя и понимать, когда нужно отрисовать себя в новом положении (например, после отскока от стены).
Этого достаточно, чтобы шарик жил своей жизнью и умел взаимодействовать с окружающей средой. При этом нужно не забыть о том, что каждый класс должен содержать конструктор — код, который отвечает за создание нового объекта. Без этого сделать шарик не получится. Запишем это на Python:
Платформа
Сделаем то же самое для платформы — сначала опишем её поведение словами, а потом переведём в код. Итак, вот что должна уметь платформа:
- двигаться влево или вправо в зависимости от нажатой стрелки;
- понимать, когда игра началась и можно двигаться.
А вот как это будет в виде кода:
Можно было не выделять счёт в отдельный класс и каждый раз обрабатывать вручную. Но здесь реально проще сделать класс, задать нужные методы, чтобы они сами потом разобрались, что и когда делать.
От счёта нам нужно только одно (кроме конструктора) — чтобы он правильно реагировал на касание платформы, увеличивал число очков и выводил их на экран:
У нас всё готово для того, чтобы написать саму игру. Мы уже провели необходимую подготовку всех элементов, и нам остаётся только создать конкретные объекты шарика, платформы и счёта и сказать им, в каком порядке мы будем что делать.
Смысл игры в том, чтобы не уронить шарик. Пока этого не произошло — всё движется, но как только шарик упал — нужно показать сообщение о конце игры и остановить программу.
Посмотрите, как лаконично выглядит код непосредственно самой игры:
Как установить
Однозначного ответа на вопрос о том, какую версию python скачивать, не существует. До 2019 эксперты ещё не решили, какая версия лучше подходит для написания игр. Но чтобы не возникало лишних проблем и вопросов, лучше скачать 3.7.
Файл установщика займет примерно 26 мегабайт на диске. Двойным кликом на него откроется стандартное диалоговое окно, в котором нужно проставить галочки и запустить инсталляцию.
В самом конце, когда платформа будет установлена, она предложит убрать ограничение длины служебной переменной. Эта функция влияет на запуск Python из любого места системы компьютера. Необходимо просто кликнуть на текст в рамке.
Чтобы проверить правильность установки, нужно открыть командную строку и вписать туда слово python. После нажатия на Enter должен появится номер версии и список из нескольких команд для освоения в новой системе.
Для более удобного взаимодействия дополнительно необходимо установить Code VS.
Теория
Для начала работы с платформой и создания игры необходимо знать некоторые теоретические данные, которые не только будут полезны в дальнейшем, но и помогут понимать все процессы, происходящие в компиляторе с написанным кодом.
Pygame
Для создания собственной игры нужно работать со средой Pygame. Это так называемая игровая библиотека. Если проще, то набор инструментов, которые способствуют созданию игр.
Это три основных аспекта:
- Звуки (как музыка внутри игры, так и звук открытия дверей, падения шара и т. п.).
- Управление (привязанное к чему угодно, как классические средства ввода, так и различные геймпады).
- Графика и анимированные вставки.
Игровой цикл – основа нашей игры. Это кусочек кода, который запускается огромное количество раз, именно поэтому написанное визуализируется. Каждый такой цикл, который присутствует в окончательном виде, называют кадр.
В таком кадре происходит огромное количество процессов, но для понятности их можно разделить всего на три вида:
- Обновление. Это изменение всех предметов или явлений, происходящих за один кадр. Например, если объект подпрыгнул, его силой гравитации должно потянуть обратно к земле. Или если две движущиеся машины сталкиваются, то они должны отскочить друг от друга и получить повреждения.
- Ввод. Реакция программы на то, что происходит вне поля кода. То есть клики мышкой, какие-либо нажатия клавиатуры, управление стиками геймпада.
- Прорисовка. Этап, на котором код превращается в фон, персонажей, выпадающее меню, окружающую среду и прочие вещи, которые пользователь должен увидеть при взаимодействии.
Скорость работы цикла
FPS или Frames Per Second – количество кадров в секунду. Термин, знакомый любому геймеру. Многие знают только то, что для комфортной игры это значение должно быть больше 60. Программисты же понимают термин так: значение, указывающее количество повторений цикла за одну секунду.
Это необходимо для того, чтобы написанная программа не была слишком быстрой или медленной. Также важно, чтобы разные ПК или ноутбуки обрабатывали такое значение с одинаковой скоростью. Если машина должна ехать 7 секунд до столкновения, то это время не должно изменяться на разных компьютерах.
Практика
Ознакомившись с теоретической частью, можно начинать создавать свою первую игру. Самый первый шаг – создание обычной программы pygame, которая откроет окно и запустит цикл игры. Собственно, это и есть начало любого кода на питоне.
Для начала необходимо выбрать библиотеки и импортировать их, а также задать три основных значения дальнейшей игры.
Первая и вторая строка отвечает за библиотеки, а все остальные — за разрешение окна и количество обновления циклов за секунду.
Теперь откроем само окно игры. Первая строчка запускает игровую библиотеку. Третья выполняет развертывание окна по заданным изначально параметрам, у нас это 1024×720. Пятая создается для того, чтобы мы могли убедиться в правильности частоты кадров.
Третьим шагом идет создание цикла игры. И далее пошагово прописываются три основных события, которые будут происходить в сцене. За сам цикл отвечает команда while, которая контролируется переменной running. Значит, если мы хотим завершить игру, нужно изменить значение переменной с TRUE на FALSE. Теперь заполняем все три строки тем кодом, который нам необходим.
Отрисовка
У нас нет ничего, кроме окна с фоном, с ним и будем работать. Можно его залить цветом, но как? Сколько цветов может обрабатывать компьютер?
Чтобы вычислить это значение, необходимо возвести число 256 в третью степень. Получим значение 16 777 216. Многовато для запоминания.
Экран состоит из пикселей, и каждый может обработать три базовых цвета: зеленый, синий, и красный. Цвет определенного пикселя зависит от того, как горят базовые. Ниже представлена таблица RGB цветов.
Красный | Зеленый | Синий | Цвет |
0 | 0 | 0 | Черный |
255 | 0 | 0 | Красный |
0 | 255 | 0 | Зеленый |
0 | 0 | 255 | Синий |
0 | 255 | Голубой | |
255 | 255 | 0 | Желтый |
255 | 0 | 255 | Пурпурный |
255 | 255 | 255 | Белый |
Каждый из цветов имеет значение от 0 до 256, где 0 — это выключенная функция, а 255 — включенная на максимум. Таким образом, регулируя три основных цвета, можно добиться нужного. Поэтому таблицу цветов назвали RGB, по аналогии с заглавными буквами трех основных цветов.
Теперь мы знаем, как отображаются цвета, и можем залить весь экран, например, желтым. Это сложный цвет, состоящий из двух.
YELLOW = (255, 255, 0)
После того как мы задали командой желтый, можем выполнить заливку экрана.
Двойная буферизация
У нас есть двусторонний предмет, например кусочек фанеры. И его можно повернуть, показав или с одной стороны, или с другой. Тыльная сторона будет дисплеем, с которым взаимодействует пользователь, а обратную сможет обрабатывать только наш компьютер. Каждый кадр рендерится на обратной части, а когда отрисовка полностью завершена, фанеру переворачивают и показывают пользователю. Так отрисовывается изображение не при добавлении новых элементов, а один раз в каждый кадр.
К нашей команде screen.fill(YELLOW) добавляем строку pygame.display.flip, и все начинает работать.
Эта функция должна находиться в самом конце отрисовки, иначе содержимое, которое задано после флипа, просто не отобразится на экране пользователя.
События
Так как у нас отсутствует игра, мы не можем точно угадать, какие кнопки меню или управления нам будут необходимы. Если прямо сейчас запустить программу, будет ясно, что окно просто так не закроется. Мы не рассматриваем возможность нажать на красный крестик в углу, так как это недостаточно для конечного игрока.
Закрытие – функция, которая должна быть сообщена программе для того, чтобы была возможность считать её и завершить процесс. Если проще, чтобы значение TRUE было заменено на FALSE.
Нужно учитывать все детали и то, что кадры каждую секунду генерируют события. Просто подумайте, что если во время того как программа отрисовывает картинку, пользователь захочет нажать на кнопку прыжка?
Использовать окно кода просто чтобы создать статичную картинку – недостаточно. Pygame хранит все события, которые происходили с момента отрисовки последнего кадра. Язык не будет пропускать команды, сколько бы их ни было. Программа в окне создает список действий, а цикл FOR пройдет по всем.
Одно из важнейших событий pygame.QUIT, оно запускается после нажатия крестика и меняет значение переменной Running с TRUE на FALSE, тем самым заканчивая игровой цикл.
Шаблон
В конечном итоге у нас должен появиться вот такой вот шаблон для написания проекта на pygame.
Последней, 30-й, строчкой обязательно пишем окончание программы, чтобы она нормально закрывалась.
Создание окружения
Все события цикла проверяемы, и при нажатии заданной кнопки выполняется отдельный кусочек кода.
Кроме того, мы можем нарисовать несколько простейших объектов:
- Line (создание линии);
- Circle(создает окружность);
- Rect (создает квадрат).
Есть много других методов и команд, но эти три являются самыми распространенными в использовании новичками.
В конце цикла всегда надо обновлять сцену, чтобы на ней отрисовывались кадры, за это отвечает команда pygame.display.update
Запуск игры в окне без этой программы приведет к слишком быстрому движению, и воспринимать ее будет невозможно.
Создание простейшей игры с числами
Давайте рассмотрим проект по созданию числовой игры на определение. Исходя из текста выше, попытайтесь проанализировать строки и понять, за что каждая отвечает.
1 и 3 строка отвечают за то, чтобы переменной NTG было задано число от 0 до 200, а также чтобы число пользователя изначально было -1.
5 строка — это цикл, который будет выполняться, пока переменная NTG не совпадет с переменной, введенной пользователем в окне программы.
Строки с 6 до 10 делают основную работу и дают игроку подсказки, в какую сторону отличается написанное число. Если оно совпадет с NTG, выведется строчка, поздравляющая с победой (11).
Последняя, 13, отвечает за конец игры и завершение цикла. Второй способ, чтобы не проставлять значения TRUE и FALSE.
Но исходя из знаний, полученных выше, мы можем доработать программу, сделав окно немного интереснее. Так как в этой игре нет персонажей и объектов, заменим фон строками
YELLOW = (255, 255, 0)
Зададим желтый фон экрана. Теперь компиляция программы в окне будет более интересной. Вот и создана первая простая игра без использования pygame.
Змейка
Создавать игру будем с помощью виджета Canvas. Это нужно для того, чтобы задать объекты изображениями. Также это поможет зарегистрировать столкновение и закончить игру.
Всего возьмем 5 переменных:
- DELAY – скорость игры.
- ALL_DOTS – количество сегментов змейки, которое может быть.
- RAND_POS – чтобы яблоко появлялось в случайной точке.
- HEIGHT и WIDTH – отвечают за размер игрового поля.
- DOT_SIZE – размер одного сегмента и яблока.
Зададим два массива:
В них сохраняются все соединения нашего существа.
Эти 11 строк отвечают за то, чтобы в нашей игре было три картинки, сегмент, голова змеи и яблоко. Их можно как отрисовать самостоятельно, так и скачать из интернета. Три небольших изображения, которые будут у нас показываться в окне игры.
Этими двумя строками мы создали объекты на игровом поле и задали, чтобы яблоко появлялось в случайной точке окна.
Этими командами мы создадим изображения на холсте. За это отвечает команда image. Если мы хотим, чтобы изображение появлялось около границ окна, нам нужно задать параметр anchor на NW (North и West). А с помощью параметра tag можем отслеживать и идентифицировать все изображения и объекты в окне. Одним тегом можно обозначить группу объектов в нашей игре.
С помощью команды checkApple мы смотрим, съела ли наша змея яблоко, и добавляем ей сегмент в случае положительного ответа. Команда find_withtag находит один из предметов в окне, используя определенный заданный тег. Нам требуется всего два объекта — яблоко и змеиная голова.
Если яблоко будет съедено, то есть столкнется с головой, мы создадим новый сегмент на месте столкновения. И запустим метод locateApple, он удалит яблоко из холста и создаст новое в рандомной точке.
Мы управляем головой змейки, а метод doMove поможет нам изменять ее положение. Остальные сегменты будут двигаться за головой одной непрерывной цепочкой.
Так, следуя всем шагам далее, мы напишем простую игру, в которой обычная змейка будет есть яблоки и расти, пока не ударится об себя или поле.
Вывод
В итоге мы научились создавать простенькие игры без графики, сделали шаблон для создания программы на pygames и начали делать серьезную программу типа змейки. Все эти навыки помогут в дальнейшем создании игр и прояснят фундаментальные аспекты кодинга на Python. При любых неполадках или отказе компилятора в запуске кода необходимо проверить все строки кода на ошибки и попробовать заново написать программу в другом окне. Нужно быть максимально внимательным, и тогда все получится.
Заинтересованы в создании игр, но не знаете с чего начать? Этот пост для вас.
В этом посте предполагается, что вы хоть немного знакомы с Python (такими понятиями, как классы, циклы, функции и методы).
Что такое Pygame?
Pygame – это библиотека для python, которая позволяет нам создавать 2D игры. На самом деле это оболочка для мультимедийной библиотеки SDL (Simple DirectMedia Layer). Он может обрабатывать опросы событий, вставлять изображения в окно, звук и т.д. Вы можете получить это здесь .
Что в игре?
При создании 2D-игры используется очень простой скелет. Основная большая часть игры – это основной цикл. Как следует из названия, mainloop – это фрагмент кода, который выполняется многократно во время выполнения игры. Основной цикл имеет следующую структуру:
Мы будем использовать этот основной цикл для создания очень простой игры.
Начинем
Создайте любой рабочий каталог, например, игру. Затем поместите любое понравившееся вам изображение и назовите его player.jpg.
Следующее изображение предоставляется для вас:
Теперь введите следующую команду в любом текстовом редакторе по вашему выбору и сохранить его как game.py.
Игра выглядит примерно так:
Как все это сочетается
Прежде всего, вам необходимо понять используемую систему координат. В пигме координаты начинаются в верхнем левом углу экрана и увеличиваются при движении вправо или вниз.
Во-вторых, под pygame цвета понимаются как кортежи значений RGB (красный, зеленый, синий). Для белого все значения максимально 255.
Сам код легко понять. Во- первых, мы создали игрока класс, который наследуется от Sprite класса Pygame (Это будет объяснено позже). Объект player является экземпляром этого класса. Мы дали ему атрибут изображения и два атрибута позиции. Затем мы добавили метод перемещения, который принимает кортеж из двух значений и добавляет их к позициям. Таким образом, изменения в позициях добавляются к соответствующим позициям игрока, чтобы он мог перейти на новую позицию.
Затем наступает интересная часть. В mainloop есть цикл for, который перебирает все события, записанные Pygame. Он проверяет, нажал ли пользователь какой-либо из W, A, S или D. В зависимости от нажатой клавиши значение mov_tuple изменяется.
Метод move объекта player вызывается во время каждой итерации цикла. Он просто сдвигает атрибуты x и y объекта. Метод блитов рисует игрока в соответствии с заданными координатами. Поэтому наш мяч находится в постоянном движении, пока мы не намеренно изменим его направление.
После обработки всего этого, мы просто обновляем дисплей. Это та часть, которая заставляет изображения действительно рисоваться на экране. Наконец, clock.tick просто говорит pygame перекрашивать экран 60 раз в секунду.
Вот и все. Так проходит игра. Цикл продолжается до тех пор, пока игрок не выйдет. По сути, все, что мы делаем, это рисуем разные цвета на экране в ответ на команды игрока очень, очень быстро.
А сейчас нечто совершенно другое
Выше была простая демонстрация, чтобы проиллюстрировать основные идеи о Pygame и создании игр. В следующий раз мы узнаем, как создать полноценную игру. Я надеюсь, что вы узнали что-то полезное из этого поста.
Сегодня мы научимся кодировать несколько простых игр, используя распространенные модули Python.
Сегодня мы научимся кодировать несколько простых игр, используя распространенные модули Python.
Почему мы используем Python?
Python – это известный язык программирования. Python код очень легко понять и написать. Считается, что он удобен для разработчиков. Любой новичок может научиться кодировать на Python в течение короткого промежутка времени.
Вот некоторые из самых интересных особенностей этого языка:
- Python – это язык с открытым исходным кодом и распространяется свободно
- Портативный и динамический
- Python супер легко понять и т. д.
Создание простых игр в Python
Давайте теперь реализуем несколько простых игр в Python, которые вы можете построить как новичок, чтобы начать свой путь обучения!
1. Игра викторина в Python
Это очень простая текстовая игра на Python. Это маленькая викторина, которую вы можете сделать для себя или своих друзей. Нам не нужно импортировать какие-либо модули для этой игры, что облегчает её! Попробуйте сами.
2. Игра в Pong на Python
Большинство из нас слышали о знаменитой игре в Pong. Многие из нас любят играть. Сегодня мы научимся кодировать эту классическую игру с помощью языка программирования python!
Прежде чем начать кодировать, необходимо установить модуль turtle. Этот модуль представляет собой библиотеку Python, которая позволяет пользователям создавать картины и фигуры, предоставляя им виртуальный холст.
Если у вас его еще нет, вы можете установить библиотеку, используя pip.
Вы можете узнать больше о библиотеке turtle из их официальной документации
Попробуйте код самостоятельно!
3. Игра Hungry Snake на Python
Это была наша любимая игра, когда мы были детьми. На самом деле мы можем реализовать эту игру в python, импортируя всего два модуля! Как это круто!
Во-первых, нам нужно установить библиотеку turtle. Если у вас она еще не установлена, откройте свой cmd и введите следующую команду.
Теперь мы установим случайное модуль. Случайный модуль используется для генерации случайных чисел. В вашем типе CMD в следующей команде.
Теперь мы установим модуль random2. Модуль random2 используется для генерации случайных чисел. Выполните в cmd следующую команду.
Попробуйте сами код ниже и наслаждайтесь игрой!
Заключение
Вот и все! Это некоторые из простых игр в Python, которые вы можете создать как новичок и повеселиться! Мы любили создавать эти игры, и мы надеемся, что у вас тоже получиться!
Читайте также: