Как сделать игру на питоне

Добавил пользователь Morpheus
Обновлено: 23.08.2024

Преж­де чем мы нач­нём про­грам­ми­ро­вать что-то полез­ное на Python, давай­те зако­дим что-нибудь инте­рес­ное. Напри­мер, свою игру, где нуж­но не дать шари­ку упасть, типа Арка­но­и­да. Вы, ско­рее все­го, игра­ли в дет­стве во что-то подоб­ное, поэто­му осво­ить­ся будет про­сто.

Логика игры

Есть игро­вое поле — про­стой пря­мо­уголь­ник с твёр­ды­ми гра­ни­ца­ми. Когда шарик каса­ет­ся стен­ки или потол­ка, он отска­ки­ва­ет в дру­гую сто­ро­ну. Если он упа­дёт на пол — вы про­иг­ра­ли. Что­бы это­го не слу­чи­лось, вни­зу вдоль пола лета­ет плат­фор­ма, а вы ей управ­ля­е­те с помо­щью стре­лок. Ваша зада­ча — под­став­лять плат­фор­му под шарик как мож­но доль­ше. За каж­дое удач­ное спа­се­ние шари­ка вы полу­ча­е­те одно очко.

Алгоритм

Что­бы реа­ли­зо­вать такую логи­ку игры, нуж­но преду­смот­реть такие сце­на­рии пове­де­ния:

  • игра начи­на­ет­ся;
  • шарик начи­на­ет дви­гать­ся;
  • если нажа­ты стрел­ки вле­во или впра­во — дви­га­ем плат­фор­му;
  • если шарик кос­нул­ся сте­нок, потол­ка или плат­фор­мы — дела­ем отскок;
  • если шарик кос­нул­ся плат­фор­мы — уве­ли­чи­ва­ем счёт на еди­ни­цу;
  • если шарик упал на пол — выво­дим сооб­ще­ние и закан­чи­ва­ем игру.

Хит­рость в том, что всё это про­ис­хо­дит парал­лель­но и неза­ви­си­мо друг от дру­га. То есть пока шарик лета­ет, мы вполне можем дви­гать плат­фор­му, а можем и оста­вить её на месте. И когда шарик отска­ки­ва­ет от стен, это тоже не меша­ет дру­гим объ­ек­там дви­гать­ся и вза­и­мо­дей­ство­вать меж­ду собой.

Полу­ча­ет­ся, что нам нуж­но опре­де­лить три клас­са — плат­фор­му, сам шарик и счёт, и опре­де­лить, как они реа­ги­ру­ют на дей­ствия друг дру­га. Поле нам самим опре­де­лять не нуж­но — для это­го есть уже гото­вая биб­лио­те­ка. А потом в этих клас­сах мы про­пи­шем мето­ды — они как раз и будут отве­чать за пове­де­ние наших объ­ек­тов.

Весь кайф в том, что мы всё это зада­ём один раз, а потом объ­ек­ты сами раз­би­ра­ют­ся, как им реа­ги­ро­вать друг на дру­га и что делать в раз­ных ситу­а­ци­ях. Мы не про­пи­сы­ва­ем жёст­ко весь алго­ритм, а зада­ём пра­ви­ла игры — а для это­го клас­сы под­хо­дят про­сто иде­аль­но.


Для это­го про­ек­та вам потре­бу­ет­ся уста­но­вить и запу­стить сре­ду Python. Как это сде­лать — читай­те в нашей ста­тье .

Начало программы

Что­бы у нас появи­лась гра­фи­ка в игре, исполь­зу­ем биб­лио­те­ку Tkinter. Она вхо­дит в набор стан­дарт­ных биб­лио­тек Python и поз­во­ля­ет рисо­вать про­стей­шие объ­ек­ты — линии, пря­мо­уголь­ни­ки, кру­ги и кра­сить их в раз­ные цве­та. Такой про­стой Paint, толь­ко для Python.

