Wie entwerfe ich ein Kartenspiel?

10

Ich kann mir keine gute Architektur für mein Kartenspiel einfallen lassen. Ich brauche Hilfe, um zu verstehen, wie Spiele normalerweise gestaltet sind.

Zuerst werde ich die Spielregeln beschreiben.

Spielregeln

Konfiguration
  • Es gibt vier Spieler, von denen jeder zwei ein Team bildet.
  • Jeder Spieler erhält 12 gemischte Karten
  • Es gibt 4 geblendete Karten auf dem Tisch (Fluss)
  • Die Reihenfolge der Spieler ist so

Geben Sie hier die Bildbeschreibung ein

Wetten
  • Jeder Spieler kann eine Zahl zwischen 100 und 160 passen oder auswählen, die größer als der aktuelle Einsatz ist
  • Das Wetten beginnt beim ersten Spieler und kreist bis zum Pass eines Teams
  • Sobald ein Spieler passt, kann er nicht mehr wetten
  • Das Team, das die Wettrunde gewinnt, sollte mindestens Punkte sammeln, die seiner Wette entsprechen, um das Spiel zu gewinnen
  • Die Mannschaft, die die Wettrunde verloren hat, sollte nicht zulassen, dass ihre Mannschaft ihr Ziel erreicht

  • Wenn das Team, das die Wettrunde gewonnen hat, alle Punkte erhält, erhält das andere Team negative Punkte in Höhe seiner Wette

  • Wenn das Team, das die Wettrunde verloren hat, alle Punkte sammelt, erhält das andere Team doppelt negative Punkte

Spielfluss und Sammeln von Punkten

  • Der Spieler, der die Wettrunde gewonnen hat ( der König ), erhält vier verbleibende Karten auf dem Tisch.
  • Dann kann sie / er einen Satz von vier Karten in ihrer Teamkartenbank speichern, ohne sie zu spielen.
  • Der König wird einen Anzug als Herrscheranzug auswählen und andere darüber informieren
  • King beginnt das Spiel, indem er eine Karte aus seiner Hand auf den Tisch legt. Jeder andere Spieler sollte in dieser Reihenfolge spielen
    • Wenn sie dieselbe Farbe dieser Karte auf der Hand haben, müssen sie eine dieser Karten spielen
    • Wenn sie es nicht haben, können sie jeden anderen Anzug spielen
  • Nachdem alle anderen Spieler ihre Hände gespielt haben, ist der Gewinner der Runde:
    • Derjenige, der die höchste Karte hat, wenn alle Karten gleich sind
    • Derjenige, der die höchste "Lineal" -Karte hat, falls es eine gibt
  • Der Gewinner der Runde sammelt Karten und legt sie auf seine Bank
  • Spieler, die die vorherige Runde gewonnen haben, beginnen die nächste Runde
  • Dies wird so lange fortgesetzt, bis alle Hände leer sind

Punkte zählen

  • Jede Runde zu gewinnen hat 5 Punkte. Dies bedeutet, dass jede 4 Karten mindestens 5 Punkte hat.
  • Wenn Sie ein Ass, 10 oder 5 in der Bank haben, werden jeweils 5 Punkte hinzugefügt

Mein Design

Klassen

class Card {
   string suit;
   string rank
}
class Deck {
  List cards = [];
  List suits = ['S', 'H', 'D', 'C'];
  List ranks = ['1', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A'];
  private void init(){..}
  void shuffle(){...}
}

class Game{
  Deck deck = new Deck();
  Player player1;
  Player player2;
  Player player3;
  Player player4;
  int _isOn = 0;

  Game(this.player1, this.player2, this.player3, this.player4){
    deck.makeCards();
    deck.shuffle();
    start();
  }

  void start(){
    player1.cards.addAll( deck.cards.getRange(0, 12) );
    player2.cards.addAll( deck.cards.getRange(12, 24) );
    player3.cards.addAll( deck.cards.getRange(24, 36) );
    player4.cards.addAll( deck.cards.getRange(36, 48) );
    deck.cards.removeRange(0, 48);
  }

  String toJson(){
  }

  String toString(){
  }
}
class Player{
  String name;
  int points;
  List cards = [];

  Player(this.name, {this.points});

  String toJson(){}

  String toString(){}
}

Mein Problem

Nachdem ich alle diese Klassen definiert habe, weiß ich nicht, wie ich diese Definitionen an eine Datenbank (wie Mongo) binden und den Spielfluss steuern soll.

