Хорошо ли модель-представление-контроллер работает с искусственным интеллектом и деревьями поведения?

У меня есть опыт работы с MVC (Flex и Rails), и мне нравятся идеи разделения кода, возможности повторного использования, инкапсуляции и т. д. Это упрощает быстрое создание вещей и повторное использование компонентов в других проектах. Однако было очень сложно придерживаться принципов MVC при создании сложных, управляемых состоянием, асинхронных, анимированных приложений.

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

Очень легко заставить представления/графику игнорировать что-либо вне себя, когда все статично, например, в системе HTML CMS или чем-то еще. Но когда вы начинаете добавлять сложные переходы, управляемые состоянием, кажется, что все должны знать обо всем остальном, и MVC почти мешает. Что вы думаете?

Обновлять:

Пример. Ну прямо сейчас я работаю над веб-сайтом в Flex. Я пришел к выводу, что для правильной анимации каждого вложенного элемента в приложении я должен думать о них как об агентах ИИ. Таким образом, у каждого «представления» есть собственное дерево поведения. То есть он выполняет действие (показывает и скрывает себя) в зависимости от контекста (какие выбранные данные и т. д.). Для этого мне нужна штука типа ViewController, я называю ее Presenter. Итак, у меня есть представление (графика, выложенная в MXML), презентатор (определяющий анимацию и действия, которые представление может выполнять в зависимости от состояния и вложенных состояний приложения) и модель представления для представления данных в представлении ( через ведущего). У меня также есть модели для объектов значений и контроллеры для обработки URL-адресов и вызовов базы данных и т. д. ... все обычные статические/html-подобные материалы MVC.

Некоторое время я пытался выяснить, как структурировать этих «агентов», чтобы они могли реагировать на окружающий их контекст (что выбрано и т. д.). Казалось, что все должно быть в курсе всего остального. А потом я прочитал о Path/Navigation Table/List для игр и сразу же подумал, что у них есть централизованно хранимая таблица всех заранее рассчитанных действий, которые может предпринять каждый агент. Так что мне стало интересно, как они на самом деле структурируют свой код.

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


comment
Можете ли вы привести очень простой пример? Связанный вопрос также слишком длинный.   -  person amit    schedule 18.01.2010
comment
Ваш вопрос, кажется, связан с архитектурой доски.   -  person amit    schedule 18.01.2010
comment
о, эта классная доска выглядит интересно! Благодарность!   -  person Lance Pollard    schedule 19.01.2010


Ответы (3)


«Можете ли вы применить принципы MVC к принципам искусственного интеллекта (деревья поведения, иерархические конечные автоматы, вложенные состояния), например к играм?»

Конечно. 99,9% ИИ находится исключительно в модели. Контроллер отправляет ему входные данные, представление — это то, как вы представляете его на экране пользователю.

Теперь, если вы хотите, чтобы ИИ что-то контролировал, вы можете в конечном итоге вложить концепции, и ваша игровая «модель» будет содержать Модель для объекта, Контроллер для объекта, который является ИИ, посылающим ему команды, и Представление для объекта, которое представляет восприятие этого объекта, с которым может работать Контроллер. Но это отдельный вопрос от того, может ли он «хорошо играть». MVC — это отделение представления и ввода от логики и состояния, и этот аспект не заботится о том, как выглядят логика и состояние.

person Kylotan    schedule 21.01.2010
comment
Благодарность! вы говорите так, как будто знаете, что происходит со всем этим, у вас есть какие-либо ресурсы, на которые можно указать? Любой исходный код??? - person Lance Pollard; 21.01.2010
comment
Нет, разработчики игр обычно не используют MVC, поэтому на практике вы не найдете многого из этого. Но я бы просто посоветовал не заходить слишком далеко с MVC. Он был разработан специально для отделения представления от контента в приложениях с графическим интерфейсом, а не как универсальный протокол для написания программного обеспечения. Например, я не вижу, чтобы ваш исходный пост требовал «агентов» или чего-то более сложного, чем просто обновить все, а затем прочитать их новое визуальное представление, как это обычно делают игры. - person Kylotan; 21.01.2010

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

В вашем конкретном случае может быть неправильным разделять все это между несколькими агентами и проще оставить это одному главному агенту, который может делегировать приказы отдельным процессам (/begin babble): каждое представление может быть процессом, которому можно было бы приказать переключаться на любое (количество) представление главным агентом в зависимости от того, какие данные получил главный агент.

Надеюсь, это поможет .. Примите все это с недоверием :)

person Trevoke    schedule 19.01.2010

Похоже, вам нужно больше использовать шаблон Observer/Event Aggregator. Если несколько компонентов должны реагировать на произвольные события приложения, не вводя чрезмерную связь, вам поможет использование агрегатора событий. Пример: когда элемент выбран, событие приложения публикуется, соответствующие контроллеры сообщают своему представлению о запуске анимации и т. д. Разные компоненты не знают о других, они просто прослушивают общие события.

Кроме того, код, который заставляет представление что-то делать (запускать анимацию в зависимости от состояния модели/контроллера) - это часть самого представления, поэтому вам не нужно делать свою архитектуру странной, имея контроллер и контроллер представления. Если это код, специфичный для пользовательского интерфейса, то он является частью представления. Я не знаком с Flex, но в WPF/Silverlight подобные вещи попадут в код программной части (хотя по большей части Visual State Manager более чем достаточно для работы с анимацией состояния, поэтому вы можете хранить все в XAML) .

person Egor    schedule 09.03.2010