Et bien pour ça il va falloir se débrouiller un peu elle ne va pas vous tomber tout cru
Je vous donne en passant des optimisations essentielles pour une "bonne" IA
Se cacher
Une bonne IA fait en sorte de prendre le moins de dégâts possibles et pour ça le mieux est tout simplement de se cacher intelligemment au lieu de fuir l’ennemi n'importe comment !
Pour cela la méthode est relativement simple :
-Récupérer toutes les cellules accessibles avec les MP qu'il nous reste (évitez en général de travailler avec getPathLength( . , . ) car cette fonction consomme beaucoup d'opérations)
-Faire de même pour l'adversaire
-Trouver une case accessible ou l'adversaire n'as pas de ligne de vue depuis toutes ses cases accessibles
Je vous laisse vous INSPIRER (pas copier non mais) du code proposé par pierrotdu18
https://leekwars.com/forum/category-7/topic-1922
Vous remarquerez que le code n'est pas au complet mais l'essentiel y est. Attention j'ai bien dit vous inspirez car il reste du travail a faire !
Dépatouillez vous pour vous cacher la où ça vous arrange le plus (le plus loin, le plus proche etc), ne pas se cacher derrière des alliés (qui peuvent bouger ou tout simplement former des zones facile pour l'adversaire), et encore prendre en compte le fait que si vous n’êtes plus a portée de l'adversaire, c'est tout comme si vous étiez cachés (presque...)
Allez ça je vous aide il suffit de rajouter getAliveAllies() en 3eme paramètre de
... lineOfSight(hisCell, myCell, getAliveAllies()) ...
Une fois cette étape faite, il est simple de créer une fonction similaire pour avancer sinueusement (avancer au plus possible tout en restant caché)
Optimiser les attaques en zone
Si ne pas prendre de dégâts, en faire le maximum est tout aussi important ! (Cette partie ne compte évidemment que pour les attaques de zone...)
Pour cela plusieurs méthodes existent (comme pour tout), je vous livre la mienne même si c'est loin d'être la moins gourmande en terme d'opérations elle marche très bien il s'agit de :
si on sait quel ennemi est visé
-récupérer toutes les cases où notre arme lui inflige des dégâts (pour cela il faut récupérer une zone d'une certaine taille autour de l'adversaire)
-enlever toutes celles trop loin pour que vous puissiez tirer dessus, celles ou depuis toutes les cases accessibles, vous n'avez aucune ligne de vue
-calculer les dégâts infligés aux ennemis en tirant sur chaque case de celles restantes
Pour calculer les dégâts totaux il faut ajouter chaque dégât infligé sur chaque personne qu'on touche en tirant sur la case en question (s'aider de getWeaponTargets(...) puis multiplier les dégâts par un coefficient avant de les ajouter au total
Ce coefficient doit (par exemple) être de -1 si c'est un allié qui est touché, 1 si c'est un ennemi, ensuite a vous de jouer avec (on peut considérer que toucher une invoc ennemie est moins important que d'infliger des dégâts a un ennemi, ou affecter un coeff de 0 si l'allié touché est une de nos invocs etc...)
Attention cependant a bien prendre les armures des ennemis en compte ainsi que la distance a la case sur laquelle on tire !
les dégâts que va subir l'ennemi se détermine selon
degats_de_larme*(1+getStrength()/100)*((100-getRelativeShield(ennemi))/100)-getAbsoluteShield(ennemi);
et la réduction de dégats selon la distance via
1-0.5*getCellDistance(celluleSurLaquelleOnTire, getCell(enemi))/rayon
Dernières optimisations
Bien sur il ne faut pas oublier que quand un ennemi n'a presque plus de vie, pas besoin d'utiliser son attaque la plus chère en PT pour l'achever testez donc si une attaque plus faible ne le tue pas a tous les coups.
Gérer les poisons qu'on a sur soit :
Celle la c'est cadeau parce que vous laissez la chercher n'a pas non plus beaucoup d’intérêt :
function getDegatsPoison(){
var dpoison=0;
for(var i in getEffects()){
if(i[0]==13) dpoison+=i[1];
}
return dpoison;
}
Vous voila parés à utiliser la puce antidote !
(De même utilisez la puce libération pour enlever les armures de l'adversaire...)
Vous avez a présent de quoi faire les bases d'une IA assez bonne (vous attendez pas non plus a tout casser avec ces seules optimisations) ! Voici une IA sur ce principe
https://leekwars.com/leek/4771 et franchement elle marche assez bien (pas non plus god tier hein me faites pas dire ce que je n'ai pas dit) au vu le nombre de lignes de codes assez bas (400 avec une optimisation digne d'un singe) ce qui reste vraiment bas devant les meilleurs IA qui dépassent les 4000 lignes (et oui y a des mecs qui sont vraiment chauds))
Dernier point : Allez sur le forum du jeu ! Vous trouverez pleins d'autres astuces etc !
Sur ce : bon jeu !
Citer : Posté le 04/07/2014 16:03 | #
d'ailleurs si quelqu'un le veux mon pseudo est darkysun quelle surprise et mon poireau porte le nom de poireattaque
EDIT : mtn j'ai un deuxième poireaux : lvl 6, mon nom est DIEU et son nom est poiraxx (j'ai d'ailleurs postulé pour la team)
pour les parrainages DIEU merci
-Mon Fall Down
-Mon jeu de mains
-Mon starwars
-Mon dessinatout
-Mon niaiseux version 2.0
-Mon niaiseux version 3.0
-Inferno
-Mon super labyrinthe (en cours)
-Mon call of duty en 3D
-Casion (avec Az)
Citer : Posté le 04/07/2014 16:49 | #
Je ne pense pas que poster ici les code sources entiers des IA soit une bonne idée, le but est (selon moi) de faire découvrir la programmation d'IA, pas de donner des trucs a bouffer tout cuits.
Par contre je ne suis pas contre les astuces
Bref, pour l'arme, il y a moyen de faire pls simple : if(getWeapon() == -1) setWeapon(WEAPON);
Et ça s'applique dès le niveau 1.
Pour ce qui est du tir, le mieux est de faire une boucle pour garder des TP : il existe une fonction getTP() et getWeaponCost()
Avec ça vous devriez vous en sortir. Attention a ne pas faire planter l'IA dans le cas où on ne peux pas tirer.
A partir du niveau 5, on peut créer une condition pour s'avancer à la limite de la zone de tir de l'ennemi et donc de tirer le premier.
Citer : Posté le 04/07/2014 16:54 | #
J'ai 2 astuces :
Acheter la puce étincelle et n'attaquer qu'avec celle-ci en s'éloignant le maximum de l'ennemi tant qu'on reste dans la portée de 0 à 10 (intouchable au pistolet !) mais s'il s'approche assez prêt de vous, vous le touchez au pistolet
Faire en sorte de passer son tour et s'approcher de l'ennemi que quand VOUS pourrez l'attaquer en premier (en gros s'il est à une distance ou lui ne peut pas tirer mais que vous le pouvez en avançant, alors vous arrêtez de passer vos tours pour l'attaquer)
Ces 2 techniques sont à utiliser séparément, une si vous préférez la puce, une si vous préférez le pistolet
Citer : Posté le 04/07/2014 17:38 | #
Si on commence les bastion d'équipe, il faudrait faire des poireaux spécifiques (genre un bourrin qui a de la vie, un qui soigne les autres, etc.)
Citer : Posté le 04/07/2014 17:39 | #
ok je serais le dps/tank
-Mon Fall Down
-Mon jeu de mains
-Mon starwars
-Mon dessinatout
-Mon niaiseux version 2.0
-Mon niaiseux version 3.0
-Inferno
-Mon super labyrinthe (en cours)
-Mon call of duty en 3D
-Casion (avec Az)
Citer : Posté le 04/07/2014 17:40 | #
ouai mais faut faire des combats pour ça
Citer : Posté le 04/07/2014 17:45 | #
Dans ce cas la certains devrais se booster la vie plus que d'autre pour remplir leur rôle
Citer : Posté le 04/07/2014 17:50 | #
donc je fais des rôles : dites moi ce que vous voudriez être
-Mon Fall Down
-Mon jeu de mains
-Mon starwars
-Mon dessinatout
-Mon niaiseux version 2.0
-Mon niaiseux version 3.0
-Inferno
-Mon super labyrinthe (en cours)
-Mon call of duty en 3D
-Casion (avec Az)
Citer : Posté le 04/07/2014 17:52 | #
Je peux être le PNJ ?
Oui oui, poireau non joueur.
La fenêtre c'est bien par là ?
Citer : Posté le 04/07/2014 17:54 | #
oui c'est bien par là. Tu veux que je t'aide ?
-Mon Fall Down
-Mon jeu de mains
-Mon starwars
-Mon dessinatout
-Mon niaiseux version 2.0
-Mon niaiseux version 3.0
-Inferno
-Mon super labyrinthe (en cours)
-Mon call of duty en 3D
-Casion (avec Az)
Citer : Posté le 04/07/2014 17:55 | #
J'ai commencé un bon bourrin (niveau 15, j'ai un ratio de 10 (50-5), 210PV)
Par contre, je ne ferai pas le tank qui encaisse sans trop taper, moi je bourrine
Citer : Posté le 04/07/2014 18:06 | #
J'suis lvl 5 (j'ai recommencé comme je l'ai dit), j'ai 20 victoires et 0 défaites et j'ai pas encore distribué mes points pour le moment
Citer : Posté le 04/07/2014 18:11 | #
Garde les pour des TP je pense
Si tu veux faire "guérisseur"
Citer : Posté le 04/07/2014 18:32 | #
Je sais pas encore, je vais réfléchir, en attendant mon autre lvl 10 est boosté à 15 dans la force et le reste dans la vie
Citer : Posté le 04/07/2014 18:51 | #
On est d'accord que ça revient à peu près au même ?
[b][blue]if[/blue][/b] (getCellDistance(getCell(),getCell(enemy)) < 2) moveAwayFrom(enemy, [maroon]2[/maroon]-getCellDistance(getCell(),getCell(enemy))); [green]// si on est collé à lui on recule[/green]
et
x)
Citer : Posté le 04/07/2014 18:56 | #
Oui. Tu remplace ainsi un gros code bourrin par une petite instruction
Ajouté le 04/07/2014 à 18:57 :
Par contre, si tu as la puce SPARK, tu peux regarder si tu peux tirer à l'arme depuis la case dans laquelle t'es (dans ce cas on tire), et sinon si tu peux utiliser la puce => tu rentabilise tes TP
Ajouté le 04/07/2014 à 18:58 :
Citer : Posté le 04/07/2014 19:00 | #
Ah non moi ce q due je fais c'est que je lui dit d'attaquer au maximum, et ensuite je lui dit d'utiliser la chip, du coup si ill peut pas attaquer il a pas perdu de PT et donc peut utiliser la chip, sinon non
Citer : Posté le 04/07/2014 19:09 | #
Pas bête, j'ai modifié et j'ai gagné 10 lignes
Citer : Posté le 04/07/2014 19:10 | #
C'est plus une astuce et moins conventionnel, mais ça marche
Citer : Posté le 04/07/2014 23:59 | #
A la toute fin de votre code, je vous conseille de mettre ceci :
debugE("I killed " + getName(enemy) + " !");
Ca met un message en rouge dans le rapport lorsque vous tuez un ennemi, ça met en évidence les kills de chacun sans se faire chier à tout éplucher