Padrão de design de regra / validação

8

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.

Thomas
fonte

Respostas:

3

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.

insira a descrição da imagem aqui
(É 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 GameStateter um isMoveLegal(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 mais GameStates a partir deles e basicamente construir uma árvore que você possa usar para o minimax , talvez com a poda alfa-beta .

Anko
fonte