Como faço para criar um jogo de cartas?

10

Não consigo criar uma boa arquitetura para o meu jogo de cartas. Preciso de ajuda para entender como os jogos geralmente são projetados.

Primeiro, descreverei as regras do jogo.

Regras do jogo

Configuração
  • Existem quatro jogadores, cada dois jogadores formam uma equipe.
  • Cada jogador recebe 12 cartas embaralhadas
  • Existem 4 cartas cegas na mesa (rio)
  • A ordem dos jogadores é assim

insira a descrição da imagem aqui

Apostas
  • Cada jogador pode passar ou selecionar um número maior que a aposta atual entre 100 e 160
  • As apostas começam no primeiro jogador e circulam até que um time passe
  • Depois que um jogador passa, ele não pode mais apostar
  • A equipe que vence a rodada de apostas deve coletar pelo menos pontos iguais à sua aposta para ganhar o jogo
  • A equipe que perdeu a rodada de apostas não deve permitir que a equipe alcance seu objetivo

  • Se a equipe que venceu a rodada de apostas obtiver todos os pontos, a outra equipe receberá pontos negativos iguais à sua aposta

  • se a equipe que perdeu a rodada de apostas acumular todos os pontos, a outra equipe receberá o dobro de pontos negativos

Fluxo do jogo e pontos de coleta

  • O jogador que venceu a rodada de apostas ( o rei ) recebe quatro cartas restantes na mesa.
  • Depois, ele / ela pode salvar um conjunto de quatro cartas no banco de cartas de sua equipe, mesmo sem jogá-las.
  • O rei escolherá um naipe como o governante e informará aos outros que
  • King inicia o jogo colocando uma carta da mão na mesa. Cada outro jogador deve jogar nesta ordem
    • se eles têm o mesmo naipe dessa carta na mão, precisam jogar uma dessas cartas
    • se não tiverem, podem jogar qualquer outro naipe
  • Após todos os outros jogadores terem jogado suas mãos, o vencedor da rodada será:
    • Aquele que tiver a carta mais alta, se todas as cartas forem iguais
    • Aquele que tiver a carta mais alta de "governante", se houver
  • O vencedor da rodada irá coletar cartões e colocá-los em seu banco
  • O jogador que venceu a rodada anterior começará a próxima rodada
  • Isso continuará até que a mão de todos esteja vazia

Contando pontos

  • Ganhar cada rodada tem 5 pontos. Isso significa que cada 4 cartas tem pelo menos 5 pontos.
  • Ter Ace, 10 ou 5 no banco, acrescenta 5 pontos

Meu design

Aulas

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

Meu problema

Agora que defini todas essas classes, não sei como vincular essas definições a um banco de dados (como o Mongo) e controlar o fluxo do jogo.

  • Para onde toda essa lógica deve ir?
  • Como devo manter o estado em um cenário de servidor / cliente?

Nota:

Estou usando o Dart para programar isso, mas não preciso que as respostas sejam escritas no Dart.

Mohsen
fonte
Caso alguém esteja olhando seu código e usando-o como ponto de partida, observe que você deve escolher A ou 1 nas fileiras, mas não inclui ambos.
Ben

Respostas:

10

Você está cometendo um erro clássico aqui. Alguém lhe disse para fazer um aplicativo da web para um jogo de cartas, e você está tentando determinar como fazer tudo isso de uma vez. Essa abordagem confunde até os melhores programadores, já que estudos demonstraram que você só pode reter 7 informações prontamente disponíveis em sua mente ao mesmo tempo. Tentar fazer malabarismos com mais exige concentração intensa e você não pode esperar continuar assim.

Em vez disso, tente se concentrar mais em escrever uma biblioteca de jogos de cartas como se alguém ligasse para sua biblioteca para jogar seu jogo de cartas. Você parece ter um excelente começo em seu modelo. Isso é bom, mas você precisa criar Gamea interface pela qual os chamadores podem usar os movimentos e assim por diante.

Então, eu esperaria que o Game tivesse vários métodos novos, 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

Em resumo, tudo o que você precisa saber para executar o jogo, você pode fazer isso usando seu objeto Game. Somente quando você tiver isso , prossiga para a etapa 2.

Escreva uma classe separada cujo único objetivo seja receber solicitações de entrada, aplicá-las Gamee enviar a saída de volta ao usuário. Se você deseja converter a Gamesaída em JSON, faça isso fora, Gamepois esse não é o objetivo Game!

Para manter essas informações, você pode criar outra classe que fornece uma interface para o MongoDB. Esta classe não saberia da existência de Gamee nem Gamesaberia da existência dessa classe.

Em resumo, concentre-se nos componentes individuais e você ficará bem. Você começa a dar errado quando tenta levar muitos aspectos em consideração ao escrever seu programa. Como um professor sábio me disse uma vez: " Conheça e aceite o fato de que o primeiro programa que você escreve para um projeto será reescrito na íntegra até o final " .

Neil
fonte
Além disso, esse número varia de 3 a 9, dependendo da pessoa - eu posso fazer 4 ou 5, dependendo de como estou alerta. O teste usual é observar vários pontos e descobrir quantos você pode perceber individualmente sem agrupá-los mentalmente - aos 6, começo a agrupá-los automaticamente em 3 + 3, por exemplo, e não consigo separá-los facilmente novamente .
31413 Izkata
@ Izkata Isso é interessante. Eu não sabia que havia um teste para isso. Você tem um link?
Neil
1
en.wikipedia.org/wiki/… é a fonte, acredito.
AakashM
1

Para onde toda essa lógica deve ir?

Comece colocando-o em sua Gameclasse.

Este é um jogo baseado em regras com um número limitado de estados. Eu o modelaria como uma máquina de estado . O padrão de estado o ajudará imensamente.

Eventualmente, você desejará extrair esse FSM em classes separadas, mas não se preocupe com isso por enquanto.

Como devo manter o estado em um cenário de servidor / cliente?

É impossível responder sem saber mais sobre sua configuração. Serializar seu objeto e estados do jogo para o banco de dados a cada turno pode ajudar.

Martin Wickman
fonte
Aqui está uma peça que acompanha sobre o estado / FSM, neste caso de um livro focado em jogos: gameprogrammingpatterns.com/state.html
shmup