Quels modèles de conception peuvent être utilisés pour créer un système de règles / validation pour un jeu comme les échecs (ce n'est qu'un exemple simple, le jeu réel a besoin d'ensembles de règles plus difficiles)
J'ai lu plusieurs questions sur ce site et je n'ai trouvé ni réponse concluante ni réponse me pointant dans la bonne direction.
Ce système nécessiterait les éléments suivants:
- Chaque objet auquel des règles sont appliquées doit implémenter une interface spécifique avec une méthode qui est le point de départ de la validation
- La règle doit être appliquée en 2 étapes: tout d'abord, elle doit être validée (peut pionner A se déplacer vers le carré D4), si vrai puis exécuter la méthode A si faux puis exécuter la méthode B
- Chaque objet peut avoir plusieurs règles qui doivent être appliquées dans une séquence spécifique. Lorsque la règle 1 est terminée, la règle 2 devrait alors commencer à valider, etc.
- Chaque règle distincte (par exemple: ne peut se déplacer que d'un carré, ne peut se déplacer qu'en diagonale, etc.) doit être dans sa propre classe et doit être réutilisable et applicable aux objets qui ont besoin de règles.
- Notez que cela va être utilisé dans un jeu multijoueur sur le backend
- Notez que chaque règle a besoin de plusieurs objets pour tester sa validité, par exemple, normalement un pion peut se déplacer de 1 case, maintenant la prochaine case du plateau de jeu est remplie par un pion de votre adversaire. Résultat: votre pion ne peut pas bouger. Le pion doit inclure les autres positions de pions ou le plateau de jeu dans sa validation.
Un autre mot pour ces règles serait des limites de comportement.
game-design
design-patterns
Thomas
la source
la source
Réponses:
Considérez un jeu comme une séquence d' états , séparés par des mouvements . Chaque fois qu'un joueur fait un mouvement, un nouvel état est généré.
(C'est comme cette bande dessinée XKCD !)
Comment
Créez une classe
Move
, qui représente un coup effectué par un joueur . (Dans Reversi, une description suffisante est un ensemble de coordonnées du plateau où une pièce doit être placée. Aux échecs, une coordonnée d'origine et de destination est suffisante.)Créez une classe
GameState
qui représente l' état du jeu à tout moment . (Dans Reversi, une description suffisante serait le contenu du plateau et le tour de quel joueur. Dans les échecs, vous devez également savoir s'il est toujours possible pour chaque joueur de chiner à côté du roi ou du côté de la reine.)Maintenant, vous pouvez probablement imaginer
GameState
avoir uneisMoveLegal(Move)
méthode. Après tout, il contient toutes les informations dont il a besoin pour prendre cette décision.Pourquoi
Cette conception isole proprement la logique des règles, réduisant les dépendances entre composants.
Cela rend également l'IA facile! Vous pouvez générer trivialement tous les mouvements possibles à partir de a
GameState
, vérifier s'ils sont légaux, générer plus deGameState
s à partir de ceux-ci et essentiellement construire un arbre que vous pouvez utiliser pour minimax , peut-être avec un élagage alpha-bêta .la source