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

Foi útil?

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 Objeto

Parece 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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top