[Prog] Création d'IA pour un jeu.

Répondre
Partager Rechercher
Comme je l'avais dit ici j'ai un projet de jeu php (c'est à la mode en ce moment en plus).

Comme j'avais déjà dit dans mon premier thread je veux un comportement assez logique des ennemis.
Donc concrètement faudrait qu'au moment où ils spawnent je leur assigne:
- des stats.
- un inventaire.
- un livre de sorts remplis.
- un type de comportement.

Et j'aimerai qu'ils agissent en fonction de ça.
C'est à dire qu'ils choisissent leur arme et armure en fonction de ce qu'ils possèdent.
Qu'ils pensent à boire leur potion de vie quand ils ont plus beaucoup de points de vie.
Qu'ils choisissent d'envoyer un sort adapté à la situation tout en gérant leur stock d'ingrédient.
Et surtout qu'il fasse tout ça en fonction d'un type de comportement qu'on leur a choisi (guerrier, clerc, mage de soutien, mage offensif...).

Les combats se dérouleraient en tour par tour, c'est à dire qu'on défini l'action de chaque personnage présent dans le combat et qu'ensuite on calcul le résultat.



Y a t il des choses à savoir avant de se lancer dans la création d'un tel système? Des méthodes à appliquer pour que ça marche bien?

Bref je sais pas trop par où commencer donc j'ai besoin de conseils .
bah j'ai vu un peu d'ia cette année... et les jeux qu'on voyais ct plutot des jeux à deux joueurs en tour par tour ( genre morpion )

mais déjà, je pense qu'avec un moteur en PHP, tu devras simplement te limiter à une IA des plus basiques... à base de if/then, switch...

enfin cke j'en sais moi =)

edit :
deux liens à approfondire :
http://prografix.games-creators.org/doc_cat/79
http://forum.games-creators.org/viewforumcat_240.htm
Citation :
Provient du message de XhaK
mais déjà, je pense qu'avec un moteur en PHP, tu devras simplement te limiter à une IA des plus basiques... à base de if/then, switch...
Je risque de faire ça oui.
Je vais commencer par y réfléchir sur papier car je pense qu'il va falloir que je rajoute quelques variables sur les objets/sorts qui serviront uniquement à l'IA.

Je sens que les premières versions ne seront pas les plus propres .
Si tu as une motivation extreme (parce qu'il va en falloir je pense ), tu peut essayer d'implanter une base de connaissance pour tes monstres, qui se mettra a jour à chaque combat.

Par exemple, on considère que ton monstre 'mA' dispose de deux attaques, 'aA' et 'aB', et qu'il peut rencontrer deux types de joueurs 'jA' et 'jB'.

Tu aura une table dans ta base de données, du genre "typeMonstre', 'typeAttaque', 'typeEnnemi' et 'réussite[0|1|2|3]'

Tu considère 4 type de réussite:
- 0: le combat a échoué et le monstre c'est fait poutré lamentablement
- 1: le monstre c'est fait poutré, mais il a bien entamé l'ennemi
- 2: l'ennemi c'est fait pourté, mais le monstre a subit pas mal de dommages
- 4: l'ennemi c'est fait poutré magistralement.

Au début du combat, le monstre peut évaluer ses chances de reussite, voir même fuir s'il voit qu'il a aucune chance.

A chaque fois que le monstre 'mA' fait un combat contre un ennemi, il regardera dans la base quelle attaque convient le mieux, et a la fin du combat, il met la base de donnée a jour en fonction du résultat.

Evidement c'est super basique comme système, puisqu'il n'utilisera qu'une seule attaque, celle qui convient le mieux, mais tu peut améliorer ca, en rajoutant des champs permettant de savoir ce qui convient le mieux pour débuter le combat, en milieu de combat et pour achever l'adversaire etc.

Tu pourra aussi rajouter le niveau de l'adversaire après, puisque combattre un adversaire niveau 1 ou niveau 10 ne donnera pas le même résultat à la fin.

Par contre si ca marche trop bien le problème risque d'être que tous tes joueurs se feront poutrer
Citation :
Provient du message de - Sarga -
Par contre si ca marche trop bien le problème risque d'être que tous tes joueurs se feront poutrer
Bien sur que non, car tu auras pris soin d'implementer des faiblesses de preferences perverses, bizarres et auxquelles AUCUN joueur ne pensera a ton mob, par exemple qu'il faudra combiner une poudre d'une fleur que tu as vu il y a 15h de jeu pour buter ton machin

ah oui en fait tous les joueurs se feront poutrer
Perso j'avais fais, enfin en moins poussé, pour mon projet Java de 1er année, ce n'était donc pas très poussé(mais j'ai quand même eu 20 )

Les ennemies avait des poitions de soins, et 2 types d'attaque.
J'ai tout fais via des randoms, en essayant de garder un maximum de logique. C'est à dire que le type avait 4/5 d'attaquer, et 1/5 de se defendre.
Quand sa vie était inferieur à X points de vie, il buvait sa potion.
Après, je pense qu'en rajoutant des coefficiants soit au random, soit au resultat, tu dois pouvoir te debrouiller.

Par exemple, si le type est bête il a moins de chance d'utiliser sa popo de soins quand il est fatigué.
Tu rajoutes donc en coef au resultat du ran l'inteligence, ce qui augmante tes chances de reussire.
(pas claire? )
Par exemple:

Si la vie du type est inferieur à 30 %
Tu choisi un nombre de 0 à 100.
Si ce nombre multiplié/additioner par/à l'inteligence est superieur à 40, alors le type bois la popo.
Sinon il fait autre chose.

Voila, le problème après est de bien doser tout les coeff pour que le jeu soit sympa.
Je vois mais tous les cas ça va pas être du gâteau car la plupart des combats seront 4 vs 4.

Donc je peux pas appliquer un simple random avec coef et condition mini sur chaque monstre pour avoir un comportement d'équipe logique.
Puis ça c'est bien pour un comportement basique de guerrier.
Le mage qui va devoir choisir entre le fait de buffer/guérir un allié et attaquer un ennemi, il risque de pas avoir l'air aware si c'est un simple random qui le fait attaquer alors que tout ses potes sont quasi morts.

C'est vraiment compliqué à faire en fait, je vais bien m'amuser je le sens .
En fait une IA ce n est en general que des tables de chances de faire tel action ... table qui evolue en fonction des resultats obtenue.

Par exemple dans un combat 4vs4 si les 4 adversaires sont sur un meme allie ton mage pourra avoir par exemple 40 % de chances de buffer se guerrier pour la defense. se % dependra de l equipe adverse et des differente tactiques deja faite contre eux.

Mais pour avoir une veritable IA faut toujourss pouvoir enregistrer certains paramteres , evaluer la réussite d une action et a la base d une IA se trouve toujour un generateur de nombres aléatoires
J'arrive pas a voir si dans ton projet les ennemis doivent gérer leurs déplacements, la cohésion d'un groupe etc ...
Je vais faire comme si.

Si ce que tu veux c'est simplement des comportements autonomes pour tes ennemis (ie : sans avoir à scripter déplacements et autres) il existe des trucs tout simple qui fonctionnent plutôt bien.

Par ici pour voir ce que ça donne (une liste d'applet pour voir tourner le truc se trouve sur la page).
Tous les algorithmes sont donnés sur la page et ici

Ca rend bien et c'est très facile à implémenter, surtout si tu fais du tour par tour et que tu discrétise l'espace (me semble que c'est ce que tu voulais).

Ce système par contre ne s'occupe que des problèmes moteurs.
Ce qui est pas plus mal d'ailleurs, tu sépare ainsi ce qui est décisionnel de ce qui est action (en gros il faut décider quelle action faire et plus comment la faire).

Pour ce qui est de la prise de décision tu as encore un paquet de choix, du plus simple (switch, if/then/else) à des trucs plus exotiques (mais tellement mieux )

Le point le plus important est tout d'abord de déterminer l'ensemble de variables dont dispose l'IA pour choisir son action.
Ensuite il faut déterminer ce que tu veux obtenir :

si les ennemis dispose d'un ensemble très restreint d'actions et aucunes contraintes pour choisir alors un simple if suffit.
Si l'ennemi dispose d'un temps limité il faut que ton processus soit interruptible.
Si tu veux qu'un ennemi puisse modifier son comportement il va falloir que tu trouve un système de "notation" de la qualité de l'action et que la rétro-propagation de la note modifie les choix des actions.
Si tu veux le comportement le plus réaliste possible (mémoire, contrainte sur le choix, l'ensemble de variables pas forcément défini, etc) je te conseille d'abandonner le php

Enfin tu peux taper dans les trucs plus rares dans les jeux tel que les systèmes de classeur, les algorithmes génétiques, etc.


Bon ... j'ai pas trop tapé à côté de la plaque ?




Nepher
Je regarderai avec attention tes liens plus tard car à cette heure ci j'ai pas assez de neurones dispo pour tout lire.


Globalement toutes les réponses de ce thread m'aident.
Je pense partir sur la base d'une base de donnée "mémoire".
Citation :
Provient du message de Nikkau
Je pense partir sur la base d'une base de donnée "mémoire".
Tu peut aussi ajouter dans ce système le fait que tu ai des monstres "testeurs" qui essayeront des nouveaux trucs au lieu d'une méthode infaillible.

Ca te permettra si c'est bien fait d'avoir un monde en perpétuelle évolution, puisque les joueurs s'adapteront aux techniques des monstres, et vice-versa logiquement.

Ca changera des jeux habituels ou quand tu trouve une technique contre un monstre tu la repete tout le temps et à la fin tu te lasse.

Sinon tu peut aussi essayer d'implanter des algos classique tels que min-max en plus, le principe est assez simple, apres l'implémentation peut etre plus tendue.
Oui c'est à ça que je pensais.

Par exemple un mage a 2 sorts, un de feu l'autre de glace.

Si il s'est jamais battu il lancera l'un ou l'autre indifféremment.
A chaque fois on enregistre ce qui fait le plus mal.
Une fois qu'il y a un minimum de statistiques enregistrées le monstre fait confiance au sort qui marche le mieux.

Si c'est le feu qui est dans ce cas, les joueurs font se mettre à utiliser de l'équipement qui protège du feu.
Conséquence: l'utilisation du feu par le monstre va baisser dans les stats et il va finir par se mettre à la glace, surprenant ainsi quelques joueurs.

Faudra définir des caps pour basculer sinon les attaques risquent d'osciller quand les stats tournent autour de 50%, ce qui n'est pas voulu.

Et le top serait de définir ce système à 2 échelles, une pour tous les combats en général et une autre locale, si au premier tour d'un combat les dégâts infligés sont ridicules le monstre testera tout de suite l'autre sort.
Vu que le développement de jeux PHP est à la mode en ce moment je donne la solution que j'ai décider d'adopter des fois que ça pourrai aider quelqu'un... vu mon choix pas sûr mais je l'expose quand même.



Finalement mes monstres se baseront pas sur une base de donnée de connaissances mais sur... celle de l'équipement des persos.
Donc oui ils seront balèzes mais à la base c'était le but et ça me simplifiera la vie niveau code.

Y aura quand même quelques trucs aléatoires sur certains monstres car en toute logique certains sont sensés être des abrutis finis mais globalement ils seront dur à battre.

Vala .
Je pense que ça en est tout de même une dans le sens où les monstres auront à choisir eux même leur équipement par rapport à ce qu'ils possèdent.

Bon oki ils choisiront leur arme en connaissant les points faibles du joueur.
Ok, ils choisiront leurs armures en connaissant les points forts du joueurs.
Mais ils choisiront tout seuls quand même .
Citation :
Provient du message de Nikkau

Bon oki ils choisiront leur arme en connaissant les points faibles du joueur.
Ok, ils choisiront leurs armures en connaissant les points forts du joueurs.
Mais ils choisiront tout seuls quand même .

Mais ils se déplacent pas tes monstres au fait ?
(en 2D au moins ?)



Nepher
Nan, c'est comme dans Mystic Quest, ou les Final Fantasy en général sans la barre de temps: t'assigne tes ordres à tes persos et une fois que tout le monde a un truc à faire ils agissent chacun leur tour.
Répondre

Connectés sur ce fil

 
1 connecté (0 membre et 1 invité) Afficher la liste détaillée des connectés