Quais padrões de design podem ser usados para criar um sistema de regras / validação para um jogo como o xadrez (este é apenas um exemplo simples, o jogo real precisa de conjuntos de regras mais difíceis)
Eu li várias perguntas neste site e não encontrei uma resposta conclusiva nem uma resposta que me aponte na direção certa.
Este sistema exigiria o seguinte:
- Todo objeto que possui regras aplicadas deve implementar uma interface específica com um método que seja o ponto de partida para a validação.
- A regra deve ser aplicada em 2 etapas: primeiro, ela precisa ser validada (pode penhorar A passar para o quadrado D4); se for verdade, execute o método A se for falso; em seguida, execute o método B
- Todo objeto pode ter várias regras que precisam ser aplicadas em uma sequência específica. Quando a regra 1 é concluída, a regra 2 deve começar a validar etc.
- Cada regra separada (por exemplo: só pode mover 1 quadrado, somente na diagonal etc) deve estar em sua própria classe e deve ser reutilizável e aplicável aos objetos que precisam de regras.
- Observe que isso será usado em um jogo multiplayer no back-end
- Observe que todas as regras precisam de vários objetos para testar sua validade; por exemplo, normalmente um peão pode se mover 1 quadrado, agora o próximo quadrado no tabuleiro é preenchido por um peão do seu oponente. Resultado: seu peão não pode se mover. O peão deve incluir as outras posições dos peões ou o tabuleiro de jogo em sua validação.
Outra palavra para essas regras seria limites comportamentais.
game-design
design-patterns
Thomas
fonte
fonte
Respostas:
Pense em um jogo como uma sequência de estados , separados por movimentos . Toda vez que um jogador faz um movimento, um novo estado é gerado.
(É como essa história em quadrinhos do XKCD !)
Quão
Crie uma classe
Move
, que represente uma jogada feita por um jogador . (Em Reversi, uma descrição suficiente é um conjunto de coordenadas do tabuleiro onde uma peça deve ser colocada. No xadrez, uma coordenada de origem e destino é suficiente.)Crie uma classe
GameState
, que represente o estado do jogo a qualquer momento . (Em Reversi, uma descrição suficiente seria o conteúdo do tabuleiro e qual é a vez do jogador. No xadrez, você adicionalmente precisará armazenar se ainda é possível para cada jogador dominar o rei ou o lado da rainha.)Agora, você provavelmente pode imaginar
GameState
ter umisMoveLegal(Move)
método. Afinal, ele contém todas as informações necessárias para tomar essa decisão.Por quê
Esse design isola de maneira limpa a lógica da regra, reduzindo as dependências entre componentes.
Também facilita a IA! Você pode gerar trivialmente todos os movimentos possíveis a partir de a
GameState
, verificar se eles são legais, gerar maisGameState
s a partir deles e basicamente construir uma árvore que você possa usar para o minimax , talvez com a poda alfa-beta .fonte