¿Cómo diseño un juego de cartas?

10

No puedo encontrar una buena arquitectura para mi juego de cartas. Necesito ayuda para comprender cómo se diseñan los juegos.

Primero, describiré las reglas del juego.

Reglas del juego

Preparar
  • Hay cuatro jugadores, cada uno de los cuales forma un equipo.
  • Cada jugador recibe 12 cartas barajadas
  • Hay 4 cartas ciegas en la mesa (river)
  • El orden de los jugadores es así

ingrese la descripción de la imagen aquí

Apuesta
  • Cada jugador puede pasar o seleccionar un número mayor que la apuesta actual entre 100 y 160
  • Las apuestas comienzan desde el primer jugador y circulan hasta que un equipo pase
  • Una vez que un jugador pasa, ya no puede apostar
  • El equipo que gana la ronda de apuestas debe al menos acumular puntos iguales a su apuesta para ganar el juego.
  • El equipo que perdió la ronda de apuestas no debe permitir que su equipo logre su objetivo.

  • Si el equipo que ganó la ronda de apuestas obtiene todos los puntos, el otro equipo obtendrá puntos negativos iguales a su apuesta

  • Si el equipo que perdió la ronda de apuestas recoge todos los puntos, el otro equipo obtendrá el doble de puntos negativos.

Flujo del juego y puntos de recolección

  • El jugador que ganó la ronda de apuestas ( el rey ) obtiene cuatro cartas restantes en la mesa.
  • Entonces él / ella puede guardar un juego de cuatro cartas en el banco de cartas de su equipo sin siquiera jugarlas.
  • El rey elegirá un traje como el traje de la regla y les hará saber a los demás que
  • King comienza el juego poniendo una carta de su mano sobre la mesa. Cada otro jugador debe jugar en este orden
    • si tienen el mismo palo de esa carta en la mano, tienen que jugar una de esas cartas
    • si no lo tienen, pueden jugar cualquier otro palo
  • Después de que todos los demás jugadores hayan jugado sus manos, el ganador de la ronda será:
    • El que tiene la carta más alta si todas las cartas son iguales
    • El que tiene la carta más alta de "gobernante" si hay alguna
  • El ganador de la ronda recogerá las cartas y las pondrá en su banco.
  • El jugador que ganó la ronda anterior comenzará la siguiente.
  • Esto continuará hasta que la mano de todos esté vacía

Puntos de conteo

  • Ganar cada ronda tiene 5 puntos. Esto significa que cada 4 cartas tiene al menos 5 puntos.
  • Tener Ace, 10 o 5 en el banco cada uno suma 5 puntos

Mi diseño

Clases

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

Mi problema

Ahora que he definido todas estas clases, no sé cómo vincular estas definiciones a una base de datos (como Mongo) y controlar el flujo del juego.

  • ¿A dónde debería ir toda esa lógica?
  • ¿Cómo debo mantener el estado en un escenario servidor / cliente?

Nota:

Estoy usando Dart para programar esto, pero no necesariamente quiero que las respuestas se escriban en Dart.

Mohsen
fuente
En caso de que alguien vea su código y lo use como punto de partida, tenga en cuenta que debe elegir A o 1 en los rangos, pero no incluya ambos.
Ben

Respuestas:

10

Estás cometiendo un error clásico aquí. Alguien te dijo que hicieras una aplicación web para un juego de cartas, y estás tratando de determinar cómo hacerlo todo de una vez. Este enfoque confunde incluso a los mejores programadores, ya que los estudios han demostrado que solo puede retener 7 piezas de información fácilmente disponibles en su mente al mismo tiempo. Intentar hacer malabarismos con más requiere una concentración intensa y no puedes esperar seguir así.

Más bien, trate de concentrarse más en escribir una biblioteca de juegos de cartas como si alguien llamara a su biblioteca para jugar su juego de cartas. Parece que tienes un excelente comienzo en tu modelo. Eso es bueno, pero debe crear Gamela interfaz mediante la cual las personas que llaman pueden usar movimientos, etc.

Así que esperaría que Game tuviera varios métodos nuevos como:

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 resumen, todo lo que necesitas saber para ejecutar el juego, puedes hacerlo usando tu objeto Game. Solo una vez que tenga esto , proceda al paso 2.

Escriba una clase separada cuyo único propósito sea recibir las solicitudes entrantes, aplicarlas Gamey enviar la salida al usuario. Si desea convertir la Gamesalida a JSON, ¡hágalo fuera Gameya que ese no es el propósito Game!

Para conservar esta información, puede crear otra clase que proporcione una interfaz para MongoDB. Esta clase no sabría de la existencia de Gamey tampoco Gamesabría de la existencia de esta clase.

En resumen, concéntrese en los componentes individuales y estará bien. Empiezas a equivocarte cuando intentas tener en cuenta demasiados aspectos al escribir tu programa. Como un sabio profesor me dijo una vez: " Conozca y acepte el hecho de que el primer programa que escriba para un proyecto será reescrito en su totalidad al final " .

Neil
fuente
Además, ese número oscila entre 3 y 9, dependiendo de la persona; puedo hacer 4 o 5 dependiendo de qué tan alerta esté. La prueba habitual es observar un montón de puntos y calcular cuántos puede percibir individualmente sin agruparlos mentalmente; a los 6, empiezo a agruparlos automáticamente en 3 + 3, por ejemplo, y no puedo separarlos fácilmente nuevamente .
Izkata
@Izkata Eso es interesante. No sabía que había una prueba para esto. ¿Tienes un enlace?
Neil
1
en.wikipedia.org/wiki/… es la fuente, creo.
AakashM
1

¿A dónde debería ir toda esa lógica?

Comienza poniéndolo en tu Gameclase.

Este es un juego basado en reglas con un número limitado de estados. Lo modelaría como una máquina de estado . El patrón de estado te ayudará inmensamente.

Eventualmente, querrás extraer ese FSM en clases separadas, pero no te preocupes por eso por ahora.

¿Cómo debo mantener el estado en un escenario servidor / cliente?

Esto es imposible de responder sin saber más sobre su configuración. Serializar el objeto y los estados del juego en la base de datos en cada turno puede ser útil.

Martin Wickman
fuente
Aquí hay una pieza adjunta sobre estado / FSM, en este caso de un libro centrado en juegos: gameprogrammingpatterns.com/state.html
shmup