Come si progetta un gioco di carte?

10

Non riesco a trovare una buona architettura per il mio gioco di carte. Ho bisogno di aiuto per capire come sono progettati i giochi di solito.

In primo luogo, descriverò le regole del gioco.

Regole del gioco

Impostare
  • Ci sono quattro giocatori, ogni due giocatori formano una squadra.
  • Ogni giocatore riceve 12 carte mescolate
  • Ci sono 4 carte accecate sul tavolo (fiume)
  • L'ordine dei giocatori è così

Scommesse
  • Ognigiocatorepuòpassareoselezionareunnumeromaggioredellascommessaattualetra100e160
  • Lescommesseinizianodalprimogiocatoreedallecerchiefinoalpassaggiodiunasquadra
  • Unavoltacheungiocatorepassa,nonpuòpiùscommettere
  • Lasquadrachevinceilgirodiscommessedovrebberaccoglierealmenopuntipariallapropriascommessapervincerelapartita
  • Lasquadrachehapersoilgirodipuntatenondovrebbeconsentirealproprioteamdiraggiungereilproprioobiettivo

  • Selasquadrachehavintoilgirodiscommesseottienetuttiipunti,l'altrasquadraottienepuntinegativipariallasuascommessa

  • selasquadrachehapersoilrounddiscommesseraccoglietuttiipuntichel'altrasquadraotterràduepuntinegativi

Flussodelgiocoepuntidiraccolta

  • Ilgiocatorechehavintoilgirodiscommesse(ilre)ottienequattrocarterimanentisultavolo.
  • Quindipuòsalvareunsetdiquattrocartenellapropriabancadellecartesquadrasenzanemmenogiocarle.
  • Ilresceglieràunsemecomesemedelgovernanteefaràsapereaglialtriche
  • Kinginiziailgiocomettendounacartadallasuamanosultavolo.Ognialtrogiocatoredovrebbegiocareinquestoordine
    • sehannolostessosemediquellacartanellaloromano,devonogiocareunadiquellecarte
    • senoncel'hanno,possonogiocarequalsiasialtroseme
  • Dopochetuttiglialtrigiocatorihannogiocatoleloromani,ilvincitoredelroundsarà:
    • Chihalacartapiùaltasetuttelecartesonouguali
    • Quellochehalacarta"righello" più alta se ce n'è una
  • Il vincitore del round raccoglierà le carte e le metterà nella propria banca
  • Il giocatore che ha vinto il turno precedente inizierà il prossimo round
  • Questo continuerà finché la mano di tutti non sarà vuota

Punti di conteggio

  • Vincere ogni round ha 5 punti. Ciò significa che ogni 4 carte ha almeno 5 punti.
  • Avere Asso, 10 o 5 in banca aggiunge 5 punti

Il mio design

Corsi

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(){}
}

Il mio problema

Ora che ho definito tutte queste classi non so come associare queste definizioni a un database (come Mongo) e controllare il flusso del gioco.

  • Dove dovrebbe andare tutta quella logica?
  • Come dovrei mantenere lo stato in uno scenario server / client?

Nota:

Uso Dart per programmarlo ma non è necessario che le risposte vengano scritte in Dart.

    
posta Mohsen 31.07.2013 - 05:46
fonte

2 risposte

10

Stai facendo un errore classico qui. Qualcuno ti ha detto di creare un'applicazione web per un gioco di carte e stai cercando di capire come fare tutto in una volta. Questo approccio confonde anche i migliori programmatori, dal momento che gli studi hanno dimostrato che è possibile mantenere solo 7 pezzi di informazioni facilmente disponibili nella tua mente in una volta. Cercare di destreggiarti con più richiede una concentrazione intensa e non puoi aspettarti di continuare così.

Piuttosto, cerca di concentrarti maggiormente sulla scrittura di una libreria di giochi di carte come se qualcuno stesse per chiamare il tuo grimorio per giocare al tuo gioco di carte. Sembra che tu abbia un ottimo inizio sulla tua modella. Ciò è positivo, ma è necessario creare Game dell'interfaccia con cui i chiamanti possono utilizzare le mosse e così via.

Quindi mi aspetto che Game abbia diversi nuovi metodi come:

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

In breve, tutto ciò che devi sapere per eseguire il gioco, puoi farlo usando il tuo oggetto Game . Solo una volta che hai questo vai al passaggio 2.

Scrivi una classe separata il cui unico scopo è quello di ricevere le richieste in arrivo, applicarle a Game e inviare l'output all'utente. Se vuoi convertire Game output in JSON, lo fai fuori da Game poiché non è lo scopo di Game !

Per mantenere queste informazioni, potresti creare un'altra classe che fornisce un'interfaccia a MongoDB. Questa classe non conoscerebbe l'esistenza di Game e nessuno dei due sarebbeGame a conoscenza dell'esistenza di questa classe.

In breve, concentrati sui singoli componenti e starai bene. Cominci a sbagliare quando stai cercando di prendere in considerazione troppi aspetti quando scrivi il tuo programma. Come un professore saggio una volta mi ha detto, " Conosci e abbraccia il fatto che il primo programma che scrivi per un progetto verrà riscritto nella sua interezza alla fine. "

    
risposta data 31.07.2013 - 11:17
fonte
1

Where should all that logic go?

Inizia a metterlo nella tua classe Game .

Questo è un gioco basato su regole con un numero limitato di stati. Lo modellerei come macchina di stato . Il modello di stato ti aiuterà immensamente.

Alla fine vorrai estrarre quella FSM in classi separate, ma per ora non ti preoccupare.

How should I keep state in a server/client scenario?

È impossibile rispondere senza sapere di più sulla configurazione. Serializzare il tuo oggetto di gioco e gli stati nel database ogni turno potrebbe fare il trucco.

    
risposta data 31.07.2013 - 11:07
fonte

Leggi altre domande sui tag