Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / Скриптовый ИИ

Скриптовый ИИ

Поделиться
Advanced: Тема повышенной сложности или важная.

Страницы: 1 2 Следующая

KatekovAntonПостоялецwww8 апр. 201721:25#0
Привет.

Я делаю пошаговую стратежку, в нее уже вполне можно играть с людьми по мультиплееру и сейчас этот проект дозрел до ИИ. В игру встроен lua и для него имеются биндинги почти на все действия и данные, к которым имеет доступ человек (если чего-то нет, то добавить не проблема). Вот тема с самим проектом: http://www.gamedev.ru/projects/forum/?id=190123

ИИ в игре - это тот, кто назначает команды юнитами игрока - это может быть человек - посредством интерфейса пользователя, а может быть ии - посредством вызова ручек апишки. игрок это игровая сущьность - Player, может быть игра на 4 игроков - один игрок - человек и 3 игрока - ии например.

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

апи игры в скрипте выглядит так: с++ код биндится в скрипты и предоставляет ему свои ручки - например можно двинуть юнит 22 в клетку 12,71  - после этого следует прерывание скрипта и ожидание отработки этой команды. во время событий игра может сообщать скрипту что произошли какие-то события - юнит получил демаг, если видно от кого (вражеский юнит в зоне видимости) то сообщить и это. можно запомнить ид вражеского юнита и получить все его данные - кто это, где стоит, сколько хелсов - все доступные параметры. после отработки команды можно проверить - проигралась ли команда полностью (юнит мог например умереть или остановиться обнаружив скрытый юнит врага), жив тот юнит или был поврежден (все события понятно в скрипте можно запоминать чтобы потом учесть при расчете следующей команды) и т д

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

Есть небольшие наработки по поводу базового анализа карты. Эти наработку могут быть дополнены еще какими-то утилитарными функциями, что в итоге станет библиотекой утилит, которая будут биндиться в скрипты.

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

Вопрос в следующем - с какого бока и каким образом стоит начать все это делать?) В тред приглашаются любые специалисты по ии

Правка: 9 апр. 2017 2:34

kiparПостоялецwww8 апр. 201722:35#1
По-моему хороший ИИ обязан перебирать варианты. Для этого игра должны уметь быстро копировать состояние игрового поля и симулировать совершение действия. Луа... ну в принципе для разных эвристик, оценки доски и "стратегического планирования" может и сойдет, но сам код перебора должен быть быстрым.
clcПостоялецwww9 апр. 20170:01#2
KatekovAnton
> Есть общее понимание того как будет работать ии.....
ты хоть определился что расчитывать-то? прикрутил луа, имеешь представление о пуле задач, а характеристики-то есть? дерево развития, зависимость от ресурса?
KatekovAntonПостоялецwww9 апр. 20170:01#3
kipar
быстрый сейв/откат есть, используется для отката на контрольные точки в риплее, но там же не только сейв нужен - там целиком игру надо сдампить. тем не менее

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

сделать можно, но можно и просто хелперы написать котоыре выдадут тоже самое - это будет намного проще. считайте что они есть

clc
> ты хоть определился что расчитывать-то? прикрутил луа, имеешь представление о пуле задач, а характеристики-то есть? дерево развития, зависимость от ресурса?
все характеристики есть. технологий нет, все юниты сразу доступны, но есть рисерчи и апгрейды - это 2 способа улучшать юниты

Правка: 9 апр. 2017 0:10

