Conceptuellement, comment créer un moteur de règles / contraintes (pas graphiques / physiques) pour un jeu

16

Je veux créer un jeu simple similaire aux livres à choisir soi-même. Le joueur est présenté avec un texte narratif et choisit son action dans une liste de possibilités. Ceci, à son tour, conduit à un nouveau texte narratif, à l'infini. Le seul hic, c'est qu'en fonction de certaines décisions antérieures, la liste des possibilités peut différer.

À première vue, cela ressemble à une charge d'instructions if-else, ce qui implique qu'un moteur de règles serait en place. Mais cela ressemble aussi à une machine à états finis pour moi.

Je suis sur le point d'écrire ceci en Java ou peut-être Groovy. Je suis actuellement plus intéressé par les questions conceptuelles, c'est-à-dire comment cela devrait-il être fait à un large niveau (comment les gens mettent-ils en œuvre les échecs ou les jeux de cartes, de toute façon?), Mais quelques conseils sur une bibliothèque spécifique sont également les bienvenus.

Évidemment, le "moteur de jeu" du titre ne fait pas référence à la détection de collision ou à d'autres mécanismes physiques / graphiques, mais à la logique qui décide des options qu'un joueur a données à la situation et à son état actuel.

kaqqao
la source
1
Cette question est-elle mieux adaptée à gamedev ?
Uwe Plonus
2
@Uwe Plonus Considéré cela, mais je ne le crois pas. Ma question est purement conceptuelle et n'a rien à voir avec les bibliothèques graphiques, la 3D et d'autres sujets qui dominent gamedev. À bien y penser, cette question n'a pas grand-chose à voir avec les jeux en soi ... mais je ne sais pas comment mieux l'intituler.
kaqqao
Les échecs et les jeux de cartes sont très différents des aventures.
Deer Hunter
1
Votre question semble également couvrir le développement de systèmes experts. Lorsque la gamme de questions de suivi et de diagnostics possibles est limitée avec chaque réponse sélectionnée. Peut-être que c'est ce qu'il faut rechercher pour trouver un peu plus "d'entrée"?
Marjan Venema

Réponses:

7

Sur la base de ce que vous avez dit dans les commentaires, voici comment je le gérerais:

Implémentez l'histoire comme une machine à états finis, avec une touche. Chaque État est une page de l'histoire, et chaque transition est un lien d'une page à l'autre. Mais chaque transition a également des conditions . Les conditions peuvent être nulles, auquel cas la transition apparaît toujours comme une option disponible, mais sinon, elles doivent être évaluées lorsque la page s'affiche, et si l'évaluation revient False, la transition ne s'affiche pas.

Il existe deux manières de base de mettre en œuvre les conditions. La première consiste à mettre en place un moteur de script à part entière dans le jeu, puis la condition ressemble return player.inventory.contains(GUN). Ceci est initialement plus compliqué à configurer, mais permet des scripts plus avancés.

La seconde consiste à coder en dur les conditions possibles dans une sorte d'objet. Il peut avoir un RequiredItemchamp, et si ce champ a une valeur, vous vérifiez si la condition est remplie. Ce système est plus simple à mettre en place. Cela limite ce que vous pouvez faire beaucoup plus que le script ne le ferait, mais si vous n'avez pas besoin de la flexibilité qu'un moteur de script fournirait, c'est probablement beaucoup plus facile à utiliser.

Mason Wheeler
la source
1
Nous utilisons en fait quelque chose comme ça dans notre application Web complètement non liée au jeu. L'utilisateur a un certain nombre d'états, et un nombre illimité d'événements peuvent être déclenchés en code, dont beaucoup sont prédéfinis pour faire passer les utilisateurs d'un État à un autre. Je pense que pour les cas décrits de la question, avoir une sorte de langage de script rudimentaire (ou un langage complet comme Python / Lua) pour définir des conditions / déclencheurs serait également utile.
Katana314
J'aime beaucoup cette approche. Merci! Va enquêter plus loin. Avez-vous des chances de connaître une bibliothèque utile?
kaqqao
@veggen: Non, désolé. Pas un développeur Java.
Mason Wheeler
@MasonWheeler: Que pensez-vous de Lazare ?
Robert Harvey
1
Étant donné que cette question a atteint la liste des questions populaires aujourd'hui, je signalerai que je l'ai mise en œuvre exactement comme je l'avais dit dans le commentaire précédent. J'ai fait une belle DSL et j'ai implémenté la logique FSM moi-même car c'est vraiment, vraiment simple. Je ne pourrais pas être plus satisfait de la solution. @MasonWheeler Merci encore pour un excellent conseil!
kaqqao
5

