Model view controller 敌方/机器人是MVC游戏中模型或控制器的一部分吗

Model view controller 敌方/机器人是MVC游戏中模型或控制器的一部分吗,model-view-controller,artificial-intelligence,Model View Controller,Artificial Intelligence,它可能是模型的一部分,因为它是游戏业务逻辑的一部分 它可能是控制器的一部分,因为它可以被视为模拟玩家输入,这将被视为控制器的一部分,对吗?还是会 一个普通的敌人呢,比如马里奥岛上的木巴 更新:哇,这真的不是我期望的答案。据我所知,人工智能是自主游戏系统的一个内部部分,因此是一个模型。我仍然不相信。在我看来,它就像是在模拟人类玩家,因此它应该处于与人类玩家相同的位置。因此,它是一个与控制器交互的外部元素。(出于显而易见的原因,它实际上不需要显示器。) 编辑:事实上,我收回这句话。它将有一个显示器,

它可能是模型的一部分,因为它是游戏业务逻辑的一部分

它可能是控制器的一部分,因为它可以被视为模拟玩家输入,这将被视为控制器的一部分,对吗?还是会

一个普通的敌人呢,比如马里奥岛上的木巴


更新:哇,这真的不是我期望的答案。据我所知,人工智能是自主游戏系统的一个内部部分,因此是一个模型。我仍然不相信。

在我看来,它就像是在模拟人类玩家,因此它应该处于与人类玩家相同的位置。因此,它是一个与控制器交互的外部元素。(出于显而易见的原因,它实际上不需要显示器。)

编辑:事实上,我收回这句话。它将有一个显示器,只是不是一个人类可读的。“显示器”将负责向AI传送游戏状态信息,即使这意味着向AI传输序列化数据

第二部分:哦,我明白了。。。这和我想的人工智能不太一样。我想它仍然可以以同样的方式处理,但这将迫使新功能在控制器中公开,这可能没有意义。(例如,控制器必须同时显示移动玩家和计算机的单元。)

我将把行为放在模型中:

Goomba.move()
{
    /* Move Goomba forward one unit. */
}
然后在控制器中调用该行为

Controller.advanceTime()
{
    foreach(Goomba goomba in state.getGoombas())
    {
        goomba.move();
    }
}

想一想一个简单的游戏,比如tic-tac-toe,你会想要不同的电脑难度来对抗它。如果你把每个难度都定为a级,在不同的实现中很容易放弃。

敌人的AI有一个模型,它的智能内部指定如何玩游戏,并且它使用人类玩家和NPC都可以使用的控制器来操纵游戏环境中的状态。

敌人的AI模型将了解游戏规则并改变其内部状态根据这些规则陈述。游戏控制器向AI提供外部游戏状态的知识,AI可以使用这些知识来决定如何改变其内部状态

(我第一次在这里写的是:)

人工智能与游戏世界交互的部分将在控制器中。人工智能中作为自主代理进行决策的部分将在模型中。控制器将根据其决策所需的状态更新AI的模型,并且控制器还将根据AI模型中的任何更改修改游戏并渲染视图


对于Goomba,游戏控制者会根据Mario的位置(如果它在它的视线内)更新Goomba模型,Goomba模型会根据它打算移动的位置进行自我更新。如果没有任何障碍物,控制器将移动Goomba(即更新模型的位置),并使用Goomba的新状态渲染视图。

MVC作为一种适用于大量应用程序的体系结构非常有效。一些应用程序可能会发现MVC对于外部接口,尤其是作为更复杂体系结构的一部分的用户接口,工作得很好

如果你发现自己试图将一个问题“强制适应”到一个模式中,那么它可能不是正确的模式。对UI使用MVC——对AI使用其他模式(消息总线、观察者/监听器等)或其他OO技术(@Bill the Lizard的策略建议仍然适用)


使用整个工具箱,而不仅仅是锤子

我不确定它在MVC中的位置。此psudo代码是我如何完成*路径查找AIs的一个极其简化的版本

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)
}

在我看来,在任何MVC实现中,模型都应该包含域逻辑——无论它是自治对象(逻辑粘贴在方法中)还是套接字流包装器(逻辑通过外部资源执行——是的,考虑多人游戏)。控制器应根据一些外部变量(例如CLI参数、事件调度器)用作模型的调用者/处理者。然后将所需数据(如数组、序列化变量或某种数据传输对象)返回到适当的视图(游戏屏幕、控制台终端)


干杯,艾伦

都不要。我会将人工智能编程为独立代理,通过控制器与模型通信。或者,如果您愿意,AI是一个模型,但不是模型。

请记住,MVC最初纯粹是一种GUI架构模式。因此,它不能很好地映射到人工智能、网络或其他方面也就不足为奇了。但是在这里使用它仍然有一些好处。但是,代码实现了什么并不重要,重要的是它在链中的位置。仅仅因为某些东西看起来像是内部的,并不意味着它是内部的,因此不应该被视为内部的

如果你正在写一个机器人,很有可能你只是在写脚本来操纵角色。因此,从这个意义上说,脚本接口是预先存在的控制器,而您的脚本完全是外部的。你甚至不需要到模型附近的任何地方去编写高级人工智能

现在,如果您是最初的程序员,必须编写低级AI功能,这是由玩家交互(例如,单击某个地方开始行走)或机器人风格的脚本触发的,那么您应该已经将其写入模型中了

从模型到控制器,再到操纵控制器的任何人或任何东西,像“AI”这样的任何单一概念似乎都是不直观的,但当你试图将两个非常不同的概念相互映射时,情况就是这样。很明显,当你从一个开发者的角度来看,他试图为非玩家角色提供与玩家角色相同的界面——最终,AI必须包括系统外的参与者将做出的高层决策,以及典型的底层实现