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
- 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.
architecture
Mohsen
fonte
fonte
Respostas:
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
Game
a 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:
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
Game
e enviar a saída de volta ao usuário. Se você deseja converter aGame
saída em JSON, faça isso fora,Game
pois esse não é o objetivoGame
!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
Game
e nemGame
saberia 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 " .
fonte
Comece colocando-o em sua
Game
classe.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.
É 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.
fonte