Je pense que la réponse est dans le titre: vous avez besoin d'un moteur de règles. Si vous prévoyez d'écrire votre application avec Java, vous pouvez bien sûr écrire la vôtre comme l'a suggéré Gilbert Le Blanc, OU vous voudrez peut-être jeter un œil à Drools , un moteur de règles.

quelles options un joueur a-t-il données à la situation et à son état actuel

Avec Drools, ou tout autre moteur de règles en fait, vous pouvez définir une situation paramétrée qui génère une liste d'actions possibles. Vous pouvez encoder des règles simples comme suit:

  • le joueur est à la page X:

    • choix 1: titre: "aller à gauche", action: "page45"
    • choix 2: titre: "aller à droite", action: "page56"
    • SI le joueur a le Bâton de Boule de Feu ALORS choix 3: titre "lancer la boule de feu", action: "page32"
    • SI le joueur a une compétence de perception de 10 ALORS choix 4: titre "vérifier les écrits sur le mur", action: "page67"

Ce qui est intéressant avec Drools, c'est que vous pouvez encoder toutes vos règles dans un fichier Excel, puis au début du jeu, faire lire à Drools ce fichier. Après que tout soit en mémoire, il vous suffit de vous soucier de votre interface utilisateur.

Voici quelques ressources pour vous aider à démarrer avec Drools:

Jalayn
la source
En général - recherchez l'algorithme Rete implémenté dans n'importe quel moteur de règles de votre choix.
Deer Hunter
Ouais, Drools était l'une des choses avec lesquelles j'ai commencé. Je dois enquêter un peu plus pour voir si je peux évaluer un seul ensemble de règles à la fois, car c'est assez important dans mon cas. Merci!
kaqqao
@veggen heureux de vous aider!
Jalayn
2

Conceptuellement, votre jeu est simple. En psudeocode, cela ressemblerait à quelque chose comme ceci:

while not at end of adventure story
    display text
    get response

Maintenant, enchaîner tout le texte ensemble pour qu'il passe d'une action à l'autre est la partie difficile. Vous pouvez utiliser une base de données relationnelle. Vous pourriez utiliser un arbre.

Il est un peu difficile d'être plus précis sans savoir quel langage informatique vous souhaitez utiliser. Puisque vous avez mentionné Java, je pencherais davantage pour une structure arborescente.

Créez une classe de réponses contenant une réponse et un lien vers une classe de texte.

Créez une classe de texte contenant le texte d'aventure et une liste de réponses comme instances de la classe de réponse.

Modifié pour répondre au commentaire:

Vous ne calculez rien sur la base de ce modèle. En utilisant votre exemple, l'arborescence ressemblerait à quelque chose comme ceci, où T est le texte et A est un choix d'action:

T You stumble on a dead police officer
    A Take the gun
    T You hear footsteps
      A Run away
      A Hide and see who comes
    A Don't touch anything
    T You hear footsteps
      A Run away

Oui, il y a une certaine duplication du texte, mais en suivant la chaîne, les actions futures peuvent prendre en compte les décisions passées. C'est un énorme arbre de décision.

Gilbert Le Blanc
la source
Mon problème est de calculer les réponses possibles. Les décisions passées influencent les options actuelles. Donc, si un joueur présenté avec "vous tombez sur un officier de police mort" choisit "voler son pistolet" au lieu de "ne toucher à rien", il a plus tard la possibilité de "tirer sur le poursuivant" en plus de "fuir comme fou ", ce qui aurait été la seule option s’ils n’avaient pas auparavant acquis d’arme.
kaqqao
@veggen: Voir la réponse mise à jour.
Gilbert Le Blanc