arquitetura jogo e estratégia de design para um jogo multiplayer
-
03-07-2019 - |
Pergunta
Eu sou relativamente novo para desenvolvimento de jogos assim que eu decidi que queria criar um hobby do zero para experiência e entretenimento. O jogo específico é semelhante ao poker conhecida como Three Card Brag . O jogo é jogado no filme Jogos, Trapaças e Dois Canos Fumegantes .
Eu tenho lido em alguns dos tópicos sobre SO sobre o desenvolvimento do jogo, embora na maior parte esta questão . Isto tem ajudado a renovar a forma original que eu estava criando os objetos.
Um problema particular que estou tendo é a definição de estado do jogo. Minha abordagem inicial era tudo separado (por exemplo, pilhas de manutenção de chips dentro de uma classe Player
), mas depois de ler as respostas para o questão mencionei anteriormente, parece que todos os estados possíveis do jogo deve ser mantida dentro de um objeto GameState
. O que eu vim com é essencialmente esta:
abstract class CardGameState
{
protected List<Player> _Players;
protected Player _CurrentPlayer;
protected Dictionary<Player, int> _Chips;
protected Dictionary<Player, Hand> _CurrentHand;
protected Dictionary<Player, PlayerStatuses> _PlayerStatus; // PlayerStatuses.InHand, PlayerStatuses.Folded, PlayerStatuses.SittingOut, etc.
/* etc. */
onde cada CardGameState
é modificado por alguma ação:
public interface IAction
{
string Name { get; }
CardGameState Apply(CardGameState state);
bool IsLegal(CardGameState state);
}
Agora estou me sentindo muito fortemente que esta é derrotar o propósito de programação orientada a objetos, porque os dados relacionados especificamente ao jogador (neste caso, a sua stack, mão, eo status atual) não está encapsulado pelo objeto Player
.
Por outro lado, se um jogador fosse para aumentar a aposta, eu estaria criando um RaiseAction
que implementos IAction
, mas a interface IAction
só aceita o estado do jogo atual, que eu não acredito que seria ideal se o chip pilhas foram armazenados dentro da classe Player
.
Basicamente, a minha pergunta é: eu posso ter o melhor dos dois mundos de tal forma que eu possa ter uma representação exata do estado do jogo, mantendo simultaneamente todos os dados relacionados especificamente a um objeto dentro do estado do jogo dentro de seu determinado objeto ? p>
Solução
Em linha-jogos usando o -padrão de comando (seu IAction) é o padrão, e comprovada, maneira de fazê-lo. Não objeto Orientada no sentido do jogador, mas as ações são Orientada a Objetos, por isso, de um ponto de vista puramente teórico é um padrão de design sólido, eu acho. E em isso é prática como todos os jogos em linha bem sucedido que eu vi implementos, mas nota que os jogos de ação normalmente usa muito pequenas ações discretas / pacotes, até que praticamente torna-se um fluxo de tipos.
Editar:
Há muito tempo depois de eu responder isso, eu voltei aqui e percebi outra solução para este problema é implementar Jogadores do gamestate, plataformas, etc ... como derivada de um iState classe com um < strong> Aplicar (ação IAction) membro. Desta forma, objetos aplicar ações em si mesmos, em vez de ter a aplicação aplicar ações em objetos, isso iria mapear ações e estaduais para a visitante-padrão em vez de um padrão de comando. De qualquer solução vai funcionar, onde o visitante tem a sobrecarga maior e mais encapsulamento, enquanto o comando é a solução mais fácil, com menos de encapsulamento.
Outras dicas
Parece que você pode ser por amor do objeto-orient ...
-orientizing ObjetoParece clássico problema do bowling jogo de Bob Martin.
EDIT: -Summary-
É um longo ler, mas, basicamente, através de TDD e refatoração, uma aplicação de boliche pontuação passou de um grande cluster com muitas classes e polimorfismo de 20 ou 30 linhas elegantes de código. Por quê? Porque eles realmente não precisa estar lá em primeiro lugar