2017-02-19 34 views
2

Я пишу игру в Haskell, в которой игрок и AI совершают несколько действий по очереди. До сих пор ИИ работали, генерируя действия, используя всю информацию об игре, т. Е. Они были функциями формы GameHistory -> GameState -> Action.Разрешающие агенты имеют свое внутреннее состояние

Таким образом, эти функции генерируют некоторую информацию, которая им нужна из истории при каждом вызове. Было бы намного легче писать ИИ, если бы они могли иметь какое-то «внутреннее состояние», которое сохраняется между их поворотами (т. Е. Вызывает соответствующую функцию). Как можно реализовать что-то подобное? (Кстати, я должен также принять во внимание, что внутренние состояния различных видов AIs могут иметь различные типы.)

+1

Я нахожу этот вопрос слишком широким, я не могу дать вам более конкретный ответ, чем «Использовать государственную монаду». Если бы вы могли [изменить] ваш вопрос, чтобы предоставить некоторый фактический код, мы могли бы, вероятно, быть более полезными. –

+0

@aclow В некоторой степени связаны: http://stackoverflow.com/questions/40698396/how-can-i-handle-user-plugins-in-my-types/ – danidiaz

+0

@danidiaz Спасибо, это похоже на то, что я ищу. Я это попробую. – aclow

ответ

2

Что вы ищете может быть что-то вроде:

newtype AI = AI { runAI :: GameState -> (AI, Action) } 

т.е. вас» Я также вернусь к новому состоянию вашего актера вместе с действием. Вы можете использовать монаду State здесь. Вы также можете быть заинтересованы в чтении об автоматах. Если вам нужно сериализовать AI (для его сохранения в базе данных, скажем), вам может понадобиться сделать что-то другое.