Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • World
  • Users
  • Groups
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse

NodeBB

  1. Home
  2. Programmation
  3. Développement de logiciels
  4. C
  5. IA #2 - le pnj : un automate à états finis

IA #2 - le pnj : un automate à états finis

Scheduled Pinned Locked Moved C
4 Posts 4 Posters 4.2k Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • daemondragonD
    daemondragonD
    daemondragon
    wrote on last edited by
    #1

    <p>Bonjour à tous !<br/><br/>
    En regardant le titre, vous avez sans doute penser : "kesako ?"<br/>
    Et bah c'est très simple : un automate, c'est une machine qui fait ce qu'on lui dit,<br/>
    et pourquoi a états finis ?</p>
    <p>C'est parce que cet automate peut avoir plusieurs états différents, mais il ne<br/>
    peut pas prendre les états que l'on n'a pas coder pour lui. Il ne peut aussi</p>
    <p>prendre qu'un seul état à la fois.</p>
    <p> </p>
    <p>Les automate à état fini sont très utilisés dans les jeux vidéos car ils sont<br/>
    très simples à mettre en place et à débuggés. Le majeur inconvénients, c'est<br/>
    qu'il sont prédictible, ce qui peut briser l'illusion qu'un véritable joueur,<br/>
    est devant le joueur. Pour éviter la prédictibilité, une des solutions possibles<br/>
    est d'augmenter le nombre d'états, ce qui permet plus de variations dans le pnj<br/><br/>
    Concrètement, prenons exemple sur un soldat dans un jeu qui protège un village par exemple :<br/>
    On peut lui mettre deux états différents :<br/>
    État 1 : patrouille<br/>
    État 2 : attaque<br/><br/>
    Il faut maintenant dire ce qu'il faut pour changer d'état (c'est mieux non ?)<br/>
    Par exemple, pour aller de l'état 1 à l'état 2, il faut que le soldat ai vu un intrus<br/>
    et de l'état 2 au 1, il faut que le garde ai tuer l'intrus.<br/><br/>
    Pour reprendre l'exemple du soldats, on peut créer d'autre états :<br/><br/>
    État 3 : suivit d'un intrus qui veut s'enfuir.<br/>
    État 4 : fuite car l'intrus est trop fort.<br/>
    État 5 : va dormir (il a le droit de dormir non ?)<br/><br/>
    Bref vous l'avez compris, plus il y a d'états, plus le pnj sera réaliste.<br/><br/>
    Et maintenant le code :<br/>
     </p>
    <pre class="ipsCode prettyprint">
    /*
    la structure qui va servir pour votre pnj
    */
    typedef struct t_perso t_perso;
    struct t_perso
    {
    char etat;
    char type;
    t_info info;
    }
    </pre>
    <p>
    l'état correspond a l'état actuel du pnj. par exemple, pour le soldat,<br/>
    si l’état est égal a 1, alors le soldat patrouille, etc...<br/>
    le type correspond au type de pnj que vous avez.</p>
    <p>et la structure t_info, contient tout ce que le pnj a besoin de savoir pour changer<br/>
    d'état. (il a besoin de savoir si un ennemi est proche de lui etc...)<br/>
     </p>
    <pre class="ipsCode prettyprint">

    void change_etat(t_perso pnj)
    {
    /

    Je suppose que toutes les infos utiles sont dans la structure t_perso

    touts les mot en majuscules sont soit des define, soit des énumérations;
    faites ce qu'il vous plaît le plus
    */
    
    if(pnj-&gt;etat == PATROUILLE)
    {
        if(test_attaque(pnj))
        {
            pnj-&gt;etat = ATTAQUE;
        }
        else if(test_sommeil(pnj))
        {
            pnj-&gt;etat = DODO;
        }
    }
    if(pnj-&gt;etat == ATTAQUE)
    {
        if(test_intrus_mort(pnj))
        {
            pnj-&gt;etat = PATROUILLE;
        }
        else if(test_intrus_trop_fort(pnj))
        {
            pnj-&gt;etat = FUITE;
        }    
    }
    if(pnj-&gt;etat == DODO)
    {
        if(test_sommeil_fini(pnj))
        {
            pnj-&gt;etat = PATROUILLE;
        }    
    }
    if(pnj-&gt;etat == FUITE)
    {
        if(test_intrus_loin(pnj))
        {
            pnj-&gt;etat = PATROUILLE;
        }
    }
    

    }
    </pre>
    <p><br/>
    les fonctions test_quelquechose(), sont des fonctions booléenne : si la condition est vrai, alors on retourne<br/>
    1, et on change d'état associé a la fonction, si la fonction retourne 0, la condition est fausse,<br/>
    alors on ne change pas d'état. ces fonction nécessite une structure t_perso pour tester<br/>
    les conditions, mais rien ne vous oblige à les utiliser.<br/>
    Faites vos propres test avec ce qu'il faut pour changer d’état, il faut juste modifier un peu<br/>
    le code.<br/><br/>
    Comme vous le voyez, ce code est simple, et est très facilement lisible, donc facilement modifiable et<br/>
    débuggable.<br/>
    Chaque type de personnage nécessite sa propre fonction de changement d'état(un fermier qui fabrique ses<br/>
    propres vêtements n'est pas crédible, réservez cela au tailleur).<br/><br/>
    Afin de vous retrouver plus facilement dans la création de changement d'état, n'hésitez pas<br/>
    à faire un graphique des différents état possible :</p>
    <p><img alt="9.jpg?w=300&h=232" src="http://jakemissing.files.wordpress.com/2012/11/9.jpg?w=300&amp;h=232"/></p>
    <p>pour info, flee veut dire s'enfuir.</p>
    <p> </p>
    <p>Et voila, vous avez maintenant un pnj qui peut réagir en fonction des événement</p>
    <p>qu'il l'entoure 🙂 </p>

    1 Reply Last reply
    2
    • D
      D
      Droby
      wrote on last edited by
      #2

      <p>Je savais que tu allais faire une suite <3</p><p>Merci +1 rép</p>

      Bonne affaire ici

      1 Reply Last reply
      0
      • AzadA
        AzadA
        Azad
        wrote on last edited by
        #3

        <p>Très bon tutoriel, comme les autres sur les IA.<br/>
        Ça sera sans doute utile, si un jour Melinyel se lance dans la conception officielle d'un jeu communautaire. 🙂 <br/><br/>
        +1 rep</p>

        Administrateur du forum.
        Contactez-moi par message privé ou par mail.

        1 Reply Last reply
        0
        • AlexMogA
          AlexMogA
          AlexMog
          Modérateur spécialisé
          wrote on last edited by
          #4

          <p>Salut pas mal comme cours, mais sache que tu peux très bien faire un typedef directement sur ta scruct:</p>
          <pre class="ipsCode prettyprint">
          typedef struct ma_struct
          {
          }t_ma_struct;
          </pre>
          <p>C'est utile de le faire avant uniquement si il est utilisé dans la structure ^^.</p>
          <p>Sinon, c'est effectivement une IA assez basique, on voit des IA balaises de temps en temps, mais là, c'est vraiment l'IA classique des jeux-vidéos.</p>
          <p>Bien joué 😄 </p>

          Multiplayer GameDev @ Unexpected
          

          Mon CV

          1 Reply Last reply
          0

          Hello! It looks like you're interested in this conversation, but you don't have an account yet.

          Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.

          With your input, this post could be even better 💗

          Register Login
          Reply
          • Reply as topic
          Log in to reply
          • Oldest to Newest
          • Newest to Oldest
          • Most Votes


          • Login

          • Login or register to search.
          Powered by NodeBB Contributors
          • First post
            Last post
          0
          • Categories
          • Recent
          • Tags
          • Popular
          • World
          • Users
          • Groups