Является ли враг / бот AI частью модели или контроллера в игре MVC

Это может быть частью модели, потому что это часть бизнес-логики игры.

Он может быть частью контроллера, потому что он может рассматриваться как имитирующий ввод игрока, который будет считаться частью контроллера, верно? Или это будет?

Как насчет нормального врага, такого как гумба в Марио?

ОБНОВЛЕНИЕ: Вау, это действительно не тот ответ, который я ожидал. Насколько я могу судить, ИИ является внутренней частью автономной игровой системы, а значит и моделью. Я все еще не убежден.

9 ОТВЕТОВ
РЕШЕНИЕ

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

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

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

Может показаться неинтуитивным иметь какую-то единую концепцию, такую ​​как «ИИ», охватывающую весь путь от модели, через контроллер и прямо к тому, кто или что-либо манипулирует контроллером, но так оно и происходит, когда вы пытаетесь отобразить 2 очень разные концепции на друг с другом. Это очевидно, когда вы смотрите на это с точки зрения разработчика, пытающегося представить те же интерфейсы для неигровых персонажей, что и для персонажей-игроков - в конечном итоге ИИ должен включать в себя принятие решений высокого уровня, которые актер за пределами система создаст, в дополнение к низкоуровневой реализации, которая обычно существует как для игроков, так и для не игроков в системе.

5
9.01.2009 12:23:48

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

РЕДАКТИРОВАТЬ: На самом деле, я беру это обратно. У него будет дисплей, просто не читаемый человеком. «Дисплей» будет отвечать за передачу информации о состоянии игры в ИИ, даже если это означает передачу ему сериализованных данных.

Часть 2: О, я понимаю ... Это не совсем тот тип ИИ, о котором я думал. Я полагаю, что он все еще может быть обработан таким же образом, но тогда это заставит новые функции быть открытыми в контроллере, что может не иметь смысла. (Например, контроллер должен выставлять движущиеся как юниты игроков, так и юниты компьютеров.)

Я бы поставил поведение в модель:

Goomba.move()
{
    /* Move Goomba forward one unit. */
}

И затем вызовы этого поведения идут в контроллере.

Controller.advanceTime()
{
    foreach(Goomba goomba in state.getGoombas())
    {
        goomba.move();
    }
}
1
10.12.2008 17:18:58

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

7
12.12.2008 18:16:28

У вражеского ИИ есть модель - его интеллектуальные внутренности, которые определяют, как играть в игру - и он использует контроллеры, доступные как для людей, так и для NPC, для управления его состоянием в игровой среде.

7
10.12.2008 17:20:24
В игре модель может изменить свое собственное состояние, так почему же вам нужно пройти через контроллер?
Iain 10.12.2008 18:49:17
Вам нужен контроллер, если вы меняете состояние какой-то другой модели. Это нормально, модель может менять свои внутренние компоненты, но другой код должен проходить через контроллер.
David Koelle 15.12.2008 15:57:55

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

(Что я впервые тут написал :)

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

Для Goomba игровой контроллер обновляет модель Goomba с указанием местоположения Марио (если оно в поле зрения), а модель Goomba обновляет себя относительно того, куда она собирается двигаться. Затем контроллер будет перемещать Goomba (то есть обновлять местоположение модели), если нет никаких препятствий, и визуализировать вид с новым состоянием Goomba.

1
11.12.2008 00:41:55

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

Если вы обнаружите, что пытаетесь «подогнать» проблему к шаблону, это, вероятно, неправильный шаблон. Используйте MVC для пользовательского интерфейса - используйте другие шаблоны (Message Bus или Observer / Listener и т. Д.) Или другие методы OO для AI (@Bill the Lizard предлагает стратегию по-прежнему).

Используйте весь свой набор инструментов, а не только молоток. ;-)

10
10.12.2008 18:19:40
+1 за разумный ответ. Я все еще ненавижу, когда люди цитируют меня и получают больше голосов, хотя. :)
Bill the Lizard 12.12.2008 18:17:23
Хорошо сказано. Я думаю, что люди думают, что MVC - единственный способ сделать вещи в эти дни. @ Билл - ты ведь не такой маленький?
Draemon 12.12.2008 18:28:50

Я не уверен, где это будет соответствовать MVC. Этот псевдокод является чрезвычайно упрощенной версией того, как я делал AI для поиска пути A *.

sprite {
  x,y
  image // this object contains everything about drawing
  path[] // an array of path nodes generated by my AI
  onNode(node) {
    if (x == node.x) && (y == node.y) return true
    return false
  }
  update () {
    moveto(path.last())
    if (onNode(path.last())) path.pop()
    if (path.empty()) path = doAI()
  }
  doAI() {
    ...
    return newPath
  }
  moveto(node) {
    ...
  }
  draw (screen) {
    if (screen.over(x, y)) image.draw(x-screen.x, y-screen.y)
  }
}

screen = //something the platform would create
spriteCollection = //my game objects

foreach (sprite in spriteCollection) {
  sprite.update()
  sprite.draw(screen)
}
0
10.12.2008 18:52:16
Смысл MVC в игровом сценарии состоит в том, чтобы отделить визуальное представление каждого врага (вид) от их поведения, здоровья и т. Д. (Модель). Поэтому, если вы хотите перейти от изометрической игры к 3D-игре, вы можете добавить новый вид и оставить модель без изменений.
Iain 11.12.2008 10:28:36

На мой взгляд, в любой реализации MVC модель должна содержать доменную логику - всякий раз, когда она является автономным объектом (логика встроена в методы) или оболочкой потокового сокета (где логика выполняется через внешний ресурс - да, подумайте о мультиплеере) , Контроллер должен использоваться как вызывающий / обработчик модели на основе некоторых внешних переменных (например, параметров CLI, диспетчера событий). Затем верните требуемые данные (в виде массива, сериализованных переменных или какого-либо объекта передачи данных) в соответствующий вид (игровой экран, консольный терминал).

Ура, Алан

0
12.12.2008 18:09:47

Ни. Я бы запрограммировал ИИ как независимого агента, связывающегося с моделью через контроллер. Или , если вы хотите, ИИ модель, но не модель.

-1
5.01.2009 13:41:16