kiparПостоялецwww9 апр. 20170:16#4
KatekovAnton
Просто если делать только эвристики, то ИИ получится слабый - легко заманить в ловушку, упускает явные возможности которые видны человеку но не заложены в алгоритм. Интересно играть только пока не узнаешь все заложенные в него тактики, а дальше он может только численностью брать. Совершать красивый и единственно верный ход сможет только ИИ с тем или иным вариантом перебора возможных ходов. Не обязательно копировать всю игру, можно сделать какое-то ограниченное представление и копировать его, а в каких-то случаях можно и вообще без копирования. Все это конечно более-менее диванные размышления, может и ошибаюсь.
KatekovAntonПостоялецwww9 апр. 20170:38#5
kipar
> Интересно играть только пока не узнаешь все заложенные в него
> тактики, а дальше он может только численностью брать.
хехехе) фишка в том что ии находится в скриптах в открытом виде. я хочу написать базовую реализацию и поставить игру в таком виде игрокам. все скрипты одного ии лежат в определенной папке (и ее подпапках) - получается своего рода проект с ии. указанием какой именно ии загружать для ии-игрока является имя базовой директории с этим проектом ии. тоесть впринципе любой человек сможет скопировать мою реализацию и на имеющемся апи доработать как угодно. в будущем планирую добавить возможность симулировать партии между ними с целью поиска сильнейшего. на сервере будет типа лидерборды ии - любой из них можно будет скачать и играть уже с ним, а не с моим дефолтным.

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

Правка: 9 апр. 2017 0:39

БаберПостоялецwww9 апр. 20171:40#6
kipar
> Совершать красивый и единственно верный ход сможет только ИИ с тем или иным
> вариантом перебора возможных ходов.
  Он может быть неиграбельным. Игроку будет неинтересно все время проигрывать.
БаберПостоялецwww9 апр. 20171:42#7
KatekovAnton
> Вопрос в следующем - с какого бока и каким образом стоит начать все это делать?
  Я думаю стоит дать определение ИИ для начала.

Как насчет "поведение выдуманных персонажей имитирующее интеллектуальную деятельность"?

Правка: 9 апр. 2017 1:54

KatekovAntonПостоялецwww9 апр. 20172:26#8
Бабер
> Как насчет "поведение выдуманных персонажей имитирующее интеллектуальную деятельность"?
типа того, только у меня же стратега. можно сказать что ии - это тот, кто командует юнитами игрока - это может быть человек - посредством интерфейса пользователя, а может быть ии - посредством вызова ручек апишки.

апи выглядит так: с++ код биндится в скрипты и предоставляет ему свою ручки - например можно двинуть юнит 22 в клетку 12,71  - после этого следует прерывание скрипта и ожидание отработки этой команды. во время событий игра может сообщать скрипту что произошли какие-то события - юнит получил демаг, если видно от кого (вражеский юнит в зоне видимости) то сообщить и это. можно запомнить ид вражеского юнита и получить все его данные - кто это, где стоит, сколько хелсов и все доступные параметры. после отработки команды можно проверить - проигралась ли команда полностью (юнит мог например умереть или остановиться обнаружив скрытый юнит врага), жив тот юнит или был поврежден (все события понятно в скрипте можно запоминать чтобы потом учесть при расчете следующей команды) и т д

внесу это в хедер. завтра еще подредактирую чтобы было более понятно

Правка: 9 апр. 2017 3:18

kiparПостоялецwww10 апр. 20172:25#9
KatekovAnton
> на сервере будет типа лидерборды ии - любой из них можно будет скачать и играть
> уже с ним, а не с моим дефолтным.
всё это чудно, но чтобы сделать сильный ии его авторам всё равно придется встраивать в него симулятор, но при этом он уже целиком будет на стороне скрипта, т.е. на порядки тормознутее.
KatekovAntonПостоялецwww10 апр. 20173:21#10
kipar
геймплей больше похож на шахматы, поэтому быстродействие не входит в список первоочередных требований.
TiendilУчастникwww10 апр. 201710:46#11
KatekovAnton
> Вопрос в следующем - с какого бока и каким образом стоит начать все это делать?) В тред приглашаются любые специалисты по ии
Как говорил Сид Мейрер (или ещё кто-то из небожителей, не помню): сначала научи юнита перемещаться из точки А в точку Б, потом научи несколько юнитов делать то же самое, а дальше само пойдёт.

