вторник, 12 мая 2020 г.

Нейронная сеть учится играть в Lunar Lander

Lunar Lander — аркадная игра, выпущенная Atari, Inc. в 1979 году. Цель игры — управлять посадочным лунным модулем, чтобы произвести мягкую посадку на поверхность Луны. На посадочный модуль действует гравитация и инерция, кроме того количество топлива в нем ограничено. Управление производится 4 кнопками: наклоны посадочного модуля влево/вправо, управление тягой двигателя +/-.


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



Для ускорения обучения нейронной сети используется генетический алгоритм, в каждом поколении запускается 10 ее копий. Нейронная сеть имеет 2 скрытых слоя. Проект разрабатывается на Python, никакие дополнительные нейросетевые фреймворки/модули не используются. Автор - Тихон, 13 лет ("Карандаш и Самоделкин")
Исходный код



воскресенье, 10 мая 2020 г.

Звездолеты 3D

Продолжение игры про звездолеты, теперь в 3D. Управление с помощью наэкранных кнопок. В демо 1 уровень, есть звуковые эффекты и музыка.



Язык C#, среда разработки - Unity.
Автор - Тихон, 13 лет ("Карандаш и Самоделкин")
Исходный код здесь

суббота, 9 мая 2020 г.

Звездолеты

Игра про звездолеты. Несколько уровней, разные типы врагов и оружия. Подбираемые боеприпасы и "аптечки". Управление движением - на гироскопе/акселерометре телефона, выстрелы разным типом оружия - тапы в разных зонах экрана. Есть звуковые эффекты и миникарта. Написана без использования готовых библиотек и конструкторов.


Язык Java, среда разработки - Android Studio.
Автор - Тихон, 13 лет ("Карандаш и Самоделкин")
Исходный код здесь



Tetris 2x

Классический тетрис представляет собой головоломку, построенную на использовании геометрических фигур «тетрамино» — разновидности полимино, состоящих из четырёх квадратов. В нашей версии стакан имеет глубину в 2 квадрата (слоя), заполнять необходимо оба горизонтальных ряда из 10 клеток, расположенных на одной высоте. Управление на стрелках клавиатуры, переворот игрового поля на другой слой - Ctrl.


Язык C#, среда разработки - Unity.
Автор - Тихон, 13 лет ("Карандаш и Самоделкин")
Скачать можно c Яндекс.Диск, исходный код здесь
Прототип игры сначала написал на Python, исходники по ссылке

NeyroGamer 1

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

NeyroGamer это своего рода бот, играющий в видео игры. Так как нам нравятся старые консоли, первая игра, в которую мы хотим научить играть нашего бота - гоночная аркада на Sega Genesis под названием Nigel Mansell's World Championship Racing. Игры запускаются на эмуляторе консоли (мы используем Fusion 3). Проект немного похож на один из наших прошлых проектов "Длинный хвост питона", так как использует машинное зрение с OpenCV.


Исходный код проекта

В коде реализовано 2 класса, каждый из которых отвечает за свою область.
   Класс ScreenReader содержит функциональность, позволяющую получать информацию о данных с экрана. Для этого делается скриншот. Мы пробовали множество вариантов — но самым быстрым был метод ImageGrab из модуля PIL. Он показал FPS в 25 кадров в секунду. Этого вполне достаточно для реагирования на повороты. После взятия изображения оно обрабатывается с помощью библиотеки OpenCV. Я накладываю маску, что бы выделить дорогу из кадра. Маска берётся не на всём кадре, а на 2 полосах экрана, первая из которых находится в самом низу кадра, а вторая почти под линией горизонта. Таким образом можно понять в какую сторону изгибается дорога. С помощью двух моментов можно притормаживать на поворотах и газовать максимально на прямых участках.
  Второй класс, Сontrol — отвечает за управление машинкой путем передачи в игру нажатия кнопок на виртуальном геймпаде.

Настройка эмулятора и виртуального геймпада. 
Для управления игрой в эмуляторе была установлена программа Vjoy, с помощью которой к компьютеру был подключен виртуальный геймпад. На геймпаде 11 кнопок и 1 стик. Для управления этим геймпадом из программы я использую модуль PyVjoy. Для корректной работы модуля внутрь папки требуется положить специальный DLL-файл, который генерируется в папке, куда вы установили Vjoy.  После этого вы сможете управлять виртуальным геймпадом из программы на Python. Необходимо установить в настройках эмулятора вход 1. На него следует поставить 3х кнопочный джойстик Genesis и выбрать в качестве него ваш виртуальный геймпад.
После этого надо запустить программу AssignKeys.py. Она будет нажимать кнопки виртуального геймпада в том порядке, какого требует эмулятор Fusion 3. Во время назначения клавиш фокус должен быть всё время на программе-эмуляторе. Когда эмулятор будет ждать клавиши старт, нажмите любую удобную кнопку на клавиатуре. Это нужно для возможности войти в гонку и поставить паузу. Всё готово! Вы можете запускать гонку в полноэкранном режиме предварительно запустив run.py.


  У вас наверно возник вопрос - почему проект носит порядковый номер 1? Всё просто. В репозитории пока открыт только демо-код, алгоритм которого не идеальный. Гонку мы пока проходим на 8-9 месте, поэтому будем дорабатывать NeyroGamer. Первая часть проекта - научиться взаимодействовать с игрой, получать игровые события, передавать команды управления. Сейчас мы работаем над нейронной сетью, которая улучшит игровые результаты.

Язык Python.
Автор - Платон, 14 лет ("Карандаш и Самоделкин")

Самое популярное