Frage

Ich bin relativ neue Entwicklung zum Spiel so entschied ich sowohl Erfahrung und Unterhaltung ein Hobby-Projekt von Grund auf neu erstellen wollte. Das spezifische Spiel ist ähnlich wie Poker bekannt als Three Card Brag . Das Spiel wird im Film gespielt Bube, Dame, König, Gras .

Ich habe auf einige der Themen auf SO in Bezug auf die Entwicklung von Spielen zu lesen auf, wenn auch meist diese Frage . Dies hat dazu beigetragen, die ursprüngliche Art und Weise aufzumöbeln ich die Objekte schuf.

Ein besonderes Problem, das ich habe Spiel Zustand definieren. Mein erster Ansatz war alles zu trennen (zB Chip-Stacks in einem Player Klasse zu halten), aber nach den Antworten auf den Frage ich bereits erwähnt, scheint es, als ob alle möglichen Zustände des Spiels sollte innerhalb eines GameState Objekt beibehalten werden. Was ich kam mit im Wesentlichen so aus:

abstract class CardGameState
{
    protected List<Player> _Players;
    protected Player _CurrentPlayer;
    protected Dictionary<Player, int> _Chips;
    protected Dictionary<Player, Hand> _CurrentHand;
    protected Dictionary<Player, PlayerStatuses> _PlayerStatus; // PlayerStatuses.InHand, PlayerStatuses.Folded, PlayerStatuses.SittingOut, etc.
    /* etc. */

, wobei jedes CardGameState durch eine Aktion modifiziert wird:

public interface IAction
{
    string Name { get; }

    CardGameState Apply(CardGameState state);
    bool IsLegal(CardGameState state);
}

Jetzt fühle mich sehr stark, dass dies den Zweck der objektorientierten Programmierung ist zu besiegen, da die Daten speziell für den Spieler im Zusammenhang (in diesem Fall seines Chip-Stack, Hand, und die aktuellen Status) nicht durch die gekapselte Player Objekt.

Auf der anderen Seite, wenn ein Spieler die Wette zu erhöhen, würde ich ein RaiseAction erschaffen, die IAction implementiert, aber die IAction Schnittstelle akzeptiert nur den aktuellen Spielzustand, das glaube ich nicht, ob der Chip wäre ideal Stapel wurden in der Player Klasse gespeichert.

Im Grunde ist meine Frage: kann ich das Beste aus beiden Welten haben, so dass ich eine genaue Darstellung des Spiels Zustand haben kann, während gleichzeitig behält dabei alle Daten gezielt auf ein Objekt innerhalb des Spiels Zustand innerhalb seines gegebenen Objekt beziehen

War es hilfreich?

Lösung

Im Online-Spielen mit dem Befehlsmustern (Ihr IAction) ist der Standard, und bewiesen, wie es zu tun. Es ist nicht im Sinne des Spielers objektorientiert, aber die Aktionen sind objektorientiert, so von einem rein theoretischen Punkt seiner einen soliden Design-Muster sehen, glaube ich. Und in der Praxis das ist, wie jedes erfolgreiches Online-Spiel, das ich je gesehen habe implementiert, aber beachten Sie, dass Action-Spiele normalerweise sehr klein verwenden diskrete Aktionen / Pakete, bis es praktisch ein Strom von Sorten wird.

Edit:

Eine lange Zeit, nachdem ich diese zu antworten, kam ich wieder hier und realisiert für dieses Problem eine andere Lösung ist GameState der Spieler, Decks, etc ... wie abgeleitet von einem IState Klasse mit einem implementieren < strong> Übernehmen (IAction Aktion) Mitglied. Auf diese Weise Objekte anwenden Aktionen auf sich selbst, anstatt die Anwendung auf Objekte anwenden Aktionen zu haben, dies würde Karte Aktionen und Staat zu einer

Andere Tipps

Scheint, wie Sie Objekt orientizing es willen für Objekt-orientieren könnte ...

Scheint, wie Bob Martin klassische Bowling-Spiel Problem rel="nofollow.

EDIT: -ZUSAMMENFASSUNG-
Es ist ein lange lesen, aber im Grunde genommen durch TDD und Refactoring, eine Bowling Scoring-Anwendung ging von einem großen Cluster mit vielen Klassen und Polymorphie bis 20 oder 30 eleganten Zeilen Code. Warum? Weil sie nicht wirklich brauchen es in erster Linie sein

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top