<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[IA #2 - le pnj : un automate à états finis]]></title><description><![CDATA[<p dir="auto">Bonjour à tous !</p>
<p dir="auto">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 dir="auto">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 dir="auto">prendre qu'un seul état à la fois.</p>
<p dir="auto">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</p>
<p dir="auto">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</p>
<p dir="auto">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.</p>
<p dir="auto">Pour reprendre l'exemple du soldats, on peut créer d'autre états :</p>
<p dir="auto">É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 ?)</p>
<p dir="auto">Bref vous l'avez compris, plus il y a d'états, plus le pnj sera réaliste.</p>
<p dir="auto">Et maintenant le code :</p>
<pre><code>/*
la structure qui va servir pour votre pnj
*/
typedef struct t_perso t_perso;
struct t_perso
{
    char etat;
    char type;
    t_info info;
}
</code></pre>
<p dir="auto">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 dir="auto">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...)</p>
<pre><code>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;
        }
    }
}
</code></pre>
<p dir="auto">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.</p>
<p dir="auto">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).</p>
<p dir="auto">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 dir="auto"><img src="http://jakemissing.files.wordpress.com/2012/11/9.jpg?w=300&amp;h=232" alt="9.jpg?w=300&amp;h=232" class=" img-fluid img-markdown" /></p>
<p dir="auto">pour info, flee veut dire s'enfuir.</p>
<p dir="auto">Et voila, vous avez maintenant un pnj qui peut réagir en fonction des événement</p>
<p dir="auto">qu'il l'entoure <img src="http://new.melinyel.net/assets/plugins/nodebb-plugin-emoji/emoji/android/1f642.png?v=aa95655114f" class="not-responsive emoji emoji-android emoji--slightly_smiling_face" style="height:23px;width:auto;vertical-align:middle" title=":)" alt="🙂" /></p>
]]></description><link>http://new.melinyel.net/topic/759/ia-2-le-pnj-un-automate-à-états-finis</link><generator>RSS for Node</generator><lastBuildDate>Thu, 21 May 2026 22:05:13 GMT</lastBuildDate><atom:link href="http://new.melinyel.net/topic/759.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 25 May 2014 10:33:19 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to IA #2 - le pnj : un automate à états finis on Sun, 25 May 2014 13:45:43 GMT]]></title><description><![CDATA[<p dir="auto">Salut pas mal comme cours, mais sache que tu peux très bien faire un typedef directement sur ta scruct:</p>
<pre><code>typedef struct ma_struct
{
}t_ma_struct;
</code></pre>
<p dir="auto">C'est utile de le faire avant uniquement si il est utilisé dans la structure ^^.</p>
<p dir="auto">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 dir="auto">Bien joué <img src="http://new.melinyel.net/assets/plugins/nodebb-plugin-emoji/emoji/android/1f604.png?v=aa95655114f" class="not-responsive emoji emoji-android emoji--smile" style="height:23px;width:auto;vertical-align:middle" title=":D" alt="😄" /></p>
]]></description><link>http://new.melinyel.net/post/8035</link><guid isPermaLink="true">http://new.melinyel.net/post/8035</guid><dc:creator><![CDATA[AlexMog]]></dc:creator><pubDate>Sun, 25 May 2014 13:45:43 GMT</pubDate></item><item><title><![CDATA[Reply to IA #2 - le pnj : un automate à états finis on Sun, 25 May 2014 12:43:13 GMT]]></title><description><![CDATA[<p dir="auto">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. <img src="http://new.melinyel.net/assets/plugins/nodebb-plugin-emoji/emoji/android/1f642.png?v=aa95655114f" class="not-responsive emoji emoji-android emoji--slightly_smiling_face" style="height:23px;width:auto;vertical-align:middle" title=":)" alt="🙂" /></p>
<p dir="auto">+1 rep</p>
]]></description><link>http://new.melinyel.net/post/8032</link><guid isPermaLink="true">http://new.melinyel.net/post/8032</guid><dc:creator><![CDATA[Azad]]></dc:creator><pubDate>Sun, 25 May 2014 12:43:13 GMT</pubDate></item><item><title><![CDATA[Reply to IA #2 - le pnj : un automate à états finis on Sun, 25 May 2014 12:14:25 GMT]]></title><description><![CDATA[<p dir="auto">Je savais que tu allais faire une suite <img src="http://new.melinyel.net/assets/plugins/nodebb-plugin-emoji/emoji/android/2764.png?v=aa95655114f" class="not-responsive emoji emoji-android emoji--heart" style="height:23px;width:auto;vertical-align:middle" title="&lt;3" alt="❤" /></p>
<p dir="auto">Merci +1 rép</p>
]]></description><link>http://new.melinyel.net/post/8031</link><guid isPermaLink="true">http://new.melinyel.net/post/8031</guid><dc:creator><![CDATA[Droby]]></dc:creator><pubDate>Sun, 25 May 2014 12:14:25 GMT</pubDate></item></channel></rss>