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

它可以是控制器的一部分,因为它可以被看作是模拟玩家输入,这将被认为是控制器的一部分,是吗?或者将它?

什么正常敌人,像在一个马里奥的goomba?

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

有帮助吗?

解决方案

记住MVC原是纯粹的GUI架构模式。因此,这是毫不奇怪的,它并没有很好地映射到人工智能,网络,或什么的。但仍有在这里使用它的一些好处。但是,该代码实现并不像它坐落在链一样重要。仅仅因为一些看起来像它的内部,并不意味着它,因此不应该算作此类。

例如。如果你正在写一个机器人,机会是很高,你将基本上只是被编写脚本来操纵字符。所以在这个意义上说,脚本接口是预先存在的控制器,和你的脚本是完全外在于那个。你甚至都不去任何地方的模式接近编写高水平的AI ..

现在,如果你是原来的程序员,谁写的低水平AI功能,这由玩家互动而引发(如点击某个地方开始走路有),或通过一个机器人式的脚本,那么你将有被编写到模型中。

它可能看起来不直观有任何单一的概念,如“AI”跨度都是从模型的方式,通过控制器和右出给谁或什么的操纵控制,但是这是怎么回事,当你试图将2非常地图不同的概念到彼此上。当你从一个开发者,希望他们为玩家人物做呈现非玩家角色相同的接口的角度去看待它,它是显而易见的 - 最终的AI必须同时包括高层的决策,一个演员的外该系统将使,除了通常存在于系统内的玩家和非玩家低电平实现。

其他提示

MVC工作得非常好作为用于大量应用的架构。某些应用可能会发现,MVC可以很好地用于在外部接口,尤其是用户界面作为一个更复杂的结构的一部分。

如果你发现自己试图“强行适合”的问题变成一个模式,它可能是不正确的模式。使用MVC的UI - 使用其他模式(消息总线,或者观察/监听器等)或其他面向对象技术的AI(@Bill战略的蜥蜴的建议仍然适用)

使用你的整个工具箱 - 不仅仅是锤。 ; - )

在敌人的AI 的模型 - 其智能内脏指定如何玩游戏 - 它的使用控制器适用于人类玩家和NPC来操纵其状态在游戏环境中。

想想一个简单的游戏像井字棋,你想不同的电脑难度级别对战的。如果你把每个难度级别战略,很容易在不同的实现下降。

在我看来,像它模拟人的球员,因此它应该是在同一位置上的人的球员。因此,它是与控制器交互的外部元件。 (由于明显的原因,显示是不是真的必要它。)

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

2部分:哦,我明白了这是不太相同类型的AI,因为我在想的。我想这仍然可以相同的方式处理,但随后这将迫使新功能的控制器,它可能没有什么意义被曝光。 (例如,该控制器将必须暴露移动玩家的单元和计算机的单元两者。)

我会把行为模型:

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

然后该行为的调用在控制器去。

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

敌人的AI模式将有游戏的规则知识,并根据这些规则改变其内部状态。游戏控制器(一个或多个)提供AI与外部游戏的状态,它可以使用的知识来决定它应如何改变其内部状态。

  

(我先写到这里:)

     的

AI的与所述游戏世界相互作用的部分将是在控制器中。人工智能的使决策作为一个独立的代理人将在模型中的一部分。该控制器将与它需要基础上作出决定的状态更新AI的模型和控制器也将基于AI模型的任何变化修改游戏和显示视图。

有关一个的goomba,游戏控制器将更新与Mario的位置的goomba模型(如果它是在其视线)和的goomba模型将更新本身在何处它打算移动。然后,控制器将移动的goomba(即,更新模型的位置)如果不存在任何障碍,并呈现与该的goomba的新状态的图。

我不知道哪里会融入MVC。这psudo代码是我所如何完成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)
}

在我看来,在任何MVC实现,模型应该保持域逻辑 - 每当它是自主对象(逻辑stiched-的方法中内部)或套接字流封包(其中经由外部资源执行的逻辑 - 对,认为关于多人游戏)。控制器应当作为基于某些之外的变量模型的呼叫者/处理程序(例如CLI参数,事件调度器)。然后返回所需要的数据(如阵列,系列化VARS或某种数据传输对象的)到适当的视图(gamescreen,控制台端子)。

干杯,阿兰

都不是。我将编程的AI与经由控制器的模型进行通信的独立剂。或者,如果你喜欢,人工智能是的 A 的模型,但不是的的模型。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top