是敌人/机器人A.I. MVC游戏中模型或控制器的一部分

时间:2008-12-10 17:07:20

标签: model-view-controller artificial-intelligence

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

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

正常敌人怎么样,比如马里奥的goomba?

更新:哇,这真的不是我期待的答案。据我所知,A.I。是自主游戏系统的内部部分,因此是模型。我还是不相信。

9 个答案:

答案 0 :(得分:10)

MVC作为大量应用程序的架构非常有效。某些应用程序可能会发现MVC适用于外部接口,尤其是用户界面,作为更复杂架构的一部分。

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

使用整个工具箱 - 而不仅仅是锤子。 ; - )

答案 1 :(得分:7)

想象一下像tic-tac-toe这样的简单游戏,你会想要不同的计算机难度级别。如果你将每个难度级别设为Strategy,那么很容易将其放入不同的实现中。

答案 2 :(得分:7)

敌人AI 有一个模型 - 它的智能内部,指定如何玩游戏 - 它使用人类玩家和NPC可用的控制器来操纵它在游戏环境中陈述。

答案 3 :(得分:5)

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

例如。如果您正在编写机器人,那么您很可能只是编写脚本来操纵角色。所以从这个意义上讲,脚本界面是预先存在的Controller,你的脚本完全是外部的。你甚至不去模特附近去写那个高级别的AI ..

现在,如果你是原始程序员,他必须编写低级AI功能,这是由玩家互动(例如点击某处开始在那里开始)或者通过机器人风格的脚本触发的,那么你会有将其写入模型。

任何单一的概念,例如'AI',从模型,控制器,直到任何人或任何操纵控制器的方式,都可能看起来不直观,但是当你试图映射2时,它就是这样的彼此不同的概念。很明显,当你从开发人员的角度来看它时,试图为非玩家角色提供相同的界面,就像他们为玩家角色所做的那样 - 最终,AI必须包含高级决策,除了通常存在于系统内的非玩家和非玩家的低级实现之外,系统还会制作。

答案 4 :(得分:1)

在我看来,它似乎模拟了一个人类玩家,因此它应该与人类玩家处于同一个位置。因此,它是与控制器交互的外部元素。 (由于显而易见的原因,显示器并非真正必要。)

编辑:实际上,我接受了。它将有一个显示器,而不是人类可读的显示器。 “显示”将负责将游戏状态信息传递给AI,即使这意味着将序列化数据串流到它。

第2部分:哦,我明白了...这与我想到的人工智能并不完全相同。我想它仍然可以以相同的方式处理,但那会强制在控制器中暴露新功能可能没有意义。 (例如,控制器必须暴露移动玩家单位和计算机单位。)

我会把行为放在模型中:

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

然后调用该行为进入控制器。

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

答案 5 :(得分:1)

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

  

(我在这里首先写的是:)

     

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

对于Goomba,游戏控制器将使用Mario的位置(如果它在视线中)更新Goomba模型,并且Goomba模型将更新其打算移动的位置。如果没有任何障碍物,控制器将移动Goomba(即,更新模型的位置)并使用Goomba的新状态渲染视图。

答案 6 :(得分:0)

我不确定它适合MVC的位置。这个伪代码是我完成A *寻路AI的极其简化的版本。

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

答案 7 :(得分:0)

在我看来,在任何MVC实现中,模型都应该包含域逻辑 - 只要它是自主对象(逻辑在方法内部被stiched)或者套接字流包装器(其中逻辑是通过外部资源执行的 - 是的,想想关于多人游戏)。控制器应该基于一些外部变量(例如CLI参数,事件调度程序)用作模型的调用者/处理程序。然后将所需数据(如数组,序列化变量或某种数据传输对象)返回到正确的视图(gamescreen,console terminal)。

干杯,艾伦

答案 8 :(得分:-1)

都不是。我会将AI编程为独立代理,通过控制器与模型进行通信。或者,如果您愿意,AI是 A 模型,但不是 模型。