Что­бы создать окно, где будет вид­на гра­фи­ка, исполь­зу­ют класс Tk(). Он про­сто дела­ет окно, но без содер­жи­мо­го. Что­бы появи­лось содер­жи­мое, созда­ют холст — види­мую часть окна. Имен­но на нём мы будем рисо­вать нашу игру. За холст отве­ча­ет класс Canvas(), поэто­му нам нуж­но будет создать свой объ­ект из это­го клас­са и даль­ше уже рабо­тать с этим объ­ек­том.

Если мы при­ну­ди­тель­но не огра­ни­чим ско­рость плат­фор­мы, то она будет пере­ме­щать­ся мгно­вен­но, ведь ком­пью­тер счи­та­ет очень быст­ро и момен­таль­но пере­дви­нет её к дру­го­му краю. Поэто­му мы будем искус­ствен­но огра­ни­чи­вать вре­мя дви­же­ния, а для это­го нам пона­до­бит­ся модуль Time — он тоже стан­дарт­ный.

Послед­нее, что нам гло­баль­но нуж­но, — зада­вать слу­чай­ным обра­зом началь­ное поло­же­ние шари­ка и плат­фор­мы, что­бы было инте­рес­нее играть. За это отве­ча­ет модуль Random — он помо­га­ет гене­ри­ро­вать слу­чай­ные чис­ла и пере­ме­ши­вать дан­ные.

Запи­шем всё это в виде кода на Python:

Мы под­клю­чи­ли все нуж­ные биб­лио­те­ки, сде­ла­ли и настро­и­ли игро­вое поле. Теперь зай­мём­ся клас­са­ми.

Шарик

Сна­ча­ла про­го­во­рим сло­ва­ми, что нам нуж­но от шари­ка. Он дол­жен уметь:

  • зада­вать своё началь­ное поло­же­ние и направ­ле­ние дви­же­ние;
  • пони­мать, когда он кос­нул­ся плат­фор­мы;
  • рисо­вать сам себя и пони­мать, когда нуж­но отри­со­вать себя в новом поло­же­нии (напри­мер, после отско­ка от сте­ны).

Это­го доста­точ­но, что­бы шарик жил сво­ей жиз­нью и умел вза­и­мо­дей­ство­вать с окру­жа­ю­щей сре­дой. При этом нуж­но не забыть о том, что каж­дый класс дол­жен содер­жать кон­струк­тор — код, кото­рый отве­ча­ет за созда­ние ново­го объ­ек­та. Без это­го сде­лать шарик не полу­чит­ся. Запи­шем это на Python:

Платформа

Сде­ла­ем то же самое для плат­фор­мы — сна­ча­ла опи­шем её пове­де­ние сло­ва­ми, а потом пере­ве­дём в код. Итак, вот что долж­на уметь плат­фор­ма:

  • дви­гать­ся вле­во или впра­во в зави­си­мо­сти от нажа­той стрел­ки;
  • пони­мать, когда игра нача­лась и мож­но дви­гать­ся.

А вот как это будет в виде кода:

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

От счё­та нам нуж­но толь­ко одно (кро­ме кон­струк­то­ра) — что­бы он пра­виль­но реа­ги­ро­вал на каса­ние плат­фор­мы, уве­ли­чи­вал чис­ло очков и выво­дил их на экран:

У нас всё гото­во для того, что­бы напи­сать саму игру. Мы уже про­ве­ли необ­хо­ди­мую под­го­тов­ку всех эле­мен­тов, и нам оста­ёт­ся толь­ко создать кон­крет­ные объ­ек­ты шари­ка, плат­фор­мы и счё­та и ска­зать им, в каком поряд­ке мы будем что делать.

Смысл игры в том, что­бы не уро­нить шарик. Пока это­го не про­изо­шло — всё дви­жет­ся, но как толь­ко шарик упал — нуж­но пока­зать сооб­ще­ние о кон­це игры и оста­но­вить про­грам­му.

Посмот­ри­те, как лако­нич­но выгля­дит код непо­сред­ствен­но самой игры:

Как установить


Однозначного ответа на вопрос о том, какую версию python скачивать, не существует. До 2019 эксперты ещё не решили, какая версия лучше подходит для написания игр. Но чтобы не возникало лишних проблем и вопросов, лучше скачать 3.7.

