Предлагается к рассмотрению, обсуждению и участию проект конкурса AI под условным названием "AI Tank Arena".
Важно. Предлагаемый порядок обсуждения.
От предполагаемых участников, в первую очередь хотел бы услышать комментарии следующего вида:
1) Планирую участвовать, пока всё норм, жду рабочей версии, и больше конкретики согласно первопосту, а там и посмотрим.
2) Планирую участвовать только, если будет переделано это и то, так-то и так то.
3) Хотел бы участвовать, но у меня совсем нет понимания, и другие трудности (какие)
4) Всё надо делать совсем не так: вот посмотрите, я всё уже написал и создал тему с подробным описанием.
Условия: участнику предлагается написать клиент для серверного приложения для управления AI-юнитом (танком), который должен соревноваться с AI-юнитом другого участника в рамках игровой сессии.
Описание игры.
Мир. карта в 2D размерностях float составленная на основе ячеек ландшафтных блоков (tiles).
Каждая ячейка имеет размер 1.0x1.0 и может быть представлена как
Карта имеет замкнутое внктреннее пространство ограниченное стенами и препятствия из блоков внутри. На карте расположены тактические точки типа spawn и т.д (???).
Демонстрация прототипа физики/геометрии.
Юнит. Танк с поворотной башней и пушкой на ней. Имеет уровень жизни (HP). Может двигаться по пустым ячейкам карты и стрелять. Двигается в прямом и обратном направлении, поворачивает вокруг своего центра и задаёт вращение башни относительно корпуса. Стрельба ведётся в направлении поворота башни снарядами. Количество снарядов ограничено (???). Снаряд летит по прямой до момента касания препятствий или другого юнита, имеет постоянную скорость полёта и предельную дальность (???). На перезарядку оружия после выстрела требуется время. Попадание снаряда наносит юниту урон HP. Стрельба в движении снижает точность (урон) (???). Примечание: рассматривается вариант упрощенного движения без руления, в стиле "pacman".
Общие игровые правила. Игра идёт на случайно сгенерированной карте. Юниты участников появляются на своей базе (spawn). База может служить для перезарядки и восстановления HP (???). Количество жизней ограничено. Цель: потратить все жизни (очки) противника и сохранить свои.
Вариант capture the flag. На карте располагается флаг(и) которые надо захватить подобрав его (проехав по нему) и отвезти на свою базу. Первый захвативший выигрывает игру. Убитый перевозчик флага бросает его на месте смерти (или же флаг возвращается в исх. точку), где его может подобрать другой юнит.
Вариант king of the hill. Нахождение в специальных точках даёт очки.
Техническая реализация. Сервер(хост) — графическое (опционально ???) приложение. Клиент — динамическая библиотека (DLL). Взаимодействие клиента с сервером происходит в реальном времени путём вызова сервером callback-функций, реализованных в клиентской DLL. Поддерживаемые платформы - Windows/Linux x64_86.
Клиент посылает управляющие значения и опциональные запросы. Коллизии, видимость, логика считается на сервере, который отсылает ответ о статусе и результаты запросов.
Для избавления от рутины, сервер предоставляет сервисы построения путей и рэйкасты по ландшафту. Хотя можно использовать своё.
API.
Самый базовый функционал видится так:
Это пока черновик, буду дополнять-менять по мере развития.
Текущий статус затеи: мною пишется предварительна версия хоста в которой будет отработан интерфейс API, сервис навигации и возможно какие-то дебаг-фичи.
У меня были почти те же мысли, только не танк, а круглый робот, тогда не будет застреваний при поворотах в проходах, и вообще, несколько проще управление.
И ещё — на карте не 2, а 3 типа ячеек. Условно "стена", "проход" и "вода". В воду роботу нельзя, но снаряд пролетает.
Der FlugSimulator
> Самый базовый функционал видится так
Как насчет такого:
- При подключении к серверу клиент получает весь стэйт игрового мира
- Каждый тик всем клиентам отсылается изменения стэйта
> поворачивает вокруг своего центра и задаёт вращение башни относительно корпуса
Поворот танка и башни не должны быть мгновенны
Mikle
> только не танк, а круглый робот, тогда не будет застреваний при поворотах в проходах, и вообще, несколько проще управление.
Да, коллайдер будет кругом. И визуально, я не против робота.
> И ещё — на карте не 2, а 3 типа ячеек. Условно "стена", "проход" и "вода"
Да, я упустил, это действительно полезно: "вода" непроходима, но проницаема для взгляда и стрельбы.
Hypnoise
> При подключении к серверу клиент получает весь стэйт игрового мира
Разумеется, так и будет. Я еще не дописал про инициализацию.
Клиент получает всю карту, точки, переменные.
Hypnoise
> Каждый тик всем клиентам отсылается изменения стэйта
По сути это и делается в Response. Нужно утрясти формат протокола, исходя из возможностей участников.
Hypnoise
> Поворот танка и башни не должны быть мгновенны
Да.
А как этим пользоваться? Не бейте тапками, сетевое программирование для меня темный лес.
Можно сделать сделать конкурс AI, а сетевое добавление оставить на усмотрение участника.
Incvisitor
> сетевое программирование для меня темный лес.
Ну может сети и не будет, как уж народ подберётся, а будет просто нативная dll, что на самом деле легче.
Der FlugSimulator
То есть пишем свои Длл-ки, их собираем вместе на компе и они жахают друг друга. А как писать такую длл?
Incvisitor
> А как писать такую длл?
Если делать сервер буду я, я напишу и образец dll, как в прошлые разы. Кроме того, подтянется The Trick, сделает COM переходник — откроется возможность работать с шарпом, js и т. п.
Incvisitor
> А как писать такую длл?
Ну даже не знаю как в 2х словах ответить.
Для начала надо уметь писать длл или клиента в принципе.
Потом наверно нужна какая-то векторная библиотека, на чём ты там пишешь.
Ну а дальше внутри пишешь большую функцию update() { ... }, которая нажимает нужные "кнопки" на танке/роботе.
Mikle
> У меня были почти те же мысли, только не танк, а круглый робот, тогда не будет застреваний при поворотах в проходах,
Лучше уж не круглый, а "скользящий" AABB-квадрат, это еще проще, чем коллизия с кругом.
Игра по таким правилам быстро упрётся в то, что противники спрячутся за преградой и любое движение будет рискованным и самое рациональное решение - сидеть на месте и ждать движения противника (кажется, это называется равновесие Нэша).
Так что нужны дополнительные баллы, например, раскидать на карте собираемые объекты, можно даже всю карту ими засыпать как в Pacman и ограничить время.
romanshuvalov
> Игра по таким правилам быстро упрётся в то, что противники спрячутся за
> преградой и любое движение будет рискованным и самое рациональное решение -
> сидеть на месте и ждать движения противника (кажется, это называется равновесие
> Нэша).
>
> Так что нужны дополнительные баллы, например, раскидать на карте собираемые
> объекты, можно даже всю карту ими засыпать как в Pacman и ограничить время.
Само собой, при сидении на месте некий ресурс (хп?) будет понемногу тратиться, его можно пополнять только в местах, где он рождается, но эти места простреливаются, и вообще, там очередь из желающих. При стрельбе тратятся патроны, которые рождаются где-то в другом месте, это всё давно отработано в аренных шутерах.
romanshuvalov
> Лучше уж не круглый, а "скользящий" AABB-квадрат, это еще проще, чем коллизия с кругом.
Круг эстетически лучше, а коллизии устроитель сделает, клиентам не придётся с этим возиться.
Я прикидывал задействовать для начала графику из своего проекта с конкурса игр на одном экране.
Mikle
> при сидении на месте некий ресурс (хп?) будет понемногу тратиться, его можно
> пополнять только в местах, где он рождается,
А вот это отлично. Пусть этот ресурс будет тратиться вообще всегда, не обязательно при сидении на месте.
> прикидывал задействовать для начала графику из
Можно параллельно провести конкурс на лучшую визуализацию данной игры. Логика вся на сервере же, без графики, текущее состояние посылается клиенту.
romanshuvalov
> противники спрячутся за преградой и любое движение будет рискованным и самое
> рациональное решение - сидеть на месте и ждать движения противника
Так захват флага решает этот вопрос. Если усядешься камперить, рискуешь пропустить флаг.
Была такая игра "Future Classics Collection", там в танчиках тратится топливо, и его надо восполнять на базе или ехать к канистре.
Mikle
Если будешь писать сервер на VB, то отпиши мне, я помогу реализовать также легальные вызовы без использования указателей чтобы АВ не репортовали о вирусах.
Тема в архиве.