4 Stimmen

Spiel-Design-Verbesserung

Ich hatte eine Diskussion mit meinem Entwicklerkollegen über das folgende Spieldesign.

Ich habe eine Sammlung von Move in der Game Klasse. Mein Entwicklerkollege bittet mich, die Sammlung zu entfernen und nur die Informationen zum aktuellen Zug dort zu haben.

Was sind deine Vorschläge?

public class Game
{
    public String Id { get; set; }
    public String CreatorId { get; set; }

    public List Players { get; set; }
    public List Moves { get; set; }
}

public class Player
{
    public String Id { get; set; }
    public String Name { get; set; }
}

public class Move
{
    public String Id { get; set; }
    public String PlayerId { get; set; }
    public String PlayerName { get; set; }
    public String NextMoveId { get; set; }
    public String NextPlayerId { get; set; }
    public String Position { get; set; }
}

Bearbeiten:
Mein Entwicklerkollege schlägt mir vor, nur ein einzelnes Move Objekt in der Game Klasse zu haben.

7voto

Cody Gray Punkte 229889

Es gibt keinen wirklich richtigen Ansatz, den wir für Ihr Design geben können. Es ist keine klare Situation; es gibt keine "richtige" oder "falsche" Antwort. Und es ist besonders schwierig für uns, Vorschläge zu machen, da wir nicht alle Details hinter dem Design Ihres Spiels kennen. Zum Beispiel, wie ich in einem Kommentar gefragt habe und wie einige der anderen Antworten angedeutet haben, wenn Sie eine "Rückgängig machen" oder "Wiederholen" Funktion haben, müssen Sie eine Historie aller Züge speichern. Wenn nicht, und Sie keine Lust haben, eine solche Funktion zu implementieren, besteht kein Bedarf, Informationen über alle Züge zu speichern.

Dies ist die Art von Design-Entscheidung, die Sie als Programmierer lernen müssen zu treffen. Denken Sie über alle möglichen Vorteile eines Ansatzes und die Vorteile des anderen Ansatzes nach, und entscheiden Sie dann, welcher am besten für Ihre Anwendung geeignet ist. Erstellen Sie eine "Tabelle", wenn Sie es hilfreich finden. Etwas wie:

       Liste aller Züge behalten           |         Nur den letzten Zug speichern
    ---------------------------------------|------------------------------------
     - Ermöglicht die Implementierung von  |   - Vereinfacht das Design Ihres Spiels   
      Rückgängig oder Wiederholen Funktion | 
     - Verbraucht mehr Speicher            |   - Spart Speicher, indem nur die
                                           |      minimal benötigten Daten gespeichert werden
                                           | 
                                           |
    ...usw.

Am Ende sind Sie (und Ihr Kollege) diejenigen, die in der besten Position sind, um diese Entscheidung zu treffen. Stellen Sie sicher, dass Sie sich mit einem sorgfältigen Vergleich der Vor- und Nachteile ausgestattet haben, um sicherzustellen, dass Sie die richtige Entscheidung getroffen haben.

4voto

C.Evenhuis Punkte 25310

Ein Spiel besteht oft aus einer Reihe von Zügen, die von einem oder mehreren Spielern ausgeführt werden. Zwischen jedem Zug befindet sich das Spiel in einem bestimmten Zustand.

Wenn Sie den aktuellen Zustand haben und keine Notwendigkeit haben, die vorherigen Züge zurückzuspielen oder rückgängig zu machen, würden Sie niemals auf die vorherigen Züge zugreifen. Zukünftige Züge sind noch nicht bekannt, also würde ich mit den Informationen, die Sie bereitgestellt haben, sagen, dass Spiel keine Züge haben sollte, sondern nur einen Zustand und eine Methode ProcessMove(Zug Zug) um den Zustand des Spiels zu ändern. Der Zug wird von einem der Spieler generiert.

1voto

stevenrcfox Punkte 1477
public class Spiel 
{ 
    public String Id { get; set; } 
    public String CreatorId { get; set; } 

    public List Players { get; set; } 
    public String PlayerId { get; set; } 
} 

public class Spieler 
{ 
    public String Id { get; set; } 
    public String Name { get; set; } 
    public String Position { get; set; }

    public Move(string NewPosition);

    public event EventHandler onMoved;
}

Dies wäre meine bevorzugte Option, obwohl es schwer zu sagen ist, um welche Art von Spiel es sich handelt. Wie auch immer, ein Spieler sollte seine eigene Position kapseln und das Spiel sollte den aktuellen Spieler kennen.

Was Bewegungen betrifft, hängt es vom Spiel ab, aber die Bewegung wird die Position des Spielers ändern, und dies kann andere Spieler beeinflussen oder auch nicht, also würde ich die Bewegung wahrscheinlich beim Spieler implementieren und ein onMoved-Ereignis bei den Spielern haben, dem das Spiel abonniert ist.

0voto

Falcon Punkte 3130

Ich sehe nichts falsch daran, eine Sammlung von Zügen dort zu haben. Sie können den aktuellen Zug mit einer anderen Eigenschaft offenlegen, dann sind sowohl Sie als auch Ihr Partner zufrieden.

Das ist alles, was ich mit den von Ihnen bereitgestellten Informationen sagen kann. Ich kenne Ihre Spiellogik nicht. Die Sammlung von Zügen kann von Vorteil sein, wenn Sie eine Historie von Zügen benötigen (z.B. eine Wiedergabefunktion) oder wenn Sie mehrere Züge im Voraus planen möchten. Dort sehe ich nichts falsch, abgesehen davon, dass Sie es wahrscheinlich nicht unbedingt brauchen.

Übrigens: List ist für Implementierungen gedacht, nicht für Objektmodelle. Ich würde die Liste in eine Klasse namens MovesCollection einschließen. Und Move sollte eine Schnittstelle implementieren (einen abstrakten Vertrag), falls Sie viele verschiedene Zugimplementierungen benötigen (z.B. AttackMove, Fortify-Move, Retreat-Move ...)

0voto

JeffE Punkte 764

Ich denke, dass es nützlich sein könnte, die Sammlung zu haben, um ein "Rückgängig machen"-Feature in Ihrem Spiel umzusetzen. Die Liste der Move-Objekte könnte eine Implementierung von Befehlen sein, und Sie könnten den Zustand Ihres Spiels mithilfe der Informationen in den Befehlen speichern/wiederherstellen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X