Файл установщика займет примерно 26 мегабайт на диске. Двойным кликом на него откроется стандартное диалоговое окно, в котором нужно проставить галочки и запустить инсталляцию.

В самом конце, когда платформа будет установлена, она предложит убрать ограничение длины служебной переменной. Эта функция влияет на запуск Python из любого места системы компьютера. Необходимо просто кликнуть на текст в рамке.

Чтобы проверить правильность установки, нужно открыть командную строку и вписать туда слово python. После нажатия на Enter должен появится номер версии и список из нескольких команд для освоения в новой системе.

Для более удобного взаимодействия дополнительно необходимо установить Code VS.

Теория

Для начала работы с платформой и создания игры необходимо знать некоторые теоретические данные, которые не только будут полезны в дальнейшем, но и помогут понимать все процессы, происходящие в компиляторе с написанным кодом.

Pygame

Для создания собственной игры нужно работать со средой Pygame. Это так называемая игровая библиотека. Если проще, то набор инструментов, которые способствуют созданию игр.

Это три основных аспекта:

  1. Звуки (как музыка внутри игры, так и звук открытия дверей, падения шара и т. п.).
  2. Управление (привязанное к чему угодно, как классические средства ввода, так и различные геймпады).
  3. Графика и анимированные вставки.

Игровой цикл – основа нашей игры. Это кусочек кода, который запускается огромное количество раз, именно поэтому написанное визуализируется. Каждый такой цикл, который присутствует в окончательном виде, называют кадр.

В таком кадре происходит огромное количество процессов, но для понятности их можно разделить всего на три вида:

  1. Обновление. Это изменение всех предметов или явлений, происходящих за один кадр. Например, если объект подпрыгнул, его силой гравитации должно потянуть обратно к земле. Или если две движущиеся машины сталкиваются, то они должны отскочить друг от друга и получить повреждения.
  2. Ввод. Реакция программы на то, что происходит вне поля кода. То есть клики мышкой, какие-либо нажатия клавиатуры, управление стиками геймпада.
  3. Прорисовка. Этап, на котором код превращается в фон, персонажей, выпадающее меню, окружающую среду и прочие вещи, которые пользователь должен увидеть при взаимодействии.

Скорость работы цикла

FPS или Frames Per Second – количество кадров в секунду. Термин, знакомый любому геймеру. Многие знают только то, что для комфортной игры это значение должно быть больше 60. Программисты же понимают термин так: значение, указывающее количество повторений цикла за одну секунду.

Это необходимо для того, чтобы написанная программа не была слишком быстрой или медленной. Также важно, чтобы разные ПК или ноутбуки обрабатывали такое значение с одинаковой скоростью. Если машина должна ехать 7 секунд до столкновения, то это время не должно изменяться на разных компьютерах.

Практика

Ознакомившись с теоретической частью, можно начинать создавать свою первую игру. Самый первый шаг – создание обычной программы pygame, которая откроет окно и запустит цикл игры. Собственно, это и есть начало любого кода на питоне.

Для начала необходимо выбрать библиотеки и импортировать их, а также задать три основных значения дальнейшей игры.


Первая и вторая строка отвечает за библиотеки, а все остальные — за разрешение окна и количество обновления циклов за секунду.

Теперь откроем само окно игры. Первая строчка запускает игровую библиотеку. Третья выполняет развертывание окна по заданным изначально параметрам, у нас это 1024x720. Пятая создается для того, чтобы мы могли убедиться в правильности частоты кадров.


Третьим шагом идет создание цикла игры. И далее пошагово прописываются три основных события, которые будут происходить в сцене. За сам цикл отвечает команда 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 переменных:

  1. DELAY – скорость игры.
  2. ALL_DOTS – количество сегментов змейки, которое может быть.
  3. RAND_POS – чтобы яблоко появлялось в случайной точке.
  4. HEIGHT и WIDTH – отвечают за размер игрового поля.
  5. 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, которые вы можете создать как новичок и повеселиться! Мы любили создавать эти игры, и мы надеемся, что у вас тоже получиться!

Читайте также: