Создайте игру на Python для Raspberry Pi.

Если вы являетесь счастливым обладателем Raspberry Pi, визуальный язык Scratch — отличный способ сделать первые шаги в программировании. Но чтобы раскрыть больше возможностей и потенциала оборудования, взгляните на Python.

Python — это образовательный язык программирования по умолчанию для Raspberry Pi. Он используется во всем мире в качестве вводного языка для многих платформ благодаря лаконичному стилю и простому для понимания синтаксису. Однако он предназначен не только для новичков: согласно индексу сообщества программистов TIOBE, Python является восьмым по популярности языком программирования среди профессиональных инженеров, опережая Perl, JavaScript и Visual Basic .NET. Кроме того, он бесплатен, поэтому легко понять, почему так много людей выбирают Python в качестве своего первого языка сценариев.

Программы для Windows, мобильные приложения, игры - ВСЁ БЕСПЛАТНО, в нашем закрытом телеграмм канале - Подписывайтесь:)

В этой статье мы познакомим вас с ключевыми понятиями Python и покажем, как начать работу с языком, проведя вас через пример игры, написанной на Python. Тогда вы можете создать свой собственный шедевр, который вы сможете отправить на наш конкурс кодирования на Raspberry Pi.

Знакомство с Питоном

Используются две основные версии Python. За Python 3 будущее, но Python 2 обладает более широкой совместимостью с существующими ресурсами, и именно эта версия в настоящее время поставляется в комплекте с Raspberry Pi. В этом руководстве мы будем использовать Python 2.7, последнюю стабильную версию серии 2.x: это означает, что мы можем использовать большинство онлайн-примеров и предварительно написанный код без изменений. Когда придет время, переход на версию 3 будет простым.

Первое, что вы можете заметить в Python, — это то, насколько аккуратно он выглядит. Те, кто привык к PHP, JavaScript или другим современным языкам, также заметят отсутствие фигурных скобок, которые традиционно используются для заключения разделов кода. Это связано с тем, что Python использует отступы для организации кода. Это хорошая практика для большинства языков, поскольку она делает код более читабельным: в Python это обязательно. Если вы неправильно установите интервал, ваш код не будет работать. Хотя это может быть изменением для опытных программистов, оно быстро становится естественным и по умолчанию приводит к чистому и понятному коду.

Python также является хорошим первым языком, поскольку он представляет собой простую реализацию объектно-ориентированного программирования (концепцию, которую должен понимать любой начинающий программист) и не требует особых усилий в отношении создания и управления переменными. Конечным результатом является особенно продуктивная среда программирования.

Код Python обычно выполняется через интерпретатор, а не компилируется, но, несмотря на это, конечные результаты получаются довольно быстро. Приложения Python могут работать во всех основных операционных системах, поэтому можно создать игру Python на ПК с Windows и запустить ее на компьютере Mac или Linux – или, действительно, на Raspberry Pi.

Создайте игру на Python для Raspberry Pi.

И последнее большое преимущество Python — это доступность широкого спектра дополнительных модулей, обеспечивающих дополнительную функциональность. Одним из таких модулей является Пигаме. Как следует из названия, Pygame помогает создавать игры с использованием Python: например, он значительно улучшает обработку изображений с помощью класса Sprite, упрощает управление внутриигровым звуком и даже позволяет вашей игре работать с джойстиками. Такие игры, как Call of Duty, возможно, выходят за рамки его возможностей, но клон Angry Birds определенно нет.

Нативная и кроссплатформенная разработка

Если вы используете рекомендованный дистрибутив Debian Squeeze Linux на своем Raspberry Pi, Python и Pygame уже установлены, поэтому вы можете сразу приступить к программированию. Вы можете писать сценарии Python в текстовом редакторе, но мы предлагаем вам воспользоваться бесплатной интегрированной средой разработки (IDE) Geany, которая также устанавливается как часть операционной системы. Это программное обеспечение предлагает множество полезных функций для программистов, таких как автоматическая раскраска синтаксиса, упрощающая чтение и отладку вашего кода, а также браузер символов, помогающий отслеживать все классы и переменные в вашем коде.

Однако, как мы уже упоминали, Python работает на многих платформах, поэтому вы можете написать свой код на ПК с Windows, а затем перенести его на Raspberry Pi, когда закончите. Для этого вам нужно установите Python 2.7 на свой компьютер. Даже если вы используете 64-разрядную версию Windows, выберите обычный установщик Windows, а не x86-64, поскольку стандартная установка Pygame выполняется только для 32-разрядной версии.

