2008-12-10 11 views
5

Es könnte Teil des Modells sein, weil es Teil der Geschäftslogik des Spiels ist.Ist Feind/Bot A.I. Teil des Modells oder Controllers in einem MVC-Spiel

Es könnte Teil des Controllers sein, weil es als simulierende Spielereingabe gesehen werden könnte, die als Teil des Controllers betrachtet werden würde, richtig? Oder würde es?

Was ist mit einem normalen Feind, wie ein Goomba in Mario?

UPDATE: Wow, das ist wirklich nicht die Antwort, die ich erwartet habe. Soweit ich das beurteilen konnte, A.I. ist ein interner Teil des autonomen Spielsystems, also Modell. Ich bin immer noch nicht überzeugt.

Antwort

5

Denken Sie daran, dass MVC ursprünglich ein reines GUI-Architekturmuster war. Es ist also keine Überraschung, dass es nicht gut zu KI, Netzwerken oder was auch immer passt. Aber es gibt noch einige Vorteile, es hier zu verwenden. Aber was der Code erreicht, ist nicht so wichtig wie in der Kette. Nur weil etwas aussieht, als sei es intern, bedeutet das nicht, und sollte daher nicht als solches gezählt werden.

z. Wenn Sie einen Bot schreiben, sind die Chancen groß, dass Sie im Grunde nur Skripte schreiben, um die Charaktere zu manipulieren. In diesem Sinne ist das Skript-Interface der bereits vorhandene Controller und Ihre Skripte sind komplett extern. Du gehst nicht einmal irgendwo in die Nähe des Modells, um diese hohe AI ​​zu schreiben.

Nun, wenn du der ursprüngliche Programmierer wärst, der Low-Level-AI-Funktionalität schreiben müsste, die entweder durch Spielerinteraktion ausgelöst wird (z. irgendwo klicken, um dort zu laufen oder mit einem Bot-Skript, dann hättest du das in das Model geschrieben.

Es mag nicht intuitiv erscheinen, wenn ein einzelnes Konzept wie "AI" den ganzen Weg vom Modell über den Controller bis zu wem oder was auch immer den Controller manipuliert, aber so geht es, wenn Sie versuchen, 2 zuzuordnen sehr unterschiedliche Konzepte aufeinander. Es ist offensichtlich, wenn man es aus der Perspektive eines Entwicklers betrachtet, der versucht, die gleichen Schnittstellen für Nicht-Spieler-Charaktere wie für Spieler-Charaktere zu präsentieren - schließlich muss die KI sowohl die hochrangige Entscheidung treffen, die ein Schauspieler außerhalb von ist Das System würde zusätzlich zu der Low-Level-Implementierung, die normalerweise sowohl für Spieler als auch für Nicht-Spieler innerhalb des Systems existiert.

1

Es scheint mir, als würde es einen menschlichen Spieler simulieren, also sollte es an der gleichen Stelle sein wie ein menschlicher Spieler. Es ist also ein externes Element, das mit dem Controller interagiert. (Aus naheliegenden Gründen ist eine Anzeige dafür nicht wirklich notwendig.)

EDIT: Eigentlich nehme ich das zurück. Es wird eine Anzeige haben, nur keine von Menschen lesbare. Die "Anzeige" wird dafür verantwortlich sein, Spielzustandsinformationen an die KI zu übermitteln, selbst wenn das bedeutet, serialisierte Daten zu ihr zu streamen.

Teil 2: Oh, ich verstehe ... Das ist nicht die Art von KI, an die ich gedacht habe. Ich nehme an, es könnte immer noch auf die gleiche Weise gehandhabt werden, aber das würde dann neue Funktionen im Controller erzwingen, die keinen Sinn ergeben. (Zum Beispiel würde der Controller bewegt aussetzen müssen sowohl die Einheiten und den Computern der Spieler Einheiten.)

ich das Verhalten im Modell setzen würde:

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

Und dann die Anrufungen dieses Verhaltens Geh in den Controller.

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

Denken Sie an ein einfaches Spiel wie Tic-Tac-Toe, wo Sie verschiedene Computer Schwierigkeitsstufen gegen spielen möchten. Wenn Sie jeden Schwierigkeitsgrad zu einem Strategy machen, ist es einfach, verschiedene Implementierungen zu verwenden.

7

Die Gegner-KI hat ein Modell - seine intelligenten Innereien, die festlegen, wie das Spiel spielen - und es verwendet den Controller zur Verfügung beiden menschlichen Spieler und NPCs seines Zustand in der Spielumgebung zu manipulieren.

+0

In einem Spiel kann das Modell jedoch seinen eigenen Status ändern, also warum müssen Sie den Controller durchlaufen? – Iain

+0

Sie benötigen einen Controller, wenn Sie den Status eines anderen Modells ändern. Es ist in Ordnung, wenn ein Modell seine eigenen Interna ändert, aber anderer Code sollte über einen Controller gehen. –

1

Das gegnerische AI-Modell würde die Regeln des Spiels kennen und seinen internen Zustand nach diesen Regeln ändern. Die Game-Controller geben der KI Kenntnis vom Zustand des externen Spiels, mit dem sie entscheiden können, wie sie ihren internen Zustand ändern soll.

(Was ich hier geschrieben :)

Der Teil der KI, die mit der Spielwelt interagiert in der Steuerung sein würde. Der Teil der KI, der Entscheidungen als autonomer Agent trifft, wäre im Modell enthalten. Der Controller würde das AI-Modell mit dem Status aktualisieren, den es für seine Entscheidungen benötigt, und der Controller würde auch das Spiel modifizieren und die Ansicht basierend auf Änderungen im AI-Modell rendern.

Für ein Goomba, das Goomba Modell mit Mario Standort (wenn es in seinen Augen) und das Goomba Modell würde aktualisieren selbst, wo es beabsichtigt zu bewegen würde aktualisiert der Game-Controller. Der Controller würde dann den Goomba (d.h., aktualisieren Sie den Standort des Modells), wenn keine Hindernisse vorhanden sind, und rendern Sie die Ansicht mit dem neuen Status des Goomba.

10

MVC funktioniert sehr gut als eine Architektur für eine große Anzahl von Anwendungen. Einige Anwendungen finden MVC möglicherweise gut für die externen Schnittstellen , insbesondere Benutzerschnittstellen als Teil einer komplexeren Architektur.

Wenn Sie versuchen, ein Problem in ein Muster zu "erzwingen", ist es wahrscheinlich nicht das richtige Muster. Verwenden Sie MVC für die Benutzeroberfläche - verwenden Sie andere Muster (Message Bus oder Observer/Listener, etc ...) oder andere OO-Techniken für die AI (@Bill der Lizard Vorschlag der Strategie gilt noch).

Verwenden Sie Ihre gesamte Toolbox - nicht nur den Hammer. ;-)

+0

+1 für die angemessene Antwort. Ich hasse es immer noch, wenn Leute mich zitieren und mehr Upvotes bekommen, obwohl. :) –

+0

Gut gesagt. Ich glaube, die Leute denken, dass MVC heutzutage der einzige Weg ist, Dinge zu tun. @Bill - es ist nicht wie du bist kurz aber ist es? – Draemon

0

Ich bin nicht sicher, wo es in MVC passen würde. Dieser Psudo-Code ist eine extrem vereinfachte Version davon, wie ich A * Pfad-Such-AIs gemacht habe.

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

Der Punkt von MVC in einem Spielszenario besteht darin, die visuelle Darstellung jedes Feindes (die Ansicht) von ihrem Verhalten, ihrer Gesundheit usw. (Modell) zu trennen. Wenn Sie also von einem isometrischen Spiel zu einem 3D-Spiel wechseln möchten, können Sie eine neue Ansicht hinzufügen und das Modell unberührt lassen. – Iain

0

In meiner Meinung nach in jeder MVC Implementierung sollte Modell Domänenlogik halten - wann immer es autonomes Objekt (Logik wird stiched-in innerhalb der Methoden) oder Sockel-Stream-Wrapper (wo Logik über externe Ressource durchgeführt wird, - Ja, denke an Multiplayer). Der Controller sollte als Aufrufer/Handler des Modells basierend auf einigen externen Variablen (z. B. CLI-Parameter, Ereignis-Dispatcher) verwendet werden. Und geben Sie dann die erforderlichen Daten (als Array, serialisierte vars oder irgendeine Art von Datenübertragungsobjekt) in die richtige Ansicht zurück (gamescreen, Konsolenterminal).

Prost, Alan

-1

Weder. Ich würde eine KI als unabhängigen Agenten programmieren, der über den Controller mit dem Modell kommuniziert. Oder wenn Sie möchten, ist die AI A Modell, aber nicht das Modell.

Verwandte Themen