Привет друзья!

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

Роль 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 для разработки онлайн-игр

  1. Пигейм

PyGame — это простой и удобный набор модулей Python для разработки видеоигр. Он добавляет функциональность поверх библиотеки SDL. Таким образом, вы можете создавать первоклассные игры на Python.

На веб-сайтах PyGame создано более 660 игровых проектов, в том числе финалисты Indie Game Festival, Australian Game Festival и так далее.

Особенности :

  • Поддержка многоядерных процессоров
  • Использует оптимизированный код на C и ассемблере
  • Портативный
  • Отличный контроль над вашим основным циклом.
  • Модульный
  • Игры, разработанные с использованием Pygame — Magic Leap, Oculus Quest, Valve Index, Windows Mixed Reality и так далее.
  1. Киви

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 и др.

  1. Пыганим

Pyganim, произносится как «свинья» и «анимация», представляет собой модуль Pygame для быстрого добавления анимации спрайтов и поддерживает как Python 2, так и Python 3.

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

  1. OcempGUI

OcempGUI — это набор инструментов на основе Python для создания простых графических интерфейсов. Он использует возможности библиотеки PyGame и позволяет разрабатывать широкий спектр игровых проектов.

Если вы хотите создавать базовые игры на Python, включающие простые элементы графического интерфейса, такие как поля ввода, кнопки, прокрутка и простые события, вы можете быстро начать работу с OcempGUI.

Особенности:

  • Экономьте свое время, используя широкий спектр функций рисования.
  • Сосредоточьтесь на своей основной задаче, вместо того чтобы возиться с низкоуровневыми компонентами.
  • Создавайте простые игры Python с графическим интерфейсом.
  1. пыжи

pyjs — это платформа разработки многофункциональных интернет-приложений (RIA) для разработки как веб-игр, так и настольных игр. С помощью pyjs вы можете написать свою игру на JavaScript полностью на Python, поскольку он содержит компилятор Python-to-JavaScript.

Вот обзор того, как работает pyjs:pyjs

Особенности:

  • Запустите веб-игру Python на рабочем столе как отдельное приложение.
  • Разрабатывайте игры, используя Python вместо HTML и CSS.
  • Библиотека AJAX для решения проблем совместимости браузеров.
  • Виджеты пользовательского интерфейса и библиотека DOM — написаны на Python и переведены на JS для развертывания вашей мобильной игры/

Рассмотрим на примере

Вы помните то время, когда на экранах смартфонов появилась Flappy Bird? Эта игра положила начало эре казуальных игр с очень небольшим количеством внутриигровых действий, и каждый неверный ход означает, что ваша игра окончена. Тот, кто продержится дольше всех, возглавит таблицу лидеров.

Сегодня мы увидим, как написать бота на Python, который использует библиотеку компьютерного зрения OpenCV, чтобы победить Don't touch the red, бесконечного бегуна от Addicting Games.Addicting Games

Начальный экран

Правила игры

Игра довольно простая: зеленые кнопки падают, и игроку нужно нажать на них, прежде чем покинуть экран. И, конечно же, не трогайте красный!

Есть одна важная особенность; если играть в аркадном режиме, то кнопки падают с нарастающей скоростью. Это усложняет игру для игрока-человека. Но для нашего бота это не проблема!

Сопоставление шаблонов OpenCV

Основная часть нашего бота компьютерного зрения — это сопоставление шаблонов, доступное в библиотеке 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левому верхнему углу найденного совпадения.max_val

Два типа используемых шаблонов

Создание снимков экрана и взаимодействие

Другими важными частями бота являются получение экранов для анализа и то, как мы отправляем щелчки мыши в игру. Необходимо отметить, что 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 все еще не отстает.

Если вы хотите создавать простые, но увлекательные мобильные игры, вы можете поиграть с ним.