После установки Python (приняв параметры установки по умолчанию), загрузите Pygame для Windows — снова примите настройки по умолчанию. Если у вас уже есть предпочитаемая IDE, она почти наверняка будет поддерживать Python «из коробки»; если нет, приобретите Geany для Windows. Чтобы настроить его для тестирования и запуска скриптов Python, запустите Geany, затем перейдите в меню «Сборка» и нажмите «Задать команды сборки». Найдите поле «Выполнить» и замените текущее содержимое на C:Python27python %f (при условии, что вы установили Python в каталог по умолчанию).

Разработка игры

Нашим первым проектом на Python будет простая игра-стрелялка под названием Raspberry Pie (хм). В этой игре три разных вида фруктов упадут с вершины игровой площадки, но только малина должна достичь низа и попасть в пирог. Игрок управляет подвижной турелью и зарабатывает очки, стреляя в вишню и клубнику: очки вычитаются, если малина случайно уничтожается или если один из других фруктов оказывается в пироге.

Начнем со сбора активов. Открыть библиотеку клипов — отличное место для поиска бесплатных клипартов; отсюда мы можем получить изображения фруктов. Мы создадим собственные изображения для турели и пуль. Мы также могли бы собрать вместе звуки для нашей игры, но сейчас мы будем делать все просто и бесшумно.

Теперь давайте подумаем, как мы собираемся структурировать нашу программу. Базовая структура аркадной игры одинакова, планируете ли вы использовать Scratch, Python или любой другой инструмент. Начнем с настройки среды цикла выполнения и создадим объекты, которые будут использоваться в игре. Затем мы все инициализируем — например, устанавливаем нулевой балл. Затем есть основной цикл, который управляет игровым процессом. После окончания игры отображается счет.

Объекты

Объектно-ориентированное программирование (ООП) лежит в основе большинства современных языков программирования, и его не так уж сложно понять. Подумайте о видимых объектах в нашей игре: единственные аспекты, которые различаются от одного падающего фрукта к другому, — это их положение и род (то есть, малина ли это, клубника или вишня). Поэтому мы можем очень просто представить их все, создав один класс фруктов со свойствами, указывающими род и положение. Затем мы можем создавать фрукты как независимые экземпляры класса (эти экземпляры являются «объектами» ООП), каждый из которых содержит информацию о том, что это за фрукт и его местонахождение.

Создайте игру на Python для Raspberry Pi.

Помимо свойств, классы могут иметь методы — встроенные действия, которые мы можем вызывать, когда захотим. В случае с фруктами главное, что делает каждый предмет, — это падение. Поэтому мы могли бы встроить в наш класс метод, который говорит: «Возьмите мою текущую вертикальную позицию и переместите ее на 3 пикселя вниз».

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

Создание кода

На следующих страницах мы познакомим вас с кодом Raspberry Pie, чтобы вы могли увидеть, как работает программа, и, если хотите, ввести ее. Если что-то кажется неясным, вашей первой остановкой должен быть Документация Python для получения дополнительной информации. Мы также будем активно использовать методы и свойства, предоставляемые Pygame: см. документацию здесь.

Вы также можете скачать файл кода здесь, если хотите сразу поиграть в игру самостоятельно. Кроме того, вы можете использовать этот код в качестве отправной точки для изучения большего, изменяя и обновляя его самостоятельно. Можете ли вы добавить таблицу рекордов? Или заставить разные виды фруктов двигаться по-разному? Освоив основы написания игр на Python, вы сможете создать свою собственную оригинальную игру и отправить ее на наш конкурс.

Код

Вы можете скачать этот необработанный код полностью, используя ссылки в поле. Комментарии в начале каждого раздела – например, «## 1:» – соответствуют пронумерованным шагам в тексте ниже.

Пошаговое руководство: создание малинового пирога на Python

1: Начните с открытия Geany и сохраните пустой документ как «raspberry.py». Расширение сообщает Geany, что мы используем Python, поэтому оно соответствующим образом подсвечивает наш синтаксис. В качестве еще одного наглядного пособия перейдите в меню «Правка» Geany и выберите «Настройки» | Редактор | Отобразите и отметьте «Показать пробелы» — это поможет обнаружить ошибки отступов. Теперь мы готовы к нашей первой строке кода. Оператор импорта связывает внешние библиотеки с нашей программой, поэтому мы можем использовать содержащиеся в них классы, свойства и методы. Прежде чем идти дальше, давайте проверим, можно ли найти эти библиотеки. Нажмите кнопку «Выполнить», и должно появиться командное окно. Если возникнет проблема, это будет содержать сообщение об ошибке; в противном случае мы готовы идти.

