代码之家  ›  专栏  ›  技术社区  ›  Iain

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

  •  5
  • Iain  · 技术社区  · 17 年前

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

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

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

    9 回复  |  直到 16 年前
        1
  •  10
  •   Ken Gentle    17 年前

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

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

        2
  •  7
  •   David Koelle    17 年前

    敌人AI -它的智能内部,指定如何玩游戏-和它

        3
  •  7
  •   Bill the Lizard    17 年前

    想一想一个简单的游戏,比如tic-tac-toe,你会想要不同的电脑难度来对抗它。如果你把每个难度都提高到a级 Strategy ,很容易加入不同的实现。

        4
  •  5
  •   Kylotan    17 年前

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

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

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

        5
  •  1
  •   jdmichal    17 年前

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

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

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

    我将把行为放在模型中:

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

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

    Controller.advanceTime()
    {
        foreach(Goomba goomba in state.getGoombas())
        {
            goomba.move();
        }
    }
    
        6
  •  1
  •   Community Mohan Dere    6 年前

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

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

        7
  •  0
  •   Nick Van Brunt    17 年前

    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)
    }
    
        8
  •  0
  •   Alan Gabriel Bem    17 年前

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

    干杯,艾伦

        9
  •  -1
  •   Breton    17 年前

    也不我会将人工智能编程为独立代理,通过控制器与模型通信。或者如果你愿意,人工智能是 A. 模型,但不是

    推荐文章