Modello di progettazione di regole / convalida


8

Quali schemi di progettazione possono essere utilizzati per creare un sistema di regole / convalida per un gioco come gli scacchi (questo è solo un semplice esempio, il gioco reale richiede serie di regole più difficili)

Ho letto diverse domande su questo sito e non ho trovato una risposta definitiva né una risposta che mi indichi nella giusta direzione.

Questo sistema richiederebbe quanto segue:

  • Ogni oggetto a cui sono applicate regole deve implementare un'interfaccia specifica con un metodo che è il punto di partenza per la convalida
  • La regola deve essere applicata in 2 passaggi: in primo luogo, deve essere convalidata (può eseguire il pedone A per passare al quadrato D4), se vero quindi eseguire il metodo A se falso quindi eseguire il metodo B
  • Ogni oggetto può avere più regole che devono essere applicate in una sequenza specifica. Al termine della regola 1, la regola 2 dovrebbe quindi iniziare a convalidare ecc
  • Ogni regola separata (ad esempio: può muovere solo di 1 quadrato, può muoversi solo in diagonale ecc.) Deve essere nella sua classe e deve essere riutilizzabile e applicabile agli oggetti che necessitano di regole.
  • Nota che questo verrà usato in una partita multiplayer nel backend
  • Nota che ogni regola ha bisogno di più oggetti per verificarne la validità, ad esempio, normalmente una pedina può muovere di 1 quadrato, ora il riquadro successivo sul tabellone è riempito da un pedone del tuo avversario. Risultato: la tua pedina non può muoversi. Il pedone dovrebbe includere le altre posizioni dei pedoni o il tabellone nella sua validazione.

Un'altra parola per queste regole sarebbe limiti comportamentali.


Risposte:


3

Pensa a un gioco come a una sequenza di stati , separati da mosse . Ogni volta che un giocatore fa una mossa, viene generato un nuovo stato.

inserisci qui la descrizione dell'immagine
(È come questo fumetto XKCD !)

Come

Crea una classe Move, che rappresenta una mossa fatta da un giocatore . (In Reversi, una descrizione sufficiente è un insieme di coordinate della scacchiera in cui deve essere posizionato un pezzo. In Scacchi, sono sufficienti le coordinate di origine e destinazione.)

Crea una classe GameState, che rappresenta lo stato del gioco in qualsiasi momento . (In Reversi, una descrizione sufficiente sarebbe il contenuto della scacchiera e quale sia il turno del giocatore. A Scacchi, dovresti anche memorizzare se è ancora possibile per ogni giocatore dominare il lato re o il lato regina).

Ora, probabilmente puoi immaginare di GameStateavere un isMoveLegal(Move)metodo. Dopotutto, contiene tutte le informazioni necessarie per prendere quella decisione.

Perché

Questo design isola in modo pulito la logica delle regole, riducendo le dipendenze tra i componenti.

Inoltre semplifica l'IA! Puoi banalmente generare tutte le mosse possibili da a GameState, controllare se sono legali, generare più GameStates da quelle e fondamentalmente costruire un albero che puoi usare per minimax , magari con potatura alfa-beta .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.