2: Теперь мы создаем наш первый класс — простой под названием Game, который отслеживает счет. Мы определяем этот класс с помощью оператора class и даем ему имя. Двоеточие после имени отмечает начало блока кода, описывающего свойства экземпляров Game. Для обозначения конца этого блока не требуется никаких знаков препинания: это показано отступом. Определите один метод под названием «__init__». Это специальный метод (называемый конструктором), который автоматически запускается при создании объекта этого класса. В этом случае он создает и инициализирует переменные для оценки и количества малины. Как вы можете видеть, используется тот же синтаксис двоеточия и отступов, и когда мы определяем класс, мы используем заполнитель «self», чтобы заменить любое имя экземпляра.

3: Теперь давайте определим класс турели игрока. Мы возьмем за основу класс Sprite Pygame, который полон полезных свойств и методов. Чтобы указать это, мы помещаем имя этого класса («родительский класс») в скобки после имени класса. Теперь мы создаем метод-конструктор турели. Сначала мы вызываем конструктор родительского класса, чтобы все инициализировать. Затем мы используем метод Pygame image.load, чтобы импортировать изображение для нашей турели и сохранить его в свойстве «image». Метод get_rect() позволяет нам получить доступ к положению и размерам этого изображения, поэтому в следующей строке мы можем использовать свойство rect, чтобы установить положение турели в пикселях. Выбранные нами координаты располагаются посередине нижней части области, которую мы собираемся использовать для игры. Использование точки с запятой позволяет разместить две команды в одной строке.

4: Турель должна иметь возможность двигаться, поэтому мы добавим второй метод под названием moveMe, который будет вызываться, когда игрок нажимает клавишу курсора. Для этого потребуется два аргумента: ссылка на турель, которую нужно переместить, и направление движения. Если аргумент направления «влево» — и левый край турели еще не находится в пределах пяти пикселей от края игры область – мы вычитаем пять пикселей из ее горизонтальных координат с помощью оператора вычитания «-=». (Обратите внимание также на оператор «==», который используется для проверки равенства двух значений.) Если направление «вправо», мы проверяем, не находится ли правый край турели слишком близко к правой стороне: мы вычисляем это с помощью rect.width, поэтому наш код будет работать независимо от размера изображения турели. Предполагая, что есть место для перемещения, мы затем добавляем пять пикселей к горизонтальной координате турели.

5: Далее мы создаем класс для пуль, почти так же, как и для турели. Однако, хотя турель всегда создается в центре игровой зоны, каждый новый экземпляр пули должен появляться прямо над центром турели. Чтобы найти правильную координату «x», мы выполняем несколько вычислений, включающих свойства rect.width как у объектов турели, так и у пули. Чтобы разместить пулю непосредственно над турелью, мы устанавливаем ее координату «y» такой же, как координата «y» башни, за вычетом высоты башни (вертикальные координаты отсчитываются от верхней части экрана). до самого низа). Пуле также нужен метод перемещения: updatePosition перемещает ее на пять пикселей вверх по экрану или удаляет, если она достигла верха.

6: Все три типа фруктов в игре ведут себя одинаково, поэтому мы можем вывести их всех из одного класса. Тип фрукта, который представляет каждый экземпляр, определяется случайным целым числом от одного до трех и сохраняется в свойстве, называемом род. Мы используем это свойство для сборки имени файла и загрузки нужного изображения. Чтобы добавить визуального разнообразия, мы случайным образом поворачиваем изображение на угол от -5° до 15°. Все фрукты начинаются над верхней частью экрана, готовые упасть в игровую зону, поэтому мы устанавливаем начальное вертикальное положение равным нулю минус высота изображения. Наконец, мы устанавливаем его горизонтальное исходное положение. Мы не хотим, чтобы фрукты выступали за пределы игровой площадки, поэтому используем случайное число от 20 до 440.

Программы для Windows, мобильные приложения, игры - ВСЁ БЕСПЛАТНО, в нашем закрытом телеграмм канале - Подписывайтесь:)

7: Точно так же, как пули летят вверх, фрукты перемещаются по экрану через определенные промежутки времени, поэтому мы даем этому классу собственный метод updatePosition. Если вертикальное положение фрукта меньше 640, то есть если он все еще находится в игровой зоне, оно уменьшается на три пикселя. В противном случае оценка обновляется. Если свойство рода объекта равно 1, что означает, что этот фрукт — малина, игрок получает десять очков, а счетчик малины увеличивается. В противном случае игрок теряет 50 очков. В любом случае, фруктовый объект теперь удален. Мы также создаем метод Shot, который будет вызываться, если в фрукт попадает пуля. Если фрукт — малина, из счета игрока вычитаем 50 очков; в противном случае добавьте 10 баллов. Опять же, в любом случае объект уничтожается.

8: Теперь, когда все наши классы созданы, пришло время инициализировать игру. Сначала мы инициализируем сам Pygame, чтобы убедиться, что все находится в состоянии по умолчанию. Затем мы используем метод pygame.key.set_repeat(), чтобы указать, что если пользователь удерживает клавишу, событие будет регистрироваться каждые 20 миллисекунд. Следующие две строки настраивают объекты шрифтов, которые будут отображать счет и количество выпавшей малины — подробнее об этом см. на веб-сайте Pygame. Мы сохраняем значение черного цвета в переменной с таким именем (три нуля обозначают значения красного, зеленого и синего) — это просто для удобства в дальнейшем. Далее мы настраиваем окно игры: Raspberry Pie работает в портретном пространстве размером 480 x 640 пикселей, которое мы будем называть «экраном». Наконец, мы установили заголовок этого окна, чтобы отображать название игры.

9: Теперь мы готовы приступить к созданию объектов на основе классов, которые мы определили на шагах 2–7. Сначала мы создаем объект Game с именем game и объект Turret с именем turret (обратите внимание на соглашение о написании заглавных букв). Затем для удобства мы создаем группу под названием «Спрайты» и добавляем в эту группу турель. Мы также создаем группы для фруктов и пуль (хотя мы пока не можем добавлять участников в эти группы, так как мы еще не создали объекты). Объединение спрайтов в группы — удобный способ организовать игровые элементы. Например, если вы создаете платформер, использование групп позволит легко нарисовать все фоновые плитки одновременно, а затем нарисовать игрока и врагов сверху. Группы спрайтов также упрощают использование процедур обнаружения столкновений Pygame: одна строка кода может проверить, столкнулся ли какой-либо элемент одной группы с каким-либо элементом другой.

10: Прежде чем войти в основной цикл, мы инициализируем переменную с именем end_game: пока она остается ложной, основной цикл будет продолжать работать. Когда десять малин упадут на землю, мы установим для этой переменной значение True, и игра завершится. Затем мы инициализируем объект под названием clock, основанный на объекте Pygame Clock, чтобы управлять тем, как часто мы опрашиваем события и обновляем экран — если бы игра шла с максимальной скоростью, с которой может справиться Raspberry Pi, в нее было бы невозможно играть. Наконец, мы инициализируем переменную под названием «tock». Это будет отслеживать, сколько времени прошло с тех пор, как фрукт последний раз появлялся на экране, поэтому мы можем добавлять новый каждые две секунды.

11: Теперь пришло время начать основной игровой цикл. Мы реализуем это с помощью блока while — блока кода, который выполняется только до тех пор, пока переменная end_game не установлена ​​в значение True (оператор != означает «не равно»). В конце блока это условие будет проверено еще раз, и если оно все еще истинно, то блок выполнится снова — и так далее, по кругу, пока значение end_game не изменится. Внутри этого цикла мы начинаем с оператора Pygame clock.tick(): он вводит небольшую паузу, регулируя скорость выполнения так, чтобы цикл выполнялся не чаще 30 раз в секунду (как указано числом в скобках). Затем мы увеличиваем значение tock на единицу, чтобы отметить, что прошло еще немного времени. Наконец, мы очищаем игровую область, используя значение черного цвета, которое мы определили ранее.

12: Теперь мы проверяем события нажатия клавиш, чтобы игра могла ответить пользователю. Pygame создает и сохраняет событие каждый раз при нажатии клавиши (или несколько событий, если клавиша удерживается), и мы можем получить к ним доступ с помощью метода event.get(). Синтаксис for…in в Python позволяет нам последовательно перемещаться по каждому событию и обрабатывать его по очереди. Для каждого полученного события мы сначала проверяем, закрыл ли пользователь окно игры — в этом случае мы завершаем игру. Затем мы проверяем, нажал ли пользователь левую или правую клавишу курсора: если да, мы вызываем метод турели moveMe с соответствующим параметром. Если пользователь нажал пробел, мы создаем новый маркер, передавая ему ссылку на турель, чтобы он знал, где появиться, и добавляем этот маркер в нашу группу спрайтов.

13: Теперь перемещаем все пули вверх по экрану, а все фрукты вниз. Поскольку каждый объект содержит метод, который соответствующим образом перемещает его, нам просто нужно вызвать этот метод для каждой пули и фрукта в игре. Опять же, мы можем сделать это, используя синтаксис for…in, чтобы поочередно переместить каждого члена группы маркеров и каждого члена группы фруктов. Нам не нужно отправлять какие-либо аргументы методу updatePosition маркера, но для фруктов мы должны вызвать updatePosition(Game). Это связано с тем, что метод updatePosition в классе фруктов включает код, который автоматически обновляет оценку пользователя, если фрукт достигает нижней части игровой зоны, поэтому ему нужна ссылка на объект, содержащий это свойство.

14: Переменная «tock» увеличивается каждый раз при выполнении основного цикла. Поскольку цикл выполняется 30 раз в секунду, мы знаем, что прошло две секунды, когда tock превышает 60. На этом этапе мы добавляем новый фрукт — при условии, что на экране уже меньше десяти фруктов. Мы проверяем это с помощью функции len (название короткое, немного неуместное, от «длина»), чтобы подсчитать, сколько членов имеет группа фруктов. Если их меньше десяти, мы создаем новый объект фруктов и добавляем его в нашу группу фруктов. Во время игры «фрукты» всегда будут относиться к тому объекту фруктов, который был создан последним: мы могли бы дать каждому экземпляру фруктов свою уникальную ссылку, но в этом нет необходимости. Наконец, мы сбрасываем ток до нуля, возобновляя двухсекундный отсчет.

15: Теперь проверим, не пострадал ли какой-нибудь из фруктов от пули. Pygame делает это очень просто: просто передайте ссылки на две группы спрайтов в метод Pygame groupcollide(), и он устранит столкновения. Он также может автоматически удалять один или оба сталкивающихся объекта. В нашем случае мы не хотим, чтобы фрукты удалялись (сначала мы хотим проверить тип фруктов и соответствующим образом обновить оценку), но маркер можно удалить сразу. Мы передаем это, передавая «False, True» в качестве аргументов, ссылаясь на первый и второй аргументы соответственно. Метод groupcollide() возвращает список, который мы назовем «столкновениями»: если в нем есть какие-либо члены, мы используем еще один цикл for…in для запуска метода «shot» для каждого попавшегося фрукта.

16: Механика игры на этом завершена, но нам еще нужен код, показывающий текущий счет и количество собранной малины. Ранее мы создали два объекта шрифтов Pygame; теперь мы можем создавать текст, обращаясь к методу рендеринга этого класса. Для этого требуется четыре аргумента: первый — это отображаемый текст, за которым следует строковое (текстовое) представление оценки пользователя. Затем мы указываем, хотим ли мы сгладить текст, и задаем значения RGB для цветов переднего плана и фона. Метод screen.blit() Pygame рисует визуализируемый текст на экране по указанным координатам. Повторяем то же самое со счетом малины, с той лишь разницей, что это число отсчитывается от десяти и отображается вверху экрана, а не внизу.

17: Наконец, мы обновляем экран, чтобы отобразить новые позиции нашей турели, пуль и фруктов. Метод рисования Pygame позволяет нам отображать всех членов группы спрайтов в одной строке кода, но экран не перерисовывается сразу: метод display.flip() обновляет весь экран за один раз, так что все движется плавно и одновременно. . Наконец, проверяем, закончилась ли игра. Как видно из отступа, это конец основного блока кода, поэтому выполнение возвращается к оператору while в разделе 11, а следующие строки выполняются только после завершения игры. Эти строки загружаются в графический фрейм с использованием метода Convert_alpha Pygame для обеспечения прозрачности и отображают окончательный текст оценки сверху. Мы используем еще один блок «пока», чтобы приостановить игру, чтобы игрок мог прочитать текст. Когда они закрывают окно игры, Python выходит из игры.

Создайте игру на Python для Raspberry Pi.

Самый последний шаг – тестирование. Это особенно важно, если вы использовали другую платформу для разработки: по современным стандартам Raspberry Pi — очень медленный компьютер, и на нем установлена ​​ОС, отличная от вашего ПК, поэтому очень важно убедиться, что ваша игра работает правильно и перед публикацией работает на игровой скорости. Если вы работаете в Windows и планируете тестировать свое творение на собственном оборудовании только в конце процесса (например, если вы пишете код дома для запуска на Raspberry Pi в школе), самый простой способ — перенести папку, содержащую вашу игру, на USB-накопителе и загрузите ее в Geany на Raspberry Pi. Инициализация может занять некоторое время, но пока ваша игра не тратит попусту память и не пытается выполнять чрезмерно ресурсоемкие вычисления, все будет в порядке.

Похожие записи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *