Come posso progettare 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.

Per prima cosa, 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 (river)
  • L'ordine dei giocatori è così

inserisci qui la descrizione dell'immagine

Scommesse
  • Ogni giocatore può passare o selezionare un numero maggiore della scommessa corrente tra 100 e 160
  • Le scommesse iniziano dal primo giocatore e circolano fino al passaggio di una squadra
  • Una volta che un giocatore passa non può più scommettere
  • La squadra che vince il giro di puntate dovrebbe almeno raccogliere punti pari alla propria scommessa per vincere la partita
  • La squadra che ha perso il giro di puntate non dovrebbe permettere alla propria squadra di raggiungere il proprio obiettivo

  • Se la squadra che ha vinto il giro di puntate ottiene tutti i punti, l'altra squadra otterrà punti negativi pari alla propria scommessa

  • se la squadra che ha perso il giro di puntate raccoglie tutti i punti, l'altra squadra otterrà doppi punti negativi

Flusso di gioco e punti di raccolta

  • Il giocatore che ha vinto il giro di puntate ( il re ) ottiene quattro carte rimanenti sul tavolo.
  • Quindi può salvare un set di quattro carte nel loro banco di carte di squadra senza nemmeno giocarle.
  • Il re sceglierà un seme come seme del sovrano e lo farà sapere agli altri
  • King inizia il gioco mettendo sul tavolo una carta dalla sua mano. Ogni altro giocatore dovrebbe giocare in questo ordine
    • se hanno in mano lo stesso seme di quella carta, devono giocare una di quelle carte
    • se non ce l'hanno, possono giocare con qualsiasi altro seme
  • Dopo che tutti gli altri giocatori hanno giocato le loro mani, il vincitore del round sarà:
    • Colui che ha la carta più alta se tutte le carte sono uguali
    • Colui che ha la carta "righello" più alta se ce n'è una
  • Il vincitore del round raccoglierà le carte e le metterà nella loro banca
  • Il giocatore che ha vinto il round precedente inizierà il round successivo
  • Questo continuerà fino a quando la mano di tutti 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 ciascuno aggiunge 5 punti

Il mio design

Classi

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 di gioco.

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

Nota:

Sto usando Dart per programmare questo, ma non è necessario che le risposte vengano scritte in Dart.


Nel caso in cui qualcuno stia guardando il tuo codice e lo utilizzi come punto di partenza, tieni presente che dovresti scegliere A o 1 tra i ranghi, ma non includere entrambi.
Ben

Risposte:


10

Stai commettendo un classico errore qui. Qualcuno ti ha detto di creare un'applicazione web per un gioco di carte e stai cercando di determinare come realizzarla tutta in una volta. Questo approccio confonde anche i migliori programmatori, poiché gli studi hanno dimostrato che puoi conservare solo 7 informazioni prontamente disponibili nella tua mente in una volta. Cercare di destreggiarsi con più richiede un'intensa concentrazione e non puoi aspettarti di continuare così.

Piuttosto, prova a concentrarti maggiormente sulla scrittura di una libreria di giochi di carte come se qualcuno stesse per chiamare la tua libreria per giocare a carte. Sembra che tu abbia un inizio eccellente sul tuo modello. Va bene, ma è necessario creare Gamel'interfaccia tramite la quale i chiamanti possono usare mosse e così via.

Quindi mi aspetto che il gioco 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 procedi al passaggio 2.

Scrivi una classe separata il cui unico scopo è quello di ricevere richieste in arrivo, applicarle Gamee inviare l'output all'utente. Se vuoi convertire l' Gameoutput in JSON, lo fai al di fuori Gamedal momento che quello non è lo scopo di Game!

Per conservare queste informazioni, è possibile creare un'altra classe che fornisca un'interfaccia a MongoDB. Questa classe non avrebbe saputo dell'esistenza di Gamené avrebbe Gamesaputo dell'esistenza di questa classe.

In breve, concentrati sui singoli componenti e andrà tutto bene. Inizi a sbagliare quando cerchi di prendere in considerazione troppi aspetti quando scrivi il tuo programma. Come mi disse una volta un saggio professore, " Conosci e abbraccia il fatto che il primo programma che scrivi per un progetto verrà riscritto nella sua interezza entro la fine " .


A parte questo numero va da 3 a 9 a seconda della persona - posso fare 4 o 5 a seconda di quanto sono attento. Il solito test è guardare un mucchio di punti e capire quanti ne puoi percepire individualmente senza raggrupparli mentalmente - a 6, inizio ad raggrupparli automaticamente in 3 + 3, per esempio, e non riesco più a separarli facilmente .
Izkata,

@Izkata È interessante. Non sapevo che ci fosse un test per questo. Avete un link?
Neil

1
en.wikipedia.org/wiki/… è la fonte, credo.
AakashM

1

Dove dovrebbe andare tutta quella logica?

Inizia inserendolo nella tua Gameclasse.

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

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

Come devo mantenere lo stato in uno scenario server / client?

È impossibile rispondere senza sapere di più sulla configurazione. La serializzazione dell'oggetto Game e gli stati nel database ogni turno potrebbero fare il trucco.


Ecco un pezzo di accompagnamento su stato / FSM, in questo caso da un libro incentrato sui giochi: gameprogrammingpatterns.com/state.html
shmup
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.