  • Wohin soll all diese Logik gehen?
  • Wie soll ich den Status in einem Server / Client-Szenario beibehalten?

Hinweis:

Ich benutze Dart, um dies zu programmieren, aber ich möchte nicht, dass Antworten in Dart geschrieben werden.

Mohsen
quelle
Wenn jemand Ihren Code betrachtet und ihn als Ausgangspunkt verwendet, beachten Sie, dass Sie A oder 1 in den Rängen auswählen sollten, aber nicht beide einschließen sollten.
Ben

Antworten:

10

Sie machen hier einen klassischen Fehler. Jemand hat Ihnen gesagt, Sie sollen eine Webanwendung für ein Kartenspiel erstellen, und Sie versuchen herauszufinden, wie Sie alles auf einmal erstellen können. Dieser Ansatz verwirrt selbst die besten Programmierer, da Studien gezeigt haben, dass Sie nur 7 Informationen gleichzeitig in Ihrem Kopf behalten können. Der Versuch, mit mehr zu jonglieren, erfordert intensive Konzentration, und Sie können nicht erwarten, dass Sie so weitermachen.

Versuchen Sie lieber, sich mehr auf das Schreiben einer Kartenspielbibliothek zu konzentrieren, als würde jemand Ihre Bibliothek anrufen, um Ihr Kartenspiel zu spielen. Sie scheinen einen hervorragenden Start für Ihr Modell zu haben. Das ist gut, aber Sie müssen Gamedie Schnittstelle erstellen, über die Anrufer Make-Moves usw. verwenden können.

Ich würde also erwarten, dass Game mehrere neue Methoden hat, wie:

getPlayers()        // Get all player info
getCurrentPlayer()  // Get information about the active player in his turn (hand, money to bet with, etc.)
fold()              // Current player folds and current player changes
bet(float amount)   // Current player bets and current player changes

Kurz gesagt, alles, was Sie wissen müssen, um das Spiel auszuführen, können Sie mit Ihrem Objekt tun Game. Erst wenn Sie dies haben, fahren Sie mit Schritt 2 fort.

Schreiben Sie eine separate Klasse, deren einziger Zweck darin besteht, eingehende Anforderungen zu empfangen, anzuwenden Gameund die Ausgabe an den Benutzer zurückzusenden. Wenn Sie die GameAusgabe in JSON konvertieren möchten , tun Sie dies außerhalb von, Gameda dies nicht der Zweck von ist Game!

Um diese Informationen beizubehalten, können Sie eine andere Klasse erstellen, die eine Schnittstelle zu MongoDB bietet. Diese Klasse würde nicht von der Existenz dieser Klasse wissen Gameund auch Gamenicht von der Existenz dieser Klasse.

Kurz gesagt, konzentrieren Sie sich auf die einzelnen Komponenten, und alles wird gut. Sie beginnen falsch zu liegen, wenn Sie versuchen, beim Schreiben Ihres Programms zu viele Aspekte zu berücksichtigen. Ein weiser Professor sagte mir einmal: " Wissen und akzeptieren Sie die Tatsache, dass das erste Programm, das Sie für ein Projekt schreiben, bis zum Ende vollständig neu geschrieben wird. "

Neil
quelle
Abgesehen davon liegt diese Zahl je nach Person zwischen 3 und 9 - ich kann 4 oder 5 machen, je nachdem, wie aufmerksam ich bin. Der übliche Test besteht darin, eine Reihe von Punkten zu betrachten und herauszufinden, wie viele Sie einzeln wahrnehmen können, ohne sie mental zu gruppieren. Mit 6 beginne ich beispielsweise, sie automatisch in 3 + 3 zu gruppieren, und kann sie nicht einfach wieder trennen .
Izkata
@ Izkata Das ist interessant. Mir war nicht bewusst, dass es dafür einen Test gab. Hast du einen Link?
Neil
1
en.wikipedia.org/wiki/… ist die Quelle, glaube ich.
AakashM
1

Wohin soll all diese Logik gehen?

Beginnen Sie damit, es in Ihre GameKlasse aufzunehmen.

Dies ist ein regelbasiertes Spiel mit einer begrenzten Anzahl von Status. Ich würde es als Zustandsmaschine modellieren . Das Zustandsmuster wird Ihnen immens helfen.

Schließlich möchten Sie diesen FSM in separate Klassen extrahieren, aber machen Sie sich darüber vorerst keine Sorgen.

Wie soll ich den Status in einem Server / Client-Szenario beibehalten?

Dies kann nicht beantwortet werden, ohne mehr über Ihr Setup zu wissen. Das Serialisieren Ihres Spielobjekts und der Status in der Datenbank in jeder Runde kann den Trick tun.

Martin Wickman
quelle
Hier ist ein Begleitartikel über State / FSM, in diesem Fall aus einem Buch über Spiele: gameprogrammingpatterns.com/state.html
shmup