~ S'évader de la banalité... Et entrer dans l'imaginaire ! ~ |
|
| Tutoriel sur l'intelligence artificielle | |
| | Auteur | Message |
---|
Grade Petit Maker Lv 4
Nombre de messages : 107 Age : 28
| Sujet: Tutoriel sur l'intelligence artificielle Jeu 17 Juil 2008, 21:04 | |
| Tutoriel sur l'intelligence artificielleQu'est-ce que l'intelligence artificielle ? Comment on s'en sert ?Oui, commençons par le commencement :p. Concretement, c'est quoi l'intelligence artificielle. Par exemple, quand vous faites un evenement qui suit le héros, c'est de l'intelligence artificielle. Il mesure ses coordonnées à celle du héros, et y agit en fonctions de celles-ci. Mais c'est pas tout, l'intelligence artificielle (que j'abregerais maintenant IA) c'est pleins d'autre chose. Moi, un momant, j'avais fait un morpion, et l'ennemi "réfléchissait" aux coups que je faisait. Par exemple, si j'allais faire une ligne de trois, il allait me bloquer, et si il allait faire une ligne de trois, il allait pas mettre son coup n'importe où, il le mettait à l'endroit qu'il fallait pour gagner. Enfin bref, pour vous dire que c'est, donner une impression qu'un evenement est intelligent. Je dis bien une impression, car un evenement ne sera jamais intelligent . Mais sinon, une IA, c'est dur à réaliser avec RM ? C'est long ?Rentrons dans le vif du sujet. La difficultée dépend de votre niveau, et si vous lisez ce tutoriel, c'est pour apprendre n'est-ce pas (à ceux qui ne le savent pas). Bon après, c'est long ? Je ne vais pas vous mentir, c'est assez long, mais toutes fois, cela dépend encore de vous (plus precisement, de votre rapiditée). Bon, maintenant, commençons la pratique. Comme je vous l'ai dit, une IA c'est un vaste sujet, donc il faut trouver un sujet, avec une IA. Heum... réfléchissons. Un exemple simple avec une IA... Trouvé ! Nous allons faire un PNJ (Personnage non jouable), et on pourra lui parler (rien de mechant :p), mais aussi le frapper (ça c'est mechant ). C'est facile à faire pour l'instant, un PNJ avec un choix, si on lui parle, il dit n'importe quoi, et si on le frappe, il active un interrupteur. C'est facile à faire voyons. Rohlala, j'dois tout faire ici : - Spoiler:
- Code:
-
<>Message; Bonjour que voulez vous ? <>Montrer choix: Vous parler/Vous frapper/Rien finalement Si [Vous parler] faire : <>Message: Ah, et de quoi ? <> Si [Vous frapper] faire : <>Interrupteur(s): [0001:Va se pleindre] activé(s) <> Si [Rien finalement] faire : <> Fin <> Content ? C'etait pas si difficile pourtant .
Mmh, pour l'instant, nous n'avons pas fait d'IA. c'est maintenant que l'IA rentre en jeu. Le PNJ va aller se pleindre, pour cela, il va suivre le garde (qu'importe l'endroit où il se trouve). Et dès qu'il sera à coté de lui, le garde va le regarder, rester figé avec le personnage pendant 1 seconde, puis va foncer vers vous pour vous arreter. Quelle histoire pationnante :p. Maintenant, mettons-nous au boulot. Faites un nouvel evenement en processus parallèle sans apparence. Et mettez en condition de l'evenement, si l'interrupteur [0001:Va se pleindre] est activé ! Maintenant je vais vous faire réfléchire sur la manière dont nous allons coder. D'abord, pour suivre le personnage que faut-t'il ? Des coordonnées. Vous savez, les machins qui garde la position des evenements :P. Oui c'est exacte, il faut des coordonnées. Puis nous allons faire des conditions, si la coordonnée X du garde est plus grande que celle du villageoi, on déplace le villageoi vers la droite etc... C'est bon vous avez compris ? Alors au boulot Correction : - Code:
-
<>Variable(s): [0001:X PNJ] = , EV0001 coord. X <>Variable(s): [0002:Y PNJ] = , EV0001 coord. Y <>Variable(s): [0003:X Garde] = , EV0002 coord. X <>Variable(s): [0004:Y Garde] = , EV0002 coord. Y <>Si variable[0003:X Garde] V[0001] > strict <>Déplacer/Modifier: EV0001, Pas vers droite //Les deux options doivent être décochés <> : Sinon <>Si variable[0003:X Garde] V[0001] < strict <>Déplacer/modifier: EV0001, Pas vers gauche //Pareil <> : Sinon <>Si variable[0003:X Garde] V[0001] = <>Si variable[0004:Y Garde] V[0002] > strict <>Déplacer/Modifier: EV0001, Pas vers bas //Pareil <> : Sinon <>Si variable[0004:Y Garde] V[0002] < strict <>Déplacer/Modifier: EV0001, Pas vers haut //Pareil <> : Sinon <> Fun <> Fin <> : Sinon <> Fin <> Fin <> Fin <> Pfiouu, nous sommes arrivé à bout. Toutes fois, vous pouvez augmenter la vitesse du PNJ car là ça fait pas très convaiquant. Bref, sinon, j'ai fait ce code, car ça doit être le plus proche au votre (c'est vrai que logiquement on a tendance à faire celui-ci). Mais, il est pas terrible en fin de compte. Quoi ??!! Tu veux dire qu'on a fait ça pour rienNon non, rassurez-vous. On va se servir du même code, mais on va l'améliorer ! Voici ce qui va pas : Peut-être que ça vous est arrivé. Vous avez voulu mettre un arbre devant la trajectoire du PNJ. Et celui-ci, est resté bloqué. Comment faire pour eviter ça ? Premièrement, on va tester, voir si le PNJ est bloqué. Pour ça, il faut faire un double de ses coordonnés. puis on va voir, si toutes les 0.1 seconde (le temps d'un pas), il s'est déplacé. Si c'est pas le cas, on va s'inquieter. Soit on va echanger les axes (c'est a dire, que si il allait d'abord chercher à être au même X que le garde, et bien on va chercher à faire l'inverse, il va d'abord aller à l'Y du garde). Vous vous dites, mais non ça sert à rien. Mais détrompez-vous, ça peut toujours être utile. Mais vous avez aussi raison, ça suffira pas. Donc, si le PNJ est toujours bloqué, on va employer les grands moyen, et le débloquer, en faisant un pas vers, et là ça dépend. Si il cherche à faire les même Y que le garde (c'est à dire de haut en bas). et bien on va le déplacer vers la gauche ou vers la droite (faites une variables qui soit egale à 1 ou à 2 aléatoirement). Et si il cherche à aller au même X que le garde, ce sera aléatoirement vers le haut ou vers le bas. Bon, nous avons fini de dire ce qui allait pas, alors codons maintenant . Correction : (Attention, essayez de comprendre ce code, car c'est pas facile :S). - Code:
-
<>Etiquette: 1 <>Variable(s): [0001:X PNJ] = , EV0001 coord. X <>Variable(s): [0002:Y PNJ] = , EV0001 coord. Y <>Variable(s): [0003:X Garde] = , EV0002 coord. X <>Variable(s): [0004:Y Garde] = , EV0002 coord. Y <>Variable(s): [0007:x/y] = , aléa entre 1&2 <>Si variable[0007:x/y] 1 <>Si variable[0003:X Garde] V[0001] > strict <>Déplacer/Modifier: EV0001, Pas vers droite <>Attendre 0.1 Sec. <>Variable(s): [0005:X PNJ(2)] = , EV0001 coord. X <>Variable(s): [0006:Y PNJ(2)] = , EV0001 coord. Y <>Si variable[0001:X PNJ] V[0005] = <>Si variable[0002:Y PNJ] V[0006] = <>Si interrupteur[0002:Resté bloqué] sur ON <>Variable(s): [0008:H/B ? G/D ?] = , valeur de [0009] <> : Sinon <>Variable(s): [0008:H/B ? G/D ?] = , aléa entre 1&2 <> Fin <>Interrupteur(s): [0002:Resté bloqué] activé(s) <>Variable(s): [0009:H/B ? G/D ? (2)] = valeur de [0008] <>Si variable[0008:H/B G/D ?] 1 <>Déplacer/Modifier: EV0001, Pas vers haut <>Attendre 0.1 Sec. <>Aller à l'étiquette: 1 <> : Sinon <>Déplacer/Modifier: EV0001, Pas vers bas <>Attendre 0.1 Sec. <>Aller à l'étiquette: 1 <> Fin <> : Sinon <>Interrupteur(s): [0002:Resté bloqué] désactivé(s) <> Fin <> : Sinon <>Interrupteur(s): [0002:Resté bloqué] désactivé(s) <> Fin <> : Sinon <>Si variable[0003:X Garde] V[0001] < strict <>Déplacer/Modifier: EV0001, Pas vers gauche <>Attendre 0.1 Sec. <>Variable(s): [0005:X PNJ(2)] = , EV0001 coord. X <>Variable(s): [0006:Y PNJ(2)] = , EV0001 coord. Y <>Si variable[0001:X PNJ] V[0005] = <>Si variable[0002:X PNJ] V[0006] = <>Variable(s): [0008:H/B ? G/D ?] = , valeur de [0009] <> : Sinon <>Variable(s): [0008:H/B ? G/D ?] = , aléa entre 1&2 <> Fin <>Interrupteur(s): [0002:Resté bloqué] activé(s) <>Variable(s): [0009:H/B ? G/D ? (2)] = , valeur de [0008] <>Si variable[0008:H/B ? G/D ?] 1 <>Déplacer/Modifier: EV0001, Pas vers haut <>Attendre 0.1 Sec. <>Aller à l'étiquette: 1 <> : Sinon <>Déplacer/Modifier: EV0001, Pas vers bas <>Attendre 0.1 Sec. <>Aller à l'étiquette: 1 <> Fin <> : Sinon <>Interrupteur(s): [0002:Resté bloqué] désactivé(s) <> Fin <> : Sinon <>Interrupteur(s): [0002:Resté bloqué2] désactivé(s) <> Fin <> : Sinon <>Si variable[0003:X Garde] V[0001] = <>Variable(s): [0007:x/y] = , 2 <> : Sinon <> Fin <> Fin <> Fin <> : Sinon <>Si variable[0007:x/y] 2 <>Si variable[0004:Y Garde] V[0002 > strict <>Déplacer/Modifier: EV0001, Pas vers bas <>Attendre 0.1 Sec. <>Variable(s): [0005:X PNJ(2)] = , EV0001 coord. X <>Variable(s): [0006:Y PNJ(2)] = , EV0001 coord. Y <>Si variable[0001:X PNJ] V[0005] = <>Si variable[0002:Y PNJ] V[0006] = <>Si interrupteur[0002:Resté bloqué] sur ON <>Variable(s): [0008:H/B ? G/D ?] = , valeur de [0009] <> : Sinon <>Variable(s): [00008:H/B ? G/D ?] = , aléa entre 1&2 <> Fin <>Interrupteur(s): [0002:Resté bloqué] activé(s) <>Variable(s): [0009:H/B ? G/D ? (2)] = , valeur de [0008] <>Si variable[0008:H/B ? G/D ?] 1 <>Déplacer/Modifier: EV0001, Pas vers gauche <>Attendre 0.1 Sec. <>Aller à l'étiquette: 1 <> : Sinon <>Déplacer/Modifier: EV0001, Pas vers droite <>Attendre 0.1 Sec. <>Aller à l'étiquette: 1 <> Fin <> : Sinon <>Interrupteur(s): [0002:Resté bloqué] désactivé(s) <> Fin <> : Sinon <>Interrpteur(s): [0002:Resté bloqué] désactivé(s) <> Fin <> : Sinon <>Si variable[0004:Y Garde] V[0002] < strict <>Déplacer/Modifier: EV0001, Pas vers haut <>Attendre 0.1 Sec. <>Variable(s): [0005:X PNJ(2)] = , EV0001 coord. X <>Variable(s): [0006:Y PNJ(2)] = , EV0001 coord. Y <>Si variable[0002:Y PNJ] V[0006] = <>Si variable[0001:X PNJ] V[0005] = <>Si variable[0002:Y PNJ] V[0006] = <>Si interrupteur[0002:Resté bloqué] sur ON <>Variable(s): [0008:H/B ? G/D ?] = , valeur de [0009] <> : Sinon <>Variable(s): [0008:H/B ? G/D ?] = , aléa entre 1&2 <> Fin <>Interrupteur(s): [0002:Resté bloqué] activé(s) <>Variable(s): [0009:H/B ? G/D (2)] = , valeur de [0008] <>Si variable[0008:H/B ? G/D ?] 1 <>Déplacer/Modifier: EV0001, Pas vers gauche <>Attendre 0.1 Sec. <>Aller à l'etiquette: 1 <> : Sinon <>Déplacer/Modifier: EV0001, Pas vers droite <>Attendre 0.1 Sec. <>Aller à l'étiquette: 1 <> Fin <> : Sinon <>Interrupteur(s): [0002:Resté bloqué] désactivé(s) <> Fin <> : Sinon <>Interrupteur(s): [0002:Resté bloqué] désactivé(s) <> Fin <> : Sinon <>Si variable[0004:Y Garde] V[0002] = <>Variable(s): [0007:x/y] = , 1 <> : Sinon <> Fin <> Fin <> Fin <> Fin <> : Sinon <> Fin <> Fin <> Pfiouuu. Ca en fait du code. Bon maintenant, c'est cool, mais c'est pas top non plus. Le héros va un peu n'importe comment hein ? Bah c'est fait exprès. C'est ce qu'on lui a dit, franchement je ne vois pas de meilleur solution à moins de faire je ne sais combien de variable pour chaque type de terrain :p. Bon bref, cette solution est un peu lourde à mettre en place. Donc si votre cible bouge, vous pouvez remettre le code d'avant. Mais pas exactement le même. Vous rajouterez seulement une variable qui est egale soit à un ou à deux, et ça signifi l'axe X ou l'axe Y (c'est l'axe par lequel il doit commencer). Pourquoi je vous demande de faire ça ? Car c'est plus propre et que votre héros arriveras surement plus vite à sa déstination que un autre :p. | |
| | | Grade Petit Maker Lv 4
Nombre de messages : 107 Age : 28
| Sujet: Re: Tutoriel sur l'intelligence artificielle Jeu 17 Juil 2008, 21:05 | |
| Partie 2 Bon bref, notre objectif maintenant, c'est : Vous avez remarqué, dès que notre evenement arrive à sa cible, il lui tourne autour, ce qui est compréhensif puisque le processus de "si ça bloque, t'essaie de te débloquer" n'est pas arreté :p. Il faut donc faire un nouvel evenement qui est activable si l'interrupteur [0001:Va se pleindre] est activé. Voici ce que nous allons faire. Nous allons faire un evenement qui va tester si le villageoi est pres du garde. Pour cela, rien de plus simple. On va faire un evenement qui gardera deux nouvelles variables (X PNJ(3) et Y PNJ(3) je sais j'ai pas d'imagination ). Donc, on va tester les direction du villageoi (si il regarde à droite ou à gauche etc..) Et si il regarde à droite, c'est que le garde est logiquement, à sa droite. Donc il suffira de faire X PNJ(3) + 1 etc... Après on teste, si X PNJ(3) est égale à X Garde et si Y PNJ(3 est égale à Y Garde. Puis on fait un nouvel interrupteur qui annule le processus :p. C'est pas compliqué... Quoi le code ? Bon okay :p. Correction : - Code:
-
<>Variable(s): [0010:X PNJ(3)] = , valeur de [0001] <>Variable(s): [0011:X PNJ(3)] = , valeur de [0002] <>Si EV0001 > Haut: direction fixée <>Variable(s): [0011:Y PNJ(3)] - , 1 <> : Sinon <>Si EV0001 > Droite: direction fixée <>Variable(s): [0010:X PNJ(3)] - , 1 <> : Sinon <>Si EV0001 > Bas: direction fixée <>Variable(s): [0011:Y PNJ(3)] + , 1 <> : Sinon <>Variable(s): [0010:X PNJ(3)] - , 1 <> Fin <> Fin <> Fin <>Si variable[0010:X PNJ(3)] V[0003] = <>Si variable[0011:Y PNJ(3)] V[0004] = <>Si EV0001 > Haut: direction fixée <>Déplacer/Modifier: EV0002, Regarde bas <> : Sinon <>Si EV0001 > Droite: direction fixée <>Déplacer/Modifier: EV0002, Regarde gauche <> : Sinon <>Si EV0001 > Bas; direction fixée <>Déplacer/Modifier: EV0002, Regarde haut <> : Sinon <>Déplacer/Modifier: EV0002, Regarde droite <> Fin <> Fin <> Fin <>Interrupteur(s): [0003:Fin IA] activé(s) <> : Sinon <> Fin <> : Sinon <> Fin <> Facile non ? . Bon, on a presque fini. N'oubliez pas de faire une nouvelle page vierge de l'autre evenement, dans la condition suivante : Si l'interrupteur [0003:Fin IA] est activé. Bon bref, sinon faites une nouvelle page de l'evenement où nous avons placé le dernier code. Mettez la même condition citée plus haut. Et mettons, attendre 1.0 ou plus, ça dépends combien de temps voulez-vous que le garde et le villageoi mettent à parler. Et activez un nouvel interrupteur, [0004:Poursuite]. Et faites une nouvelle page vierge de cet evenement. Puis allez voir l'evenement du garde, et faites une nouvelle page, si l'interrupteur [0004:Poursuite est activé], mettez comme mouvement, suivre le héros (qui nous évitera le travail). Maintenant, vous pouvez tester. Dès que le petit PNJ ira voir le garde, il parleront, puis le garde va se mettre à votre poursuite . Chez moi ça a un effet assez drôle :o. Mais vous pouvez aussi faire une chose sympa, vous pouvez, une fois le garde à votre poursuite, vous pouvez désactivé l'interrupteur [0003:Fin IA], comme ça, le villageoi va se mettre à suivre le garde (comme si il avait peur de vous, il va se cacher près du garde). Je sais pas pourquoi mais j'adore, un PNJ qui a peur :P. Hum, nous avons fait le tour de notre programme (je metterais surement une video pour vous montrer le systeme). Comme je vous l'ai dit plus haut, le systeme pour suivre le garde est un peu lourd, c'est la première fois que je fais comme ça. Mais par contre, chez moi j'ai mis le garde n'importe où, il allait toujours un momant ou un autre toucher le garde. Donc chez moi il va toujours à destination, mais il va un peu n'importe comment. Alors n'hésitez pas à supprimer tout le passage : Si il reste à la même place, on le fait bouger d'un pas, n'importe où. N'hésitez pas à le supprimer. Ca fera comme quand vous faites "Suivre le héros". Il peut être bloqué par un obstacle, mais en fin de compte, il ira souvent vous chercher. Bon voila, il est temps de mettre fin à notre petit tuto. Bon, j'vais aller reposer mes doigts, parce que là ils ont des crampes . Bye, et à bientot pour un nouveau tuto ! Video Dailymotion : ici | |
| | | coco Dieu Maker Lv 44
Nombre de messages : 2989 Age : 30
| Sujet: Re: Tutoriel sur l'intelligence artificielle Ven 18 Juil 2008, 09:33 | |
| Super tuto !!! Très long mais vachement bien détaillé, il manque peut-être quelques images (la vidéo c'est génial, mais les images aèrent le texte ) On a envie de le lire jusqu'au bout (soit parce que c'est bien écrit, soit parce que le thème et bien choisi, ou un peu des 2 ) UN autre UN autre ____________ | |
| | | AlexRE Admin trop trizo Lv 65
Nombre de messages : 29934 Age : 37
| Sujet: Re: Tutoriel sur l'intelligence artificielle Ven 18 Juil 2008, 10:07 | |
| C'est assez long à lire, alors je m'y plongerai quand j'aurais le temps. Merci beaucoup Grade ____________ - Relm a écrit:
- Merci pour la confirmation Gary et fuck my life.
| |
| | | Contenu sponsorisé
| Sujet: Re: Tutoriel sur l'intelligence artificielle | |
| |
| | | | Tutoriel sur l'intelligence artificielle | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |
|