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 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
Citer : Posté le 05/07/2014 00:00 | #
Merci pour l'astuce je vais le rajouter
Citer : Posté le 05/07/2014 00:02 | #
Et surtout ça ne coute rien en TP/MP
Ajouté le 05/07/2014 à 00:34 :
Pour ce qui est du capital, je suis passé à une distribution du type :
75% -> PV
25% -> Force
Ce qui me permet de rester longtemps en vie contre des types qui se régénèrent régulièrement.
Citer : Posté le 05/07/2014 08:07 | #
Au fait, faudrait qu'on deffinisse une stat de team, avec des heal, des dps, des tanks, des soutiens, etc.
envie de plonger dans la mer pour ramasser des tresors? => ballon sea
envie de sauver l'univers dans un jeu avec une longue durée de vie? => saviors of the future
un add-in addictif avec plein de secret et de trophées => evasion survival
un shmup bien dur et sadique => saviors 2
merci a tout le monde pour son soutien
zelda prizm de smashmaster (en esperant qu'il puisse le finir)
les tests de marmotti
un RPG de dark storm
(dont je connais le nom, mais pas vous )Arcuz !Citer : Posté le 05/07/2014 08:47 | #
On a déjà commencé ça Dodormeur, mon Padawan est du type DPS donc laissez le dans lap remière équipe, ensuite faut voir avec le reste d l'équipe comment on s'organise (la 2ème team est désavantagée)
Citer : Posté le 05/07/2014 08:56 | #
Bon, je veux bien faire le tank, a savoir j'ai bcp de pv et je me soigne, je fonce sur les ennemy comme ca ils m'aggro
envie de plonger dans la mer pour ramasser des tresors? => ballon sea
envie de sauver l'univers dans un jeu avec une longue durée de vie? => saviors of the future
un add-in addictif avec plein de secret et de trophées => evasion survival
un shmup bien dur et sadique => saviors 2
merci a tout le monde pour son soutien
zelda prizm de smashmaster (en esperant qu'il puisse le finir)
les tests de marmotti
un RPG de dark storm
(dont je connais le nom, mais pas vous )Arcuz !Citer : Posté le 05/07/2014 10:34 | #
Et pourquoi ne pas faire une team composée que de gros bourrins ? Cf mon post sur le topic inGame
Ajouté le 05/07/2014 à 10:45 :
Bon, vu que l'on me demande le code de mon IA et que je refuse de le donner tout cuit, je ne mettrai à disposition que son mode de fonctionnement (commentaires + fonctions)
var weapon_used = WEAPON_DOUBLE_GUN;
var enemy = getNearestEnemy();
var distance;
// On prend le pistolet si ce n'est déjà fait
getWeapon(), setWeapon()
// On se déplace
distance, getCellDistance(), getCell() // calcul de la distance à l'ennemi
if, getWeaponMaxScope(), getWeapon() , getMP() // si on est loin
moveToward(), distance, getWeaponMaxScope(), getWeapon(), getMP() // on reste hors de portée
else
moveTowardCell(), getCellToUseWeapon()
// en tout dernier recours, si le fusil à pompe marche pas, on utilise le flingue
if, getCellDistance(), getCell(), getWeaponMinScope()
setWeapon()
// on utilise les puces de défense/boost si ça chauffe bientôt
if, getCellDistance(), getCell(), getWeaponMaxScope(), getWeapon(), getMP(), getTP(), getChipCost(), getWeaponCost() // Si on est près et que on a de quoi tirer après
useChip(), getLeek()
// on tire tant qu'on peut
while, getTP(), getWeaponCost()
if, useWeapon(), USE_SUCCESS
break
// on use les puce d'attaque tant qu'on peut
while, getTP(), getWeaponCost()
if, useChip(), USE_SUCCESS
break
}
// si le mec est mort on le dit
if(isDead(enemy))
debugE("just killed " + getName(enemy) + " !");
Citer : Posté le 05/07/2014 10:51 | #
Ton IA est gigantesque
Voici la mienne :
useChip()
//On prend dès le début l'arme qu'on va utiliser durant la partie pour ne pas perdre de points d'actions ensuite
(getWeapon(), setWeapon()
//On énonce un message dès le début qui ne se répétera pas
(getTurn(), say()
//On déclare 2 variables
var ally = getNearestAlly();
var enemy = getNearestEnemy();
//On fait en sorte que si l'ennemi est proche de soi, on reste à distance
moveTowardCell(getCellToUseWeapon(enemy));
//On tape 2 fois
useWeapon(enemy);
useWeapon(enemy);
Niveau 12 minimum, j'espère que ça vous aidera car ça marche bien dès le début !
Citer : Posté le 05/07/2014 11:32 | #
randInt(1,100):dire;
[green]Manque un truc ici mais quoi ?[/green]
if(dire==1)say("Vous ne perdez rien pour attendre bande de noobs !");
J'suis pas sur, j'ai plus codé depuis un petit temps, mais ceci est juste ?$
Edit: manque un truc ...
Citer : Posté le 05/07/2014 11:39 | #
C'est
mais tu pourrais raccourcir en
ou en
Coïncidence ? Je ne pense pas.
Citer : Posté le 05/07/2014 11:44 | #
Classe merci
Citer : Posté le 05/07/2014 11:49 | #
J'ai légèrement modifié mon IA pour la rendre plus performante :
var maxMP = 4;
var best_weapon = WEAPON_DOUBLE_GUN;
var enemy = getNearestEnemy();
var distance, fight_distance = getWeaponMaxScope(getWeapon(enemy)) + getMP(enemy);
// 1 On prend l'arme principal si ce n'est déjà fait
// 2 Si on est pas coincé, on prend la meilleure arme
// 3 On se déplace intelligemment
// 4 On recalcule la distance à l'ennemi
// 5 En tout dernier recours, si la meilleure arme ne marche pas, on utilise une bonne arme
// 6 On utilise les puces de boost si ça chauffe bientôt
// 7 On utilise les puces de défense si ça chauffe déjà
// 8 Si on a perdu trop de vie on en récupère
// 9 On tire tant qu'on peut
// 10 On use les puce d'attaque tant qu'on peut
// 11 Si l'ennemi est mort durant le tour, on le dit
Ajouté le 05/07/2014 à 11:49 :
Soit 71 lignes de code
Citer : Posté le 05/07/2014 11:53 | #
J'essaye de faire en sorte de me déplacer d'une case si je ne peux pas tirer avec le double gun si je suis trop près, le problème c'est que quand je suis loin je fuis bêtement, une idée?
Le code:
if(success==USE_SUCCESS)say("Prends ça!!!!");
if(success=USE_INVALID_POSITION)moveAwayFrom(enemy, 1);
Citer : Posté le 05/07/2014 11:55 | #
Tu as oublié un "=" !
Sinon, tu n'as qu'à regarder la distance entre toi et l'ennemi !
Coïncidence ? Je ne pense pas.
Citer : Posté le 05/07/2014 11:57 | #
Effectivement, bon je vais voir ça, merci.
Citer : Posté le 05/07/2014 11:58 | #
Oh rage, oh désespoir, oh poireau ennemi !
N'ai-je donc tant vécu, pour qu'on n'ait que 20 combats par jour ?
Mon poireau, qu'avec respect, tout le potager admire,
Mon poireau, qui tant de fois, a cassé cette empire,
Tant de fois pété le trône du roi,
Trahi donc ma querelle, et ne fait plus de combats ?
Pong400
PierrePaCiseaux (CP400)
Les Triangles
Menu
ASCII
Nombres premiers
Citer : Posté le 05/07/2014 12:03 | #
Faites attention, say utilise un point d'action !
Vitesse des fonctions en Basic Casio | 7 days CPC | Casio Universal Wiki | Tutoriel Basic Casio
>>> Give me a click Brother <<< >>> Teste mon générateur de mots nouveaux <<<
>>> Random Youtube Video <<<
Citer : Posté le 05/07/2014 12:04 | #
Oups, je vais peut-être l'enlever du coup !
Pong400
PierrePaCiseaux (CP400)
Les Triangles
Menu
ASCII
Nombres premiers
Citer : Posté le 05/07/2014 12:04 | #
Ah ok, je n'avais pas vu.
Par contre je ne trouve pas la fonction qui permet de connaître la distance avec l'ennemi.
Citer : Posté le 05/07/2014 12:09 | #
Mais on peu l'utiliser quand il n'en reste plus qu'un... (de point d'action) et qu'on n'a rien d'autre à faire...
Coïncidence ? Je ne pense pas.
Citer : Posté le 05/07/2014 12:11 | #
J'ai modifié mon code pour obtenir ceci:
moveTowardCell(cell);
while(getTP()>0){
useWeapon(enemy);
}
Et ça marche!