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
- 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.
architecture
Mohsen
quelle
quelle
Antworten:
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
Game
die Schnittstelle erstellen, über die Anrufer Make-Moves usw. verwenden können.Ich würde also erwarten, dass Game mehrere neue Methoden hat, wie:
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
Game
und die Ausgabe an den Benutzer zurückzusenden. Wenn Sie dieGame
Ausgabe in JSON konvertieren möchten , tun Sie dies außerhalb von,Game
da dies nicht der Zweck von istGame
!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
Game
und auchGame
nicht 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. "
quelle
Beginnen Sie damit, es in Ihre
Game
Klasse 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.
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.
quelle