P.S. видимо переврал, но суть в том, что, если не знаешь как делать, начни снизу (с фундамента), с простых вещей, потом на их основе делай более сложные.

eugenelozaПостоялецwww10 апр. 201711:34#12
Tiendil
+1
KatekovAnton
Для начала просто сделайте, чтобы ИИ тупо спавнил юниты и отсылал их в атаку на базу противника. Если давать ИИ большую фору, это будет весьма и весьма неплохая тактика (например, это и был весь ИИ в Dune 2, кажется, в Warcraft 1 тоже (или очень близко к тому)).

В общем же... я бы проголосовал за некую оптимизационную задачу - по обобщённым характеристикам. Например, в плане стратегии: максимизировать производство при максимальном отношении боевая сила ИИ / боевая сила противника, а в плане тактики: максимизировать нанесённый урон, минимизировать полученный урон (с определённым коэффициентом). Как решение такой задачи (тупо, методом найскорейшего спуска (вроде так по-русски называется?) или Монте-Карло, чтобы не возиться, оптимизировать потом можно будет), и будет соответствующий набор ходов. Для квази-независимых юнитов это просто, для групп юнитов - сложнее, нужно вводить несколько "этажей" логики и решать соответствующую оптимизацию и там и там.

(угадывая, как организован бой в игре на основе скриншотов...) могу предположить, что необходимо будет сделать "стратегическую карту" (которая будет характеризировать "привлекательность" каждой клетки для ИИ - чаще всего это будет весьма тугой рассчёт и по этому желательно его результаты хранить в памяти, а не пересчитывать каждый ход) или несколько. Например, это может быть как "сколько клеток поля видно из данной точки" (для определения "нычек", где можно спрятаться в конце хода), так и "сколько юнитов ИИ и его противника могут дойти до этой клетки", а также "сколько путей пересекаются в этой точке" (для определения bottlenecks). Стратегический ИИ тогда будет пытаться занять более "выгодные" при данных настройках точки определённым кол-вом юнитов, балансируя производство армии и ресурсов, а тактический - обеспечивать поведение каждого конкретного юнита.

Более конкретно зависит от того, какой у Вас геймплей. Если:
> геймплей больше похож на шахматы
то там оптимизационная задача не прокатит (слишком слабый ИИ получится) и будет только (оптимизированный) перебор, как предложил kipar, поскольку нет "плавного" перехода между ходами и один ход может существенно изменить ситуацию на поле боя.
Но, думаю, что всё не настолько сложно и для начала ИИ на 10-20 строк Вам хватит.

Правка: 10 апр. 2017 11:50

KatekovAntonПостоялецwww10 апр. 201712:28#13
Tiendil
> сначала научи юнита перемещаться из точки А в точку Б, потом научи несколько юнитов делать то же самое, а дальше само пойдёт.
и то и другое уже есть - это движок и биндинги. из скирпта можно что угодно приказать делать. проблема именно в том чтобы решить что именно кому приказывать. ты говоришь о какомто простейшем варианте механизма принятия решений? просто понимаешь, не так много времени чтобы делать что-то, а потом переделывать, поэтому сначала хочется определить правильное направление.

>то там оптимизационная задача
забейте на оптимизацию) мне важнее сделать чтобы было интересно.

вообщем по твоему описанию я примерно представил себе как может выглядеть ии на базе детерминированного алгоритма. попробую диаграмку накидать вечером

Правка: 10 апр. 2017 12:30

eugenelozaПостоялецwww10 апр. 201712:46#14
KatekovAnton
> забейте на оптимизацию
Это был математический термин :) Там суть в "минимизации" некоего функционала (целевой функции), зависящего от множества переменных.

Страницы: 1 2 Следующая

/ Форум / Программирование игр / Игровая логика и ИИ

2001—2017 © GameDev.ru — Разработка игр