Как сделать ascii игру на python
Код в уроках был написан на Python 3.7 и Pygame 1.9.6
Что такое Pygame?
- Графика и анимация
- Звук (включая музыку)
- Управление (мышь, клавиатура, геймпад и так далее)
Игровой цикл
В каждом кадре происходит масса вещей, но их можно разбить на три категории:
Речь идет обо всем, что происходит вне игры — тех событиях, на которые она должна реагировать. Это могут быть нажатия клавиш на клавиатуре, клики мышью и так далее.
Изменение всего, что должно измениться в течение одного кадра. Если персонаж в воздухе, гравитация должна потянуть его вниз. Если два объекта встречаются на большой скорости, они должны взорваться.
В этом шаге все выводится на экран: фоны, персонажи, меню. Все, что игрок должен видеть, появляется на экране в нужном месте.
Время
Еще один важный аспект игрового цикла — скорость его работы. Многие наверняка знакомы с термином FPS, который расшифровывается как Frames Per Second (или кадры в секунду). Он указывает на то, сколько раз цикл должен повториться за одну секунду. Это важно, чтобы игра не была слишком медленной или быстрой. Важно и то, чтобы игра не работала с разной скоростью на разных ПК. Если персонажу необходимо 10 секунд на то, чтобы пересечь экран, эти 10 секунд должны быть неизменными для всех компьютеров.
Создание шаблона Pygame
Теперь, зная из каких элементов состоит игра, можно переходить к процессу написания кода. Начать стоит с создания простейшей программы pygame, которая всего лишь открывает окно и запускает игровой цикл. Это отправная точка для любого проекта pygame.
В начале программы нужно импортировать необходимые библиотеки и задать базовые переменные настроек игры:
Дальше необходимо открыть окно игры:
pygame.init() — это команда, которая запускает pygame. screen — окно программы, которое создается, когда мы задаем его размер в настройках. Дальше необходимо создать clock , чтобы убедиться, что игра работает с заданной частотой кадров.
Теперь необходимо создать игровой цикл:
Игровой цикл — это цикл while , контролируемый переменной running . Если нужно завершить игру, необходимо всего лишь поменять значение running на False . В результате цикл завершится. Теперь можно заполнить каждый раздел базовым кодом.
Раздел рендеринга (отрисовки)
Начнем с раздела отрисовки. Персонажей пока нет, поэтому экран можно заполнить сплошным цветом. Чтобы сделать это, нужно разобраться, как компьютер обрабатывает цвета.
Экраны компьютеров сделаны из пикселей, каждый из которых содержит 3 элемента: красный, зеленый и синий. Цвет пикселя определяется тем, как горит каждый из элементов:
Каждый из трех основных цветов может иметь значение от 0 (выключен) до 255 (включен на 100%), так что для каждого элемента есть 256 вариантов.
Узнать общее количество отображаемых компьютером цветов можно, умножив:
Теперь, зная, как работают цвета, можно задать их в начале программ:
А после этого — заполнить весь экран.
А это значит, что процесс отрисовки происходит один раз за кадр, а не при добавлении каждого элемента.
В pygame это происходит автоматически. Нужно всего лишь сказать доске, чтобы она перевернулась, когда отрисовка завершена. Эта команда называется flip() :
Главное — сделать так, чтобы функция flip() была в конце. Если попытаться отрисовать что-то после поворота, это содержимое не отобразится на экране.
Раздел ввода (событий)
Игры еще нет, поэтому пока сложно сказать, какие кнопки или другие элементы управления понадобятся. Но нужно настроить одно важное событие. Если попытаться запустить программу сейчас, то станет понятно, что нет возможности закрыть окно. Нажать на крестик в верхнем углу недостаточно. Это тоже событие, и необходимо сообщить программе, чтобы она считала его и, соответственно, закрыла игру.
События происходят постоянно. Что, если игрок нажимает кнопку прыжка во время отрисовки? Это нельзя игнорировать, иначе игрок будет разочарован. Для этого pygame сохраняет все события, произошедшие с момента последнего кадра. Даже если игрок будет лупить по кнопкам, вы не пропустите ни одну из них. Создается список, и с помощью цикла for можно пройтись по всем из них.
В pygame много событий, на которые он способен реагировать. pygame.QUIT — событие, которое стартует после нажатия крестика и передает значение False переменной running , в результате чего игровой цикл заканчивается.
Контроль FPS
Пока что нечего поместить в раздел Update (обновление), но нужно убедиться, что настройка FPS контролирует скорость игры. Это можно сделать следующим образом:
Команда tick() просит pygame определить, сколько занимает цикл, а затем сделать паузу, чтобы цикл (целый кадр) длился нужно время. Если задать значение FPS 30, это значит, что длина одного кадра — 1/30, то есть 0,03 секунды. Если цикл кода (обновление, рендеринг и прочее) занимает 0,01 секунды, тогда pygame сделает паузу на 0,02 секунды.
Наконец, нужно убедиться, что когда игровой цикл завершается, окно игры закрывается. Для этого нужно поместить функцию pygame.quit() в конце кода. Финальный шаблон pygame будет выглядеть вот так:
Ура! У вас есть рабочий шаблон Pygame. Сохраните его в файле с понятным названием, например, pygame_template.py , чтобы можно было использовать его каждый раз при создании нового проекта pygame.
В следующем руководстве этот шаблон будет использован как отправная точка для изучения процесса отрисовки объектов на экране и их движения.
В предыдущей статье мы реализовали проект Pygame, в результате чего на экран выводится окно с игровым полем, которое вы можете закрыть, нажав клавишу. Но пока что, наше игровое поле отображает лишь синий экран. На следующем шаге мы используем в качестве фона изображение космического пространства. В сегодняшней статье мы отобразим изображение в этом окне.
Хотя вы могли бы сделать компьютерную игру только с цветными прямоугольниками и другими простыми фигурами, использование изображений сделает ее гораздо более привлекательной. В разработке компьютерных игр изображения обычно называются спрайтами. Конечно, игры используют гораздо больше типов ресурсов, таких как звуки, шрифты, анимация и так далее. Вместе эти ресурсы называются assets.
По мере роста вашей игры важно, чтобы она сохраняла правильную структуру. Итак, начните с создания папки под названием assets и внутри нее еще одной, называемой sprites. Там вы разместите все спрайты, используемые в вашей игре. Папку assets можно создать внутри space_rock.
Затем загрузите изображение космического фона и поместите его в папку assets/sprites.
Кроме того, поскольку изображения будут загружаться в вашу программу много раз, рекомендуется извлечь эту функциональность в отдельный метод в отдельном файле. Создайте файл с именем space_rocks/utils.py, который сохранит все многоразовые методы. Затем реализуйте загрузку изображений:
from pygame.image import load
if with_alpha:
return loaded_sprite.convert_alpha()
else:
return loaded_sprite.convert()
В первой строке мы импортирует метод load (), который будет необходим для последующего чтения изображений.
В строке path создаем путь к изображению, предполагая, что оно хранится в каталоге space_rock/assets/sprites и что это файл PNG. Таким образом, вам нужно будет только указать имя спрайта позже. В случае ошибки в загрузке, следует удалить часть пути.
Строка loaded_sprite загружает изображение с помощью функции load(). Этот метод возвращает поверхность, которая является объектом, используемым Pygame для представления изображений. Позже вы можете нарисовать его на экране (или на другой поверхности, если хотите).
Конструкция if-else преобразуют изображение в формат, который лучше подходит для экрана, чтобы ускорить процесс рисования. Это делается с помощью функции convert_alpha() или convert(), в зависимости от того, хотите ли вы использовать прозрачность.
Структура нашего проекта будет выглядеть следующим образом:
game_project/
|
+-- space_rocks/
+-- __main__.py
+-- game.py
+-- utils.py
|_
assets/
|
+-- sprites/
+-- space.jpg
Теперь, когда ваша программа может загружать изображения, пришло время изменить синий фон на что-то более интересное. Отредактируйте space_rocks/game.py файл:
Чтобы отобразить одну поверхность на другой в Pygame, Метод blit() нужно вызвать на поверхности, на которой вы хотите рисовать. Этот метод принимает два аргумента:
Поверхность, которую вы хотите нарисовать - self.background. Точка, в которой вы хотите ее нарисовать - (0, 0).
И мы должны увидеть экран с изображением:
Таким образом, мы добавили нашей игре красивое фоновое изображение.
Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления
Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.
Порекомендуйте эту статью друзьям:
Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):
Она выглядит вот так:
Комментарии ( 0 ):
10 игр на Python с исходниками для тех, кто хочет изучать данный язык.
Dodger
Memory Puzzle
Sliding Puzzle
Simon
Nibbles
Tetris
Katamari Damacy
Sokoban
Othello
Flood It
ЭТО МОЖЕТ БЫТЬ ИНТЕРЕСНОЕЩЕ ОТ АВТОРА
Топ-14 библиотек Python для Data Science
Глитчинг изображений и создание gif через Glitch-this
Базовый синтаксис языка Python
Популярное
25 лучших видеоигр для GNU/LINUX и Steam Machine
Быстрое объяснение прототипного наследования в JS
Dr.Web CureIt- отличный бесплатный антивирус, скачать бесплатно
Тестирование на проникновение: легальный хакинг
Горячее
Bootstrap 3 Essential Training
Готовые решения на HTML и CSS, примеры скачать
LEGO представила набор для обучения детей программированию
JavaScript: как из Fetch сделать Axios?
Выбор редактора
Элон Маск предложил жителям Тонга терминалы Starlink для восстановления доступа в.
Китай теперь имеет базовые станции 5G во всех городах и городских.
Скрипты Powershell для работы с AD аккаунтами
Популярные посты
Создаем многопользовательскую веб-игру Javascript
Логическая задача про 51 рубль
Топ самых сильных IT университетов в России 2021
ПОПУЛЯРНЫЕ КАТЕГОРИИ
Как установить
Однозначного ответа на вопрос о том, какую версию python скачивать, не существует. До 2019 эксперты ещё не решили, какая версия лучше подходит для написания игр. Но чтобы не возникало лишних проблем и вопросов, лучше скачать 3.7.
Файл установщика займет примерно 26 мегабайт на диске. Двойным кликом на него откроется стандартное диалоговое окно, в котором нужно проставить галочки и запустить инсталляцию.
В самом конце, когда платформа будет установлена, она предложит убрать ограничение длины служебной переменной. Эта функция влияет на запуск Python из любого места системы компьютера. Необходимо просто кликнуть на текст в рамке.
Чтобы проверить правильность установки, нужно открыть командную строку и вписать туда слово python. После нажатия на Enter должен появится номер версии и список из нескольких команд для освоения в новой системе.
Для более удобного взаимодействия дополнительно необходимо установить Code VS.
Теория
Для начала работы с платформой и создания игры необходимо знать некоторые теоретические данные, которые не только будут полезны в дальнейшем, но и помогут понимать все процессы, происходящие в компиляторе с написанным кодом.
Pygame
Для создания собственной игры нужно работать со средой Pygame. Это так называемая игровая библиотека. Если проще, то набор инструментов, которые способствуют созданию игр.
Это три основных аспекта:
- Звуки (как музыка внутри игры, так и звук открытия дверей, падения шара и т. п.).
- Управление (привязанное к чему угодно, как классические средства ввода, так и различные геймпады).
- Графика и анимированные вставки.
Игровой цикл – основа нашей игры. Это кусочек кода, который запускается огромное количество раз, именно поэтому написанное визуализируется. Каждый такой цикл, который присутствует в окончательном виде, называют кадр.
В таком кадре происходит огромное количество процессов, но для понятности их можно разделить всего на три вида:
- Обновление. Это изменение всех предметов или явлений, происходящих за один кадр. Например, если объект подпрыгнул, его силой гравитации должно потянуть обратно к земле. Или если две движущиеся машины сталкиваются, то они должны отскочить друг от друга и получить повреждения.
- Ввод. Реакция программы на то, что происходит вне поля кода. То есть клики мышкой, какие-либо нажатия клавиатуры, управление стиками геймпада.
- Прорисовка. Этап, на котором код превращается в фон, персонажей, выпадающее меню, окружающую среду и прочие вещи, которые пользователь должен увидеть при взаимодействии.
Скорость работы цикла
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 переменных:
- DELAY – скорость игры.
- ALL_DOTS – количество сегментов змейки, которое может быть.
- RAND_POS – чтобы яблоко появлялось в случайной точке.
- HEIGHT и WIDTH – отвечают за размер игрового поля.
- DOT_SIZE – размер одного сегмента и яблока.
Зададим два массива:
В них сохраняются все соединения нашего существа.
Эти 11 строк отвечают за то, чтобы в нашей игре было три картинки, сегмент, голова змеи и яблоко. Их можно как отрисовать самостоятельно, так и скачать из интернета. Три небольших изображения, которые будут у нас показываться в окне игры.
Этими двумя строками мы создали объекты на игровом поле и задали, чтобы яблоко появлялось в случайной точке окна.
Этими командами мы создадим изображения на холсте. За это отвечает команда image. Если мы хотим, чтобы изображение появлялось около границ окна, нам нужно задать параметр anchor на NW (North и West). А с помощью параметра tag можем отслеживать и идентифицировать все изображения и объекты в окне. Одним тегом можно обозначить группу объектов в нашей игре.
С помощью команды checkApple мы смотрим, съела ли наша змея яблоко, и добавляем ей сегмент в случае положительного ответа. Команда find_withtag находит один из предметов в окне, используя определенный заданный тег. Нам требуется всего два объекта — яблоко и змеиная голова.
Если яблоко будет съедено, то есть столкнется с головой, мы создадим новый сегмент на месте столкновения. И запустим метод locateApple, он удалит яблоко из холста и создаст новое в рандомной точке.
Мы управляем головой змейки, а метод doMove поможет нам изменять ее положение. Остальные сегменты будут двигаться за головой одной непрерывной цепочкой.
Так, следуя всем шагам далее, мы напишем простую игру, в которой обычная змейка будет есть яблоки и расти, пока не ударится об себя или поле.
Вывод
В итоге мы научились создавать простенькие игры без графики, сделали шаблон для создания программы на pygames и начали делать серьезную программу типа змейки. Все эти навыки помогут в дальнейшем создании игр и прояснят фундаментальные аспекты кодинга на Python. При любых неполадках или отказе компилятора в запуске кода необходимо проверить все строки кода на ошибки и попробовать заново написать программу в другом окне. Нужно быть максимально внимательным, и тогда все получится.
Читайте также: