Привет друзья!
Люди любят играть в мини-игры в своих браузерах. Вероятно, вы найдете браузерные игры практически любого жанра: от шутеров от первого лица, ролевых игр, аркадных игр до градостроительства, военных игр и так далее. Поэтому, если вы научитесь создавать браузерные игры, вы также сможете заработать приличную сумму денег.
Роль Python в игровой индустрии
- Поведение ИИ в SIMS записывается с использованием Python.
- Редактор карт Civilization IV поддерживает программирование на Python.
- Другой популярной игрой, поддерживающей Python, является Disney's Toontown Online, многопользовательская ролевая онлайн-игра (MMORPG). Это помогает pandas3D для графики игры, и игра довольно легкая.
- EVE Online — еще одна MMORPG, использующая Python без стека — вариант языка программирования Python для клиентского и серверного кода.
- Battlefield Heroes использует Python для некоторых частей своей игровой логики, таких как подсчет очков с помощью открытого текста и игровых режимов.
Как использовать Python для разработки браузерных игр?
Основные браузерные игры используют JavaScript и WebGL или Canvas2D для отображения графики в браузере. Невозможно создать всю браузерную игру с использованием Python, поскольку веб-браузеры используют HTML для отображения веб-страниц и их различных элементов. Таким образом, вы можете использовать Python для внутренней логики вашей игры и отображать ее как чистый HTML в браузерах.
Другой способ — использовать Python на серверной части для создания интерактивного Flash или JavaScript для запуска в браузере.
Популярные игровые движки, такие как Unity3D или UnrealEngine, позволяют экспортировать игровые проекты в совместимый код HTML5. Однако этот метод довольно сложен и требует много времени для реализации внутри игрового движка.
Лучше всего использовать любой собственный игровой движок HTML 5. Используя собственный игровой движок HTML5, вы можете создавать оптимизированный код JavaScript, который также повысит производительность ваших браузерных игр.
Давайте перейдем к мельчайшим деталям браузерных игр на основе Python. Вы должны использовать фронтенд-технологии и API-интерфейсы для рендеринга игры в браузере и использовать игровые библиотеки и фреймворки Python на бэкенде для определения игровой логики.
Технология разработки браузерных игр на Python
1 . Полноэкранный API — если вы хотите, чтобы ваша браузерная игра работала на весь экран.
2 . Gamepad API — для обеспечения поддержки геймпадов или других игровых контроллеров в вашей браузерной игре.
3 . Web Audio API — Игры без звука довольно скучны, и никто не хочет в них играть. Используйте API веб-аудио для управления воспроизведением и манипулированием аудио из кода JS. Вы можете добавлять крутые звуковые эффекты и применять их в режиме реального времени.
4 . HTML и CSS — самое важное для изучения, если вы хотите создать собственную браузерную игру. Используя HTML и CSS, вы можете спроектировать интерфейс своей браузерной игры. HTML-тег <canvas> обеспечивает простой способ создания 2D-графики.
5 . JavaScript — современный язык программирования для Интернета, который работает быстро. Используя его, вы можете применять логику Python из бэкэнда для управления игровым процессом.
6 . HTML-аудио — если вам требуется только базовое аудио для браузерной игры, вы можете просто применить HTML-элемент <audio>.
7 . WebGL — создавайте высокопроизводительную 3D- и 2D-графику с аппаратным ускорением из веб-контента.
8 . WebRTC — WebRTC или Web Real-Time Communications API поддерживает передачу видео- и аудиоданных, включая телеконференции между несколькими пользователями. Итак, если вы хотите создать многопользовательскую онлайн-игру и позволить игрокам общаться друг с другом, пока они заняты убийством зомби, то этот API для вас.
9 . WebSockets — подключите свою браузерную игру к серверу и упростите передачу данных в режиме реального времени для поддержки игровых действий, служб чата и т. д.
1о. Web Workers. Воспользуйтесь преимуществами современных многоядерных процессоров с помощью Web Workers. Создавайте фоновые игровые потоки, выполняющие собственный код JS, чтобы повысить производительность вашей онлайн-игры на основе Python.
11 . Pointer Lock API — получите точные координаты курсора вашего пользователя, чтобы точно измерить, что игроки делают в игре.
Теперь, когда вы знакомы с различными веб-технологиями, которые можно использовать для разработки онлайн-игр на Python. Давайте посмотрим на различные библиотеки и фреймворки Python для разработки игр.
Библиотеки Python для разработки онлайн-игр
- Пигейм
PyGame — это простой и удобный набор модулей Python для разработки видеоигр. Он добавляет функциональность поверх библиотеки SDL. Таким образом, вы можете создавать первоклассные игры на Python.
На веб-сайтах PyGame создано более 660 игровых проектов, в том числе финалисты Indie Game Festival, Australian Game Festival и так далее.
Особенности :
- Поддержка многоядерных процессоров
- Использует оптимизированный код на C и ассемблере
- Портативный
- Отличный контроль над вашим основным циклом.
- Модульный
- Игры, разработанные с использованием Pygame — Magic Leap, Oculus Quest, Valve Index, Windows Mixed Reality и так далее.
- Киви
Kivy — это кроссплатформенная среда Python для разработки NUI, которую вы можете использовать для разработки увлекательных и захватывающих мобильных игр. Будь то простая игра-головоломка или аркадная игра, вы можете воплотить свою игровую идею в реальность с помощью Kivy.
Особенности:
- Kivy поддерживает быстрое прототипирование приложений.
- Напишите свой игровой код один раз и запустите его на нескольких платформах, включая Windows, Linux, OS X, iOS и Android.
- Встроенная поддержка ввода данных пользователем с различных устройств, включая трекпад Mac OS X, WM_Pen, Linux Kernel HID и т. д.
- Бесплатное использование для коммерческих проектов.
- Графический движок использует OpenGL ES 2.
- Игры, разработанные с использованием Kivy — Deflectouch, FishLife, memoryKivy, ArithmeBricks и т. д.
Мобильные игры, разработанные с использованием Kivy — Spikes Escape, Ants Must Die, CoinTex, Quadropoly и др.
- Пыганим
Pyganim, произносится как «свинья» и «анимация», представляет собой модуль Pygame для быстрого добавления анимации спрайтов и поддерживает как Python 2, так и Python 3.
Вы можете использовать его вместе с библиотекой PyGame для разработки своей мобильной игры, если она требует более сложных преобразований спрайтов и анимации.
- OcempGUI
OcempGUI — это набор инструментов на основе Python для создания простых графических интерфейсов. Он использует возможности библиотеки PyGame и позволяет разрабатывать широкий спектр игровых проектов.
Если вы хотите создавать базовые игры на Python, включающие простые элементы графического интерфейса, такие как поля ввода, кнопки, прокрутка и простые события, вы можете быстро начать работу с OcempGUI.
Особенности:
- Экономьте свое время, используя широкий спектр функций рисования.
- Сосредоточьтесь на своей основной задаче, вместо того чтобы возиться с низкоуровневыми компонентами.
- Создавайте простые игры Python с графическим интерфейсом.
- пыжи
pyjs — это платформа разработки многофункциональных интернет-приложений (RIA) для разработки как веб-игр, так и настольных игр. С помощью pyjs вы можете написать свою игру на JavaScript полностью на Python, поскольку он содержит компилятор Python-to-JavaScript.
Вот обзор того, как работает pyjs:
Особенности:
- Запустите веб-игру Python на рабочем столе как отдельное приложение.
- Разрабатывайте игры, используя Python вместо HTML и CSS.
- Библиотека AJAX для решения проблем совместимости браузеров.
- Виджеты пользовательского интерфейса и библиотека DOM — написаны на Python и переведены на JS для развертывания вашей мобильной игры/
Рассмотрим на примере
Вы помните то время, когда на экранах смартфонов появилась Flappy Bird? Эта игра положила начало эре казуальных игр с очень небольшим количеством внутриигровых действий, и каждый неверный ход означает, что ваша игра окончена. Тот, кто продержится дольше всех, возглавит таблицу лидеров.
Сегодня мы увидим, как написать бота на Python, который использует библиотеку компьютерного зрения OpenCV, чтобы победить Don't touch the red, бесконечного бегуна от Addicting Games.
Начальный экран
Правила игры
Игра довольно простая: зеленые кнопки падают, и игроку нужно нажать на них, прежде чем покинуть экран. И, конечно же, не трогайте красный!
Есть одна важная особенность; если играть в аркадном режиме, то кнопки падают с нарастающей скоростью. Это усложняет игру для игрока-человека. Но для нашего бота это не проблема!
Сопоставление шаблонов OpenCV
Основная часть нашего бота компьютерного зрения — это сопоставление шаблонов, доступное в библиотеке OpenCV. Это не нейросетевой подход. Это намного проще и ограниченнее. Этот алгоритм предназначен для поиска метки на целевом изображении, например, «зеленой кнопки» на «игровом экране».
Это работает следующим образом: алгоритм берет шаблонное изображение, а затем, используя скользящее окно, пытается найти соответствующий патч на целевом изображении. Используя это, мы можем получить позиции и меры подобия для каждого пикселя.
Пример обнаружения монет в Mario. В коде приложение сопоставления шаблонов выглядит так
В коде приложение сопоставления шаблонов выглядит так
import cv2
template = cv2.imread ('template.png')
target = cv2.imread ('target.png')
result = cv2.matchTemplate (target, template, cv2.TM_CCOEFF_NORMED)
_, max_val, _, max_loc = cv2.minMaxLoc (result)
В результате мы получим max_val — максимальное сходство на целевом изображении, равное max_locлевому верхнему углу найденного совпадения.
Два типа используемых шаблонов
Создание снимков экрана и взаимодействие
Другими важными частями бота являются получение экранов для анализа и то, как мы отправляем щелчки мыши в игру. Необходимо отметить, что Addicting Games предоставляет игры, в которые вы можете играть в своем интернет-браузере, поэтому ничего дополнительно устанавливать не нужно.
Есть два пакета Python, которые помогают с вышеуказанными задачами: mssи pyautogui, мы используем их для получения скриншотов определенной части экрана и отправки кликов в окно браузера соответственно. Я также использую keyboard библиотеку, так как очень удобно установить «действие разрыва» на какую-либо клавишу в случае, когда вашей мышью управляет бот. Библиотеке keyboard (и, возможно, pyautogui) требуются sudoправа, поэтому запустите свой скрипт Python как исполняемый файл с правильным заголовком shebang.
Здесь я привожу фрагменты кода, как получать скриншоты и отправлять клики:
#!/hdd/anaconda2/envs/games_ai/bin/python
# ^ change above to your python path ^
import keyboard
import mss
import pyautogui
pyautogui.PAUSE = 0.0
print («Press 's' to start»)
print («Press 'q' to quit»)
keyboard.wait ('s')
# setup mss and get the full size of your monitor
sct = mss.mss ()
mon = sct.monitors[0]
while True:
# decide on the part of the screen
roi = {
«left»: 0,
«top»: int (mon["height"] * 0.2),
«width»: int (mon["width"] / 2),
«height»: int (mon["height"] * 0.23)
}
roi_crop = numpy.array (sct.grab (roi))[:,:,:3]
# do something with `roi_crop`
if keyboard.is_pressed ('q'):
break
Алгоритм
Он превосходит предыдущую человеческую игровую оценку 170 с оценкой 445.
Бот в действии
В программе две части. Сначала пытается нажать первые три кнопки, доступные на экране при запуске игры. Игровое поле не перемещается, пока игрок не нажмет первую кнопку, поэтому мы можем рассматривать поле как статическое, когда нажимаем первые три кнопки. Для этого осматриваем три строки экрана в поисках небольшого узора (см. предыдущий рисунок), а затем нажимаем на них
Первая половина кода:
#!/hdd/anaconda2/envs/games_ai/bin/python
# if «Xlib.error.DisplayConnectionError» use «xhost +» on linux
import shutil
import os
import keyboard
import mss
import cv2
import numpy
from time import time, sleep
import pyautogui
from random import randint
import math
pyautogui.PAUSE = 0.0
print («Press 's' to start»)
print («Press 'q' to quit»)
keyboard.wait ('s')
try:
shutil.rmtree («./screenshots»)
except FileNotFoundError:
pass
os.mkdir («./screenshots»)
# setup mss and get the full size of your monitor
sct = mss.mss ()
mon = sct.monitors[0]
frame_id = 0
# decide where is the region of interest
for idx in range (3,0, -1):
roi = {
«left»: 0,
«top»: int (mon["height"] * (idx * 0.2)),
«width»: int (mon["width"] / 2),
«height»: int (mon["height"] * 0.23)
}
green_button = cv2.imread ('green_button.png')
offset_x = int (green_button.shape[0] / 2)
offset_y = int (green_button.shape[1] / 2)
roi_crop = numpy.array (sct.grab (roi))[:,:,:3]
result = cv2.matchTemplate (roi_crop, green_button, cv2.TM_CCOEFF_NORMED)
_, max_val, _, max_loc = cv2.minMaxLoc (result)
print (max_val, max_loc)
button_center = (max_loc[0] + offset_y, max_loc[1] + offset_x)
roi_crop = cv2.circle (roi_crop.astype (float), button_center, 20, (255, 0, 0), 2)
cv2.imwrite (f"./screenshots/{frame_id:03}.jpg", roi_crop)
abs_x_roi = roi["left"] + button_center[0]
abs_y_roi = roi["top"] + button_center[1]
pyautogui.click (x=abs_x_roi, y=abs_y_roi)
frame_id += 1
Во второй части нажимаем следующие 400 кнопок; он реализован как бесконечный цикл while, который захватывает экран и нажимает на пиксель, где ожидается увидеть кнопку, касающуюся текущей скорости. Функция скорости была выбрана как логарифмическая функция числа итераций. Эта функция обеспечивает смещение пикселей, необходимое для корректировки по истечении времени с момента обнаружения шаблона.
Вторая половина:
second_roi = {
«left»: 0,
«top»: int (mon["height"] * 0.18),
«width»: int (mon["width"] / 2),
«height»: int (mon["height"] * 0.06)
}
btn = cv2.imread ('center.png')
offset_y = int (btn.shape[0])
offset_x = int (btn.shape[1] / 2)
thresh = 0.9
frame_list = []
btn_cnt = 1
while True:
frame_id += 1
second_roi_crop = numpy.array (sct.grab (second_roi))[:,:,:3]
result = cv2.matchTemplate (second_roi_crop, btn, cv2.TM_CCOEFF_NORMED)
_, max_val, _, max_loc = cv2.minMaxLoc (result)
# define the speed of the screen
speed = math.floor (math.log (frame_id)**2.5)
print (frame_id, max_val, max_loc, speed)
frame_list.append (max_loc[0])
if max_val > thresh:
button_center = (max_loc[0] + offset_x, max_loc[1] + offset_y)
second_roi_crop = cv2.circle (second_roi_crop.astype (float), button_center, 20, (255, 0, 0), 2)
cv2.imwrite (f"./screenshots/{frame_id:03}.jpg", second_roi_crop)
abs_x_sec = second_roi["left"] + button_center[0]
abs_y_sec = second_roi["top"] + button_center[1] + speed
pyautogui.click (x=abs_x_sec, y=abs_y_sec)
btn_cnt += 1
if keyboard.is_pressed ('q'):
break
Как видите, скорость параметризована, и в зависимости от конфигурации вашего ПК вы можете найти лучшие параметры, которые превышают этот высокий балл. Это связано с тем, что код очень зависит от скорости обработки изображения и может варьироваться от системы к системе.
Чтобы не быть голословным, вот скриншот таблицы лидеров. В этой конкретной игре очки на всех уровнях сложности идут в таблицу лидеров, поэтому вам не нужно играть в «Сложно». «Легкий» уровень просто отличный (кстати, когда вы достигаете 100 нажатой кнопки, вы больше не можете сказать, что это легко)/
Таблица лидеров
Код проекта доступен на Github https://github.com/zetyquickly/addicting-games-ai. Было бы здорово создать обширную библиотеку взломанных игр и хранить там все эти алгоритмы. Итак, вам предлагается создавать пулл-реквесты!
Итоги
В этой статье мы рассмотрели различные методы и инструменты для создания крутых веб-игр на Python, в которые ваши пользователи могут играть в своих браузерах в любое время и в любом месте.
Python может проделать большую работу, чтобы повысить свою игровую производительность по сравнению с C# и C++, которые являются гораздо лучшими альтернативами для разработки ресурсоемких игр. Тем не менее, Python все еще не отстает.
Если вы хотите создавать простые, но увлекательные мобильные игры, вы можете поиграть с ним.
Простые игры можно сделать на голом html, css и js. Тут даже библиотеки не нужны типа реакта, ну разве что jquery. Если же проект средний и игра не элементарная, то лучше сразу юзать готовую и отработанную библиотеку для игр. Библиотека PyGame довольно хороша для этого. Питон простой и в ней есть не мало уже готовых решений для игр и не нужно городить малоэффективный «велосипед».
Сам сейчас питон изучаю и это просто шедевр, а не язык. Настолько все понятно и не перегружено витиеватыми командами, что понимаешь с первого раза. Ну а Пигейм — это лучшая библиотека из всех. Даже не обладая обширными знаниями через нее можно создавать отличные вещи.
За примеры в статье отдельный респект, давно искал такие материалы. Сейчас буду пробовать!
Здравствуйте! Хотел бы оставить положительный отзыв для тех, кто ищет ботов для игр и в принципе для всех. На данном сайте вы можете ознакомится с часто задаваемыми вопросами, на которые найдёте ответ. Сайт так скажем показывает и рассказывает основы, для создания вашей игры, помогает вам более оптимально и продуктивней настроить и создать бота для игр. Сайт очень полезный, рекомендую.