Comment concevoir un jeu de cartes?

10

Je ne peux pas proposer une bonne architecture pour mon jeu de cartes. J'ai besoin d'aide pour comprendre comment les jeux sont généralement conçus.

Tout d'abord, je décrirai les règles du jeu.

Regles du jeu

Installer
  • Il y a quatre joueurs, chacun deux joueurs forment une équipe.
  • Chaque joueur reçoit 12 cartes mélangées
  • Il y a 4 cartes aveugles sur la table (rivière)
  • L'ordre des joueurs est comme ça

entrez la description de l'image ici

Pari
  • Chaque joueur peut passer ou sélectionner un nombre supérieur au pari actuel entre 100 et 160
  • Les paris commencent à partir du premier joueur et tournent jusqu'à ce qu'une équipe passe
  • Une fois qu'un joueur passe, il ne peut plus parier
  • L'équipe qui remporte le tour d'enchères doit au moins collecter des points égaux à son pari afin de gagner la partie
  • L'équipe qui a perdu le tour d'enchères ne doit pas permettre à son équipe d'atteindre son objectif

  • Si l'équipe qui a gagné le tour d'enchères obtient tous les points, l'autre équipe recevra des points négatifs égaux à sa mise

  • si l'équipe qui a perdu le tour d'enchères collecte tous les points, l'autre équipe obtiendra le double de points négatifs

Flux de jeu et points de collecte

  • Le joueur qui a gagné le tour d'enchères ( le roi ) reçoit quatre cartes restantes sur la table.
  • Ensuite, il / elle peut enregistrer un jeu de quatre cartes dans leur banque de cartes d'équipe sans même les jouer.
  • Le roi choisira un costume comme costume de règle et fera savoir aux autres que
  • King commence la partie en mettant une carte de sa main sur la table. Chaque autre joueur doit jouer dans cet ordre
    • s'ils ont la même couleur de cette carte en main, ils doivent jouer une de ces cartes
    • s'ils ne l'ont pas, ils peuvent jouer n'importe quel autre costume
  • Après que tous les autres joueurs auront joué leurs mains, le vainqueur du tour sera:
    • Celui qui a la carte la plus élevée si toutes les cartes sont identiques
    • Celui qui a la plus haute carte "souverain" s'il y en a
  • Le gagnant du tour récupérera les cartes et les déposera dans sa banque
  • Le joueur qui a gagné le tour précédent commencera le tour suivant
  • Cela continuera jusqu'à ce que la main de tout le monde soit vide

Points de comptage

  • Gagner chaque tour a 5 points. Cela signifie que toutes les 4 cartes ont au moins 5 points.
  • Avoir Ace, 10 ou 5 en banque ajoute 5 points

Ma conception

Des classes

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

Mon problème

Maintenant que j'ai défini toutes ces classes, je ne sais pas comment lier ces définitions à une base de données (comme Mongo) et contrôler le déroulement du jeu.

  • Où devrait aller toute cette logique?
  • Comment dois-je conserver l'état dans un scénario serveur / client?

Remarque:

J'utilise Dart pour programmer cela, mais je ne veux pas nécessairement que les réponses soient écrites en Dart.

Mohsen
la source
Si quelqu'un regarde votre code et l'utilise comme point de départ, notez que vous devez choisir A ou 1 dans les classements, mais n'incluez pas les deux.
Ben

Réponses:

10

Vous faites une erreur classique ici. Quelqu'un vous a dit de créer une application Web pour un jeu de cartes, et vous essayez de déterminer comment faire tout cela à la fois. Cette approche confond même les meilleurs programmeurs, car des études ont montré que vous ne pouvez conserver que 7 éléments d'information facilement disponibles dans votre esprit à la fois. Essayer de jongler avec plus nécessite une concentration intense et vous ne pouvez pas vous attendre à continuer.

Essayez plutôt de vous concentrer davantage sur l'écriture d'une bibliothèque de jeux de cartes comme si quelqu'un allait appeler votre bibliothèque pour jouer à votre jeu de cartes. Vous semblez avoir un excellent départ sur votre modèle. C'est bien, mais vous devez créer Gamel'interface par laquelle les appelants peuvent utiliser make move et ainsi de suite.

Je m'attends donc à ce que Game ait plusieurs nouvelles méthodes comme:

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

En bref, tout ce que vous devez savoir pour exécuter le jeu, vous pouvez le faire en utilisant votre objet Game. Ce n'est qu'une fois que vous avez cela que vous passez à l'étape 2.

Écrivez une classe distincte dont le seul but est de recevoir les demandes entrantes, de les appliquer Gameet de renvoyer la sortie à l'utilisateur. Si vous voulez convertir la Gamesortie en JSON, vous le faites en dehors de Gamecar ce n'est pas le but de Game!

Afin de conserver ces informations, vous pouvez créer une autre classe qui fournit une interface à MongoDB. Cette classe ne connaîtrait pas l'existence de Gameet ne connaîtrait Gamepas non plus l'existence de cette classe.

En bref, concentrez-vous sur les composants individuels et tout ira bien. Vous commencez à vous tromper lorsque vous essayez de prendre en compte trop d'aspects lors de l'écriture de votre programme. Comme un professeur avisé me l'a dit un jour: " Sachez et acceptez le fait que le premier programme que vous écrivez pour un projet sera réécrit dans son intégralité à la fin. "

Neil
la source
Mis à part, ce nombre est compris entre 3 et 9 selon la personne - je peux en faire 4 ou 5 selon mon niveau d'alerte. Le test habituel consiste à regarder un tas de points et à comprendre combien vous pouvez en percevoir individuellement sans les grouper mentalement - à 6, je commence à les regrouper automatiquement en 3 + 3, par exemple, et je ne peux pas les séparer facilement à nouveau .
Izkata
@Izkata C'est intéressant. Je ne savais pas qu'il y avait un test pour cela. avez vous un lien?
Neil
1
en.wikipedia.org/wiki/… est la source, je crois.
AakashM
1

Où devrait aller toute cette logique?

Commencez par le mettre dans votre Gameclasse.

Il s'agit d'un jeu basé sur des règles avec un nombre limité d'états. Je le modéliserais comme une machine d'état . Le modèle d'état vous aidera énormément.

Finalement, vous voudrez extraire ce FSM dans des classes distinctes, mais ne vous en faites pas pour l'instant.

Comment dois-je conserver l'état dans un scénario serveur / client?

Il est impossible de répondre sans en savoir plus sur votre configuration. La sérialisation de votre objet Game et de ses états dans la base de données à chaque tour peut faire l'affaire.

Martin Wickman
la source
Voici une pièce d'accompagnement sur l'état / FSM, dans ce cas d'un livre axé sur les jeux: gameprogrammingpatterns.com/state.html
shmup