PDA

Voir la version complète : Leekwars.com : des Poireaux et des Hommes (barbus, ou pas)



Kak0
14/06/2014, 20h49
Salut à tous !

J'ouvre un fil de discussion pour parler d'un petit jeu par navigateur nommé Leekwars (http://www.leekwars.com/). On l'a déjà mentionné dans le topic dédié à la programmation (http://forum.canardpc.com/threads/56721-Le-topic-de-la-programmation-string-cha%C3%AEnes-cuir-et-compagnie/page182), mais je pense qu'il mérite aussi l'attention de ceux qui ne baignent pas constamment dans la programmation. Notamment parce que les gens qui se sont découvert une passion naissante pour la programmation (oui c'est toi que je regarde, lecteur assidu de Développez Couché) ou ceux qui voudraient se lancer trouveront là un bien bel outil pour entrer petit à petit dans le bain, sans avoir à se prendre la tête avec des pointeurs et autres trucs un peu bruts de décoffrage pour les débutants, et en abordant une thématique intéressante : l'intelligence artificielle.

Dans Leekwars, le but est de faire en sorte que son poireau batte les poireaux des autres joueurs (d'où le nom). Cependant, il n'est pas ici question de diriger son personnage et de choisir les attaques à lancer en temps réel. Il faut programmer l'intelligence artificielle qui va le contrôler. Un combat consiste donc en un affrontement d'IA, définies à l'avance mais éditables à tout moment, via un éditeur de code fourni par le site. Créer son IA consiste à utiliser les fonctions prédéfinies ('fin, ça consiste à coder quoi), sachant que certaines fonctions se débloquent en faisant progresser son poireau.

Un combat classique consiste en un duel de poireaux. Le premier à faire tomber la vie de l'autre à zéro remporte le match. Pour ce faire, les poireaux peuvent utiliser jusqu'à trois armes et neuf sorts, qu'on choisit parmi le reste des capacités au prix de quelques brouzoufs virtuels (et, bon point, il n'est apparemment pas possible d'acheter cette monnaie avec des espèces sonnantes et trébuchantes). Le combat se déroule en tour par tour, avec les classiques points d'actions et de mouvements, conjugués à des stats qu'on fera évoluer quand notre poireau passera un niveau.

Les combats en équipe sont également présents, sous deux formes. A partir d'un certain niveau, le jeu nous propose d'agrandir notre écurie et de contrôler plusieurs poireaux, afin de défier les autres joueurs non pas dans des duels de poireaux, mais des meules à 2v2 ou 3v3. Ceci demande cependant d'avoir des poireaux d'un niveau élevé. On peut cependant tout simplement s'allier avec d'autres joueurs afin de monter une équipe, qui ira défier d'autres équipes (il y a d'ailleurs déjà une équipe CPC). On peut d'ailleurs définir une IA spéciale pour le jeu en équipe, afin de concevoir des stratégies prenant en compte nos alliés et l'ensemble des ennemis. A part le nombre de participants, les combats en équipe respectent les mêmes règles que les combats en solo.

D'un point de vue apprentissage de la programmation, le gros plus est certainement qu'on a un résultat directement visible : on peut lancer un combat de test après chaque modification du script, et revoir les combats récents, et donc voir son poireau se mettre violemment sur la tronche avec celui d'un joueur lambda. C'est, à mon sens, ce qui fait de ce jeu une entrée en matière parfaite, vu qu'il peut être compliqué de se lancer dans la programmation quand tout ce qu'on voit s'afficher consiste en une suite de chaines de caractères dans une console. Ajouté à ça les quelques mécaniques RPG (équipement, sorts, augmentation des stats) et le contexte légèrement débile (des poireaux quoi, wtf ?) et c'est le cocktail gagnant.

Ca ne fera probablement pas de vous un programmeur expert, mais c'est toujours une initiation à la programmation via scripts et à l'IA. Le seul truc qui me dérange niveau apprentissage, c'est que le fait d'avoir un nombre d'instructions limité par tour, ou du moins le fait que le décompte de ces instructions soit un peu étrange (la limitation en elle-même étant une bonne chose), fait qu'à haut niveau on risque d'avoir un fichier avec des trucs qu'il ne faudrait absolument pas faire en situation normale, juste pour gagner quelques instructions (du moins c'est l'idée que je m'en fais, vu les divers trucs et astuces disponibles sur le forum).

Attention, je parle beaucoup de programmation depuis le début, mais je ne pense pas que vous ayiez besoin de connaissances en programmation pour jouer, il suffit au néophyte de passer par le tutoriel (qu'un programmeur aguerri survolera allègrement pour aller consulter directement la documentation complète) pour pouvoir s'amuser avec son poireau. Au final, si votre but n'est pas de découvrir la programmation ou l'IA, le jeu peut très bien se résumer à un Labrute un peu plus intello.

Si vous vous lancez dans l'aventure, n'hésitez pas à mettre "Kak0" en parrain. Je ne sais pas ce que ça apporte (à part un trophée) mais tant qu'à faire...

http://www.leekwars.com/

Edit : Les profils des canards :

Avathar : http://leekwars.com/farmer=832
Carpette : http://leekwars.com/farmer=910
Deathdigger : http://leekwars.com/farmer=685
Foudge : http://leekwars.com/farmer=693
Ivan Joukov : http://leekwars.com/farmer=849
Kak0 : http://leekwars.com/farmer=773
LaVaBo : http://leekwars.com/farmer=909
PeaK: http://leekwars.com/farmer=822
rOut : http://leekwars.com/farmer=818
Tomaka : http://leekwars.com/farmer=804

La team CPC : The Leek Munchers -> http://leekwars.com/team=109

Foudge
14/06/2014, 21h02
Je me suis inscrit sous le nom d'éleveur "Foudge" :)

edit: mon poireau http://leekwars.com/leek=786

deathdigger
14/06/2014, 21h13
Notre équipe, The Leek Munchers !

http://leekwars.com/team=109

On est en train de mettre en place des scripts spécifiques pour les combats en équipe, et c'est beaucoup plus intéressant à coder qu'en solo :)

Tomaka17
14/06/2014, 21h16
En fouillant un peu avec les URL "http://leekwars.com/farmer=...", j'ai réussi à trouver des canards :siffle:

Flipmode
14/06/2014, 21h16
J'aime pas trop les jeux esport comme ça ...

deathdigger
14/06/2014, 21h31
Pendant que j'y pense, inscrivez-vous aux tournois. Même si vous ne gagnerez pas, vous récolterez toujours un peu de pognon :)

Nattefrost
14/06/2014, 21h35
Suis inscrit, j'ai pas encore commencé à coder le comportement de mon poireau mais je vais m'y mettre, pis faut que je lise la doc aussi.
Nom d'éleveur Nattefrost.

edit : et pis j'ai un projet à finir d'intégrer pour lundi pour l'école :x

deathdigger
14/06/2014, 21h41
Pour la doc, attention à bien filtrer les résultats selon votre niveau (en haut à droite).
Sinon petite astuce pour le début :


if ( getWeapon() == -1 )
{
setWeapon(WEAPON_PISTOL);
}

Pour s'équiper et ne pas cramer un point d'action à chaque tour en rééquipant l'arme à chaque fois :)
Également, pensez à faire des fonctions, notamment pour l'attaque, pour ne pas avoir à vous prendre la tête.
Et pour éviter le plantage de votre poireau (l'icône des engrenages qui tournent en match), avant de faire une boucle, toujours vérifier que toutes les conditions d'action sont requises. Par exemple, équipé du double gun (distance minimum de 2), je me retrouvais parfois à planter lorsque le mec me coinçait et que je ne pouvais plus bouger.
Certaines fonctions de plus haut niveau sont également possible à développer vous même :
Par exemple getTurn() se développe au niveau 12, mais un simple


global tour = 0;

...

tour++;

Et le tour est joué :)

rOut
14/06/2014, 21h53
Je me suis inscrit aussi sous le nom rOut. Ca va chier.

Tomaka17
14/06/2014, 22h05
Mon pro-tip à moi : remplacez


useWeapon(enemy);

Par :


if (useWeapon(enemy) == USE_SUCCESS) {
say("Tiens, prends ça!");
}

Nattefrost
14/06/2014, 22h11
Merci pour les tuyaux :p.
Un truc débile


var actionPoints = getTP();
while(actionPoints > 1) {
useWeapon(enemy);
say('I LL KILL YA');
}

Tomaka17
14/06/2014, 22h42
J'ai regardé un ou deux matchs du premier du classement.
Je m'attendais à une IA démentielle qui se cache derrière les obstacles, fait des switchs d'armes, etc. mais en fait ce sont juste des combats à la con où les poireaux avancent et se tirent dessus comme au niveau 1.

---------- Post added at 22h42 ---------- Previous post was at 22h39 ----------

Haha rOut t'as eu la même idée de script que moi, du coup notre duel a donné un combat de débiles ^_^

rOut
14/06/2014, 22h43
Ouais mais le premier qui bouge a sans doute perdu :p

Tomaka17
14/06/2014, 22h45
Je n'ai plus de combats solo disponibles aujourd'hui pour essayer, mais je pense que notre script démonte à peu près n'importe qui au niveau 5 :)

rOut
14/06/2014, 22h47
20 / 1 perso :cigare:

---------- Post added at 22h47 ---------- Previous post was at 22h46 ----------

Après ça manque encore de fonctions pour des subtilités au niveau 5.

Tomaka17
14/06/2014, 22h48
Je me suis fait honteusement pourir par des poireaux plus haut niveau que moi, notamment deux fois par Foudge qui est niveau 7 ou 8 :rolleyes:

rOut
14/06/2014, 22h54
J'ai fait une team "Les Canards aux Poireaux à la Crême" si ça vous tente d'essayer le coopératif.

---------- Post added at 22h54 ---------- Previous post was at 22h51 ----------


Notre équipe, The Leek Munchers !

http://leekwars.com/team=109

On est en train de mettre en place des scripts spécifiques pour les combats en équipe, et c'est beaucoup plus intéressant à coder qu'en solo :)

Ha je n'avais pas vu.

Nattefrost
14/06/2014, 22h55
Ouais j'ai du gagner 15 combats sur 20 en gros, sur les 5 perdus y en a 3 au tout debut avec le comportement par défaut.
La je viens de tomber sur 'Memory' qui recule à chaque fois qu'il le peut pour être juste à sa distance de tir.

Sinon j'ai vu dans la doc qu'il y avait des fonctions de trigonométrie et autres choses du genre, je vois pas encore l'utilité que ça peut avoir, a moins qu'il y ait des projectiles de type grenade :bave:?

rOut
14/06/2014, 22h57
Ben pour essayer de rester à distance mais sans te faire coller contre un mur. Memory c'est mon poireau (:emo:), et c'est son point faible pour l'instant.

Nattefrost
14/06/2014, 23h04
Haaaa okay :). Ben non mais tu m'as battu donc c'est bien vu de faire ça tu as tiré d'abord du coup j'étais fichu, le mien c'est LeekFrost .

deathdigger
14/06/2014, 23h04
Alors déjà, y'a étincelle qui permet de tirer à travers les obstacles avec une bonne allonge.
Après, c'est un chip qui ne fait pas des masses de dégâts.

Pour les taunts, vaut mieux en faire à la fin s'il reste des points. Oui parce que ça utilise les points d'actions de parler :p
Niveau script, on va garnir un peu le forum privé pour ceux qui sont dans l'équipe :)
http://leekwars.com/team_forum/

Et aussi, vous pouvez tester vos scripts en défiant les autres poireaux (ça ne rapporte rien, mais c'est utile par rapport à une IA un peu figée)

Nattefrost
14/06/2014, 23h10
Le mien ne fait pour l'instant rien à part tirer jusqu'à épuisement des points d'actions. Faut vraiment que je lise la doc.

Kak0
14/06/2014, 23h13
Ca pourrait être sympa de faire une liste des poireaux des canards, histoire de se défier de temps en temps :)
Le mien : http://www.leekwars.com/leek=878


Le mien ne fait pour l'instant rien à part tirer jusqu'à épuisement des points d'actions. Faut vraiment que je lise la doc.
C'est toujours mieux que les poireaux qui sont encore avec l'IA de base. J'en croise encore au niveau 16, c'est un peu affligeant.


Pendant que j'y pense, inscrivez-vous aux tournois. Même si vous ne gagnerez pas, vous récolterez toujours un peu de pognon :)
Je me suis inscrit, ça démarre quand ? J'ai vu certains matchs de tournois, a priori il y a aussi un bonus d'XP (qui augmente au fur et à mesure de la compétition).

Foudge
14/06/2014, 23h49
Je me suis fait honteusement pourir par des poireaux plus haut niveau que moi, notamment deux fois par Foudge qui est niveau 7 ou 8 :rolleyes:Oups désolé, par contre c'est bizarre parce que je n'attaque que des poireaux de mon niveau +/-1, bref ce qui est proposé automatiquement.

edit: d'ailleurs c'est quoi ton nom d'éleveur et le nom de ton poireau ?

Kak0
15/06/2014, 00h10
Maiiiis euuuh stop farmer ma teameuh

Touze
15/06/2014, 00h51
C'est foutrement fun comme jeu, surtout une fois qu'on débloque des fonctions un peu plus utile.

PeaK
15/06/2014, 01h18
Bon, ma technique doit pas encore être au point, je viens de me faire battre par Nattefrost! Mon switch d'arme en fonction de la situation n'est pas ultra efficace... ^_^
En tout ça c'est excellent comme jeu, chouette découverte, merci!

Nattefrost
15/06/2014, 01h21
Ho un canard :p.
Je t'ai pas vu switcher d'arme je crois.

deathdigger
15/06/2014, 01h26
Mon switch d'arme pour tirer au laser est un peu foireux :tired:

PeaK
15/06/2014, 01h27
Non non, effectivement, c'est bien ce que je dit... C'est loin d'être efficace pour le moment! :p

Tomaka17
15/06/2014, 08h53
Pour les taunts, vaut mieux en faire à la fin s'il reste des points. Oui parce que ça utilise les points d'actions de parler :p

Ahhhhh, c'est pour ça qu'il ne me restait jamais assez de points pour lancer mon chip bien que mathématiquement ça devrait passer!

---------- Post added at 08h53 ---------- Previous post was at 08h52 ----------


edit: d'ailleurs c'est quoi ton nom d'éleveur et le nom de ton poireau ?

tomaka et lik

Foudge
15/06/2014, 10h40
tomaka et likRamène toi dans notre team ! :) http://leekwars.com/team=109

edit: j'vois que la demande est déjà faite ;)

Kak0
15/06/2014, 11h25
A mon tour de balancer mon pro-tip :

function checkWinAndTaunt(enemy)
{
if(getLife(enemy) <= 0 && getTP() >= 1)
{
say("Encore une victoire de canard !");
}
}

A utiliser autant que faire se peut :p

deathdigger
15/06/2014, 11h47
A mon tour de balancer mon pro-tip :

function checkWinAndTaunt(enemy)
{
if(isAlive(enemy) <= 0 && getTP() >= 1)
{
say("Encore une victoire de canard !");
}
}

A utiliser autant que faire se peut :p

Fixayd !

Bon, j'ai cogité pas mal, va falloir que je fasse une fonction qui va tester quelle arme je peux utiliser selon mon tour et le nombre de points de mobilité (en prenant en compte le laser qui tire tout droit), vérifier entre toutes celles utilisables, celle qui fera le plus de dégâts et enfin, switcher puis tirer. Je sens que ça va être coton :tired:

Kak0
15/06/2014, 12h14
Fixayd le fix :p


function checkWinAndTaunt(enemy)
{
if(!isAlive(enemy) && getTP() >= 1)
{
say("Encore une victoire de canard !");
}
}

Robix66
15/06/2014, 12h17
Ramène toi dans notre team ! :) http://leekwars.com/team=109

edit: j'vois que la demande est déjà faite ;)

Je m'incruste aussi. :ninja:

PeaK
15/06/2014, 12h20
Et re Fixayd :p


function checkWinAndTaunt(enemy)
{
if(isDead(enemy) && getTP() >= 1)
{
say("Encore une victoire de canard !");
}
}




Bon, j'ai cogité pas mal, va falloir que je fasse une fonction qui va tester quelle arme je peux utiliser selon mon tour et le nombre de points de mobilité (en prenant en compte le laser qui tire tout droit), vérifier entre toutes celles utilisables, celle qui fera le plus de dégâts et enfin, switcher puis tirer. Je sens que ça va être coton :tired:

Je voulais faire la même chose, mais en fait derrière il faut aussi prendre en compte les différents sorts possibles, du coup j'ai abandonné je suis sur une stratégie à une seule arme pour le moment :p

Foudge
15/06/2014, 12h20
Attention quand même pour rendre le code compatible avec les combats en équipe il faudrait plutôt utiliser ce code (niveau 16 requis) :

function checkWinAndTaunt()
{
if (getAliveEnemiesCount() <= 0 && getTP() >= 1)
{
say("Encore une victoire de canard !");
}
}

S'il vous reste des TP et que d'autres ennemis sont en vie, mieux vaut les consommer pour quelque chose d'utile :p

Kak0
15/06/2014, 12h47
Attention quand même pour rendre le code compatible avec les combats en équipe il faudrait plutôt utiliser ce code (niveau 16 requis) :

function checkWinAndTaunt()
{
if (getAliveEnemiesCount() <= 0 && getTP() >= 1)
{
say("Encore une victoire de canard !");
}
}

S'il vous reste des TP et que d'autres ennemis sont en vie, mieux vaut les consommer pour quelque chose d'utile :p

Certes. Par contre attention, getAliveEnemiesCount() est une fonction de niveau 16. Utiliser cette fonction avec un poireau d'un niveau 15 ou moins le fera planter.

Avathar
15/06/2014, 12h59
Bon, on va tenter un peu, je suis moins poilu que vous mais j'ai fait ma demande d'intégration a la team :)

Foudge
15/06/2014, 13h37
Bon, on va tenter un peu, je suis moins poilu que vous mais j'ai fait ma demande d'intégration a la team :)Il y a 24h j'étais niveau 2, là j'suis niveau 19, ça va vite si tu joues ;)
Et le fait d'intégrer une team accélère aussi les choses.

Tomaka17
15/06/2014, 14h30
J'ai fait mes 40 combats disponibles, et je ne suis que niveau 11 avec 35/4/8.
Comment vous avez fait ceux qui ont commencé le même jour que moi et qui sont niveau 13/14 ?

Nattefrost
15/06/2014, 14h39
Hmm rien de spécial, j'ai fait tous mes combats. T'as activé les agressions? Et puis y a certainement les matchs d'équipe aussi, comme tu n'es arrivé que cette nuit tu as raté quelques matchs.

PeaK
15/06/2014, 15h35
J'ai fait mes 40 combats disponibles, et je ne suis que niveau 11 avec 35/4/8.
Comment vous avez fait ceux qui ont commencé le même jour que moi et qui sont niveau 13/14 ?

Pareil, rien de spécial. Je suis arrivé vers 0h30, j'ai fais tous mes matchs. Par contre effectivement j'ai participé à quelques matchs en équipe, et surtout je me suis pas mal fait agresser. J'ai un ratio de 41/1/5, donc relativement proche du tiens.

Hem
15/06/2014, 16h27
Première session et un petit 20/0/4. (3 défaites pendant que j'édité l'ia x) )
C'est vraiment intéressant, faut cogiter un peu pour réduire le facteur chance au maximum et je présume que la chance disparaît complètement à plus haut niveau.

Ashlook
15/06/2014, 16h45
Bon je viens de m'inscrire, je vais aller peteay du poireau §

Akwantik
15/06/2014, 17h53
Je m'y suis mis aussi c'est vraiment fun et y'a de quoi se casser un peu la tête !

J'ai fait une demande pour la team (Multipassta)

Ashlook
15/06/2014, 18h14
Bon c'est marrant mais au début on est obligé de faire avancer not' poireaux même si l’ennemi est à portée de tir en fait ? Bon ça bouffe pas de TP de le faire avancer mais bon.

deathdigger
15/06/2014, 18h21
Ben non t'es pas obligé :
if (getCellToUseWeapon(toAttaque) == getCell())
tu attaques

Ashlook
15/06/2014, 18h26
Ha merde je pensais que c’était une fonction de plus haut niveau :o. My bad.

Azy j'arrive plus à attaquer et je peux plus tester mes scripts §§

Ivan Joukov
15/06/2014, 18h30
http://leekwars.com/farmer=849

J'ai pas encore commencé et j'ai pas codé depuis des tutoriaux de magazines il y a 15 ans. Mais j'ai bien le goût d'essayer ;)



EDIT : Bordel je suis déjà addict. Par contre avis d'expert je vais partager mon code de débutant :



if ( getCellToUseWeapon(enemy) != getCell() && getMP() > 0 )

{
moveToward(enemy);
}

while (getTP() >= 3 )
{
useWeapon(enemy);
}

if ( getMP() >= 0 && getCellToUseWeapon(enemy) == getCell() )
{
moveAwayFrom(enemy);
}


Pourquoi il y a les engrenages pendant le while qui permet de tirer tant que j'ai des points d'actions ?
Peut-on faire un check au court du mouvement pour s'arrêter pile à portée, tirer, repartir après avec les MP restants ? Mettre un while à la place du premier if ?

Je ne comprends pas non plus l'utilité de function, notamment sur votre taunt de mort pourquoi ne pas faire une condition simplement ? EDIT : C'est bon j'ai compris ;)

Hem
15/06/2014, 20h42
Tu peux faire un moveToward sur une cellule à la place de l'ennemi, par exemple aller sur une cellule qui te permettra de tirer sur l'ennemi. Une fois le déplacement fini t'essaies de tirer. Après te reste juste à repartir en arrière.
En toute logique tu peux pas "intervenir" pendant l’exécution d'un appel de fonction. Donc avec ton moveToward(enemy), quoi qu'il arrive à la fin ton poireau se trouvera au plus près de l'ennemi.

Ivan Joukov
15/06/2014, 20h51
Oui ça marche bien si ce n'est que j'avance trop j'aimerais juste arriver à portée, j'essayerai ton moveToward sur cellule (ça existe tiens, moveTowardCell) :)

Je dois définir une var à mettre dans le moveTowardCell() créée avec getCellToUseWeapon à chaque tour donc ? Je peux faire ça comment en terme de syntaxe ? J'imagine que moveTowardCell( getCellToUseWeapon() ); ne marche pas tel quel ? ;)

PeaK
15/06/2014, 20h52
Tu peux faire un moveToward sur une cellule à la place de l'ennemi, par exemple aller sur une cellule qui te permettra de tirer sur l'ennemi. Une fois le déplacement fini t'essaies de tirer. Après te reste juste à repartir en arrière.
En toute logique tu peux pas "intervenir" pendant l’exécution d'un appel de fonction. Donc avec ton moveToward(enemy), quoi qu'il arrive à la fin ton poireau se trouvera au plus près de l'ennemi.

Mais tu peux quand même préciser de combien de case tu veux avancer vers lui. En faisant "moveToward(enemy, 2)" tu te déplace de 2 cases uniquement (donc il te reste 2 PM pour repartir si besoin).

EDIT: Pour préciser un peu, on peut repartir avec la fonction moveAwayFrom(enemy).

Hem
15/06/2014, 21h06
J'imagine que moveTowardCell( getCellToUseWeapon() ); ne marche pas tel quel ? ;)
Sisi. Y'a pas de raison que ça ne fonctionne pas.

Là je suis entrain de chercher comment prendre en compte la topographie du terrain, mais malheureusement toutes les fonctions utiles à ce sujet arrivent très tard :/
Je pourrais tenter une comparaison entre toutes les cellules sur lesquels je peux aller et toutes les cellules sur lesquelles l'ennemi peut aller, mais ça risque de juste être lourdingue.

Ivan Joukov
15/06/2014, 21h13
Sisi. Y'a pas de raison que ça ne fonctionne pas.

Trop facile la programmation :cigare: J'essaye et je vous en dis des nouvelles. En attendant j'améliorais mon code initial qui, s'il doit être une usine à gaz pour des codeurs expert, marchait enfin optimalement :)


EDIT : Oh bordel, ça marche à la perfection. Il avance d'une case si besoin, tire ses 2 coups, recule de 3 cases. J'ai mon script hit and run fonctionnel ! Maintenant il faudra se servir de la topographie pour que la fuite se fasse à couvert, mais j'ai peur que ça soit pas dans mes humbles cordes de quelqu'un qui savait pas coder il y a 3 heures ;)



function HitAndRun(enemy)
{
if ( getMP() > 0 && getCellToUseWeapon(enemy) != getCell() ) // Si trop loin, on avance

{
moveTowardCell( getCellToUseWeapon(enemy) );

while ( getTP() >= 3 && getCellToUseWeapon(enemy) == getCell() ) // et si on peut on tire
{
useWeapon(enemy);
}
}

else while ( getTP() >= 3 ) // Sinon on tire direct tant qu'on a des points
{
useWeapon(enemy);
}

if ( getMP() > 0 && getCellToUseWeapon(enemy) == getCell() ) // On fuit s'il nous reste des MP
{
moveAwayFrom(enemy);
}
}


Plus qu'à rajouter un petit patch de heal quand je serai niveau 10 pour utiliser ces 2 TP restants à la fin de chaque tour. Build fouine incoming :)

rOut
15/06/2014, 21h16
En fait vous savez si getCellToUseWeapon prend en compte les obstacles ?

Ivan Joukov
15/06/2014, 21h20
D'après mes tests il semblerait que oui.

Hem
15/06/2014, 21h21
En fait vous savez si getCellToUseWeapon prend en compte les obstacles ?

Oui. Ca renvoi une case depuis laquelle tu peux tirer.

Ashlook
15/06/2014, 22h03
http://leekwars.com/farmer=849

J'ai pas encore commencé et j'ai pas codé depuis des tutoriaux de magazines il y a 15 ans. Mais j'ai bien le goût d'essayer ;)



EDIT : Bordel je suis déjà addict. Par contre avis d'expert je vais partager mon code de débutant :



if ( getCellToUseWeapon(enemy) != getCell() && getMP() > 0 )

{
moveToward(enemy);
}

while (getTP() >= 3 )
{
useWeapon(enemy);
}

if ( getMP() >= 0 && getCellToUseWeapon(enemy) == getCell() )
{
moveAwayFrom(enemy);
}


Pourquoi il y a les engrenages pendant le while qui permet de tirer tant que j'ai des points d'actions ?
C'est quand t'es pas à portée, ta fonction useWeapon() n'utilise pas de TP, du coup du boucle à l'infini.

Peut-on faire un check au court du mouvement pour s'arrêter pile à portée, tirer, repartir après avec les MP restants ? Mettre un while à la place du premier if ?

Je ne comprends pas non plus l'utilité de function, notamment sur votre taunt de mort pourquoi ne pas faire une condition simplement ? EDIT : C'est bon j'ai compris ;)


Mon code so far, avec l'utilisation d'un chip :



// On prend le pistolet
if(getWeapon() == -1){
setWeapon(WEAPON_PISTOL);
}

// On récupère l'ennemi le plus proche
var enemy = getNearestEnemy();

if (getCellToUseWeapon(enemy) != getCell()){
moveToward(enemy);
}

while(useWeapon(enemy) == USE_SUCCESS) {}

if(getTP() >= 2){
useChip(CHIP_SHOCK, enemy);
}

if(isDead(enemy)){say("Encore une victoire de canard !");}

Par contre j'ai pas voulu me faire chier avec du H&R pour l'instant, je trouve que c'est pas utile au début, les déplacement ne dépensent pas de TP.

Ivan Joukov
15/06/2014, 22h07
Ouaip j'avais fini par trouver et corriger dans ma dernière mouture avec un code plus propre, merci :)

Hem
15/06/2014, 22h25
Par contre j'ai pas voulu me faire chier avec du H&R pour l'instant, je trouve que c'est pas utile au début, les déplacement ne dépensent pas de TP.

Par moment ça permet d’être totalement safe pendant un tour.
J'essaie d'améliorer ça pour que mon poireau se mette à couvert dès qu'il le peut, mais c'est pas si simple.

Ivan Joukov
15/06/2014, 22h32
J'aimerais créer une couverture plus tard aussi mais faudra que je me plonge dedans. Et puis là je vise surtout le point de mouvement supplémentaire dès que possible, mais j'ai peur que tout ce temps à économiser de l'xp me rende vraiment naze par rapport aux poireaux de mon niveau qui auront tout dépensé.

Hem
15/06/2014, 23h27
Uh la loose.
J'étais parti dans le développement de mon truc et au bout d'une heure je me rend compte que le simple fait de vérifier si une case est un obstacle, demande d'être lv 21. Tout tombe à l'eau.

Ashlook
15/06/2014, 23h35
Trop facile la programmation :cigare: J'essaye et je vous en dis des nouvelles. En attendant j'améliorais mon code initial qui, s'il doit être une usine à gaz pour des codeurs expert, marchait enfin optimalement :)


EDIT : Oh bordel, ça marche à la perfection. Il avance d'une case si besoin, tire ses 2 coups, recule de 3 cases. J'ai mon script hit and run fonctionnel ! Maintenant il faudra se servir de la topographie pour que la fuite se fasse à couvert, mais j'ai peur que ça soit pas dans mes humbles cordes de quelqu'un qui savait pas coder il y a 3 heures ;)



function HitAndRun(enemy)
{
if ( getMP() > 0 && getCellToUseWeapon(enemy) != getCell() ) // Si trop loin, on avance

{
moveTowardCell( getCellToUseWeapon(enemy) );

while ( getTP() >= 3 && getCellToUseWeapon(enemy) == getCell() ) // et si on peut on tire
{
useWeapon(enemy);
}
}

else while ( getTP() >= 3 ) // Sinon on tire direct tant qu'on a des points
{
useWeapon(enemy);
}

if ( getMP() > 0 && getCellToUseWeapon(enemy) == getCell() ) // On fuit s'il nous reste des MP
{
moveAwayFrom(enemy);
}
}


Plus qu'à rajouter un petit patch de heal quand je serai niveau 10 pour utiliser ces 2 TP restants à la fin de chaque tour. Build fouine incoming :)

J'ai fait du H&R en fait c'est marrant :p, au final v'la mon script :


function hitAndRun(cible)
{
while(getCellToUseWeapon(cible) != getCell() && getMP() > 0) moveToward(cible,1); //On est pas à portée et on a encore des points de mouvement

while(useWeapon(cible) == USE_SUCCESS);

if(getMP() > 0) moveAwayFrom(cible);//Il nous reste des MP, on recule.
}

Ivan Joukov
15/06/2014, 23h46
En effet c'est plus propre que moi. Par contre ton while USE_SUCCESS risque de stopper ton action si tu foires un tir (sur le pourcentage d'échec possible de l'arme) aussi non ?

J'ajouterais :


while(useWeapon(enemy) == USE_SUCCESS || USE_FAILED);

Qui devrait permettre de retenter de tirer après un miss.

Ashlook
15/06/2014, 23h56
Ouais c'est pas faux, je vais le rajouter :p.

En fait ca serait plus logique de faire :


while(useWeapon(enemy) != USE_NOT_ENOUGH_TP);

Mais je suis pas sur que si la cible n'existe pas ou qu'elle est invalide ça nous enlève des TP :/.

Ivan Joukov
15/06/2014, 23h59
Ouais bah ça marche pas, je viens d'avoir un fail et il a pas tiré une seconde fois...

Hem
16/06/2014, 00h06
Ouais bah ça marche pas, je viens d'avoir un fail et il a pas tiré une seconde fois...

Merci de me le faire remarquer, justement je viens de perdre à cause de ça.

Ashlook
16/06/2014, 00h08
Ouais pareil pour moi :D.

Kak0
16/06/2014, 00h08
Ouais c'est pas faux, je vais le rajouter :p.

En fait ca serait plus logique de faire :


while(useWeapon(enemy) != USE_NOT_ENOUGH_TP);

Mais je suis pas sur que si la cible n'existe pas ou qu'elle est invalide ça nous enlève des TP :/.

On ne perd de TP que si le résultat de useWeapon est USE_SUCCESS ou USE_FAILED (en somme si le poireau pouvait effectivement tirer sur l'enemi en paramètre). Du coup, si ton ennemi n'est pas à portée, tu as une boucle infinie.

Par contre je dois avouer que je ne comprends pas pourquoi il tire une première fois et pas une seconde fois. Peut-être que le script n'aime pas les boucles while sans accolades ?

Hem
16/06/2014, 00h22
Bon c'est la merde. Mon script fonctionne très bien, sauf quand l'ennemi est amorphe.
Résultat mon bot veut pas se mettre en danger et reste à la limite de portée d'un adversaire qui bouge pas, et comme j'ai pas encore accès aux nombre de tours, bah il se pass rien et match nul.

Ashlook
16/06/2014, 00h26
On ne perd de TP que si le résultat de useWeapon est USE_SUCCESS ou USE_FAILED (en somme si le poireau pouvait effectivement tirer sur l'enemi en paramètre). Du coup, si ton ennemi n'est pas à portée, tu as une boucle infinie.

Par contre je dois avouer que je ne comprends pas pourquoi il tire une première fois et pas une seconde fois. Peut-être que le script n'aime pas les boucles while sans accolades ?

Sisi ça marche, mais quand on a un échec sur le 1er tir, il ne tire pas le 2nd alors que la condition c'est sucés ou échec.

Ivan Joukov
16/06/2014, 00h37
Bon c'est la merde. Mon script fonctionne très bien, sauf quand l'ennemi est amorphe.
Résultat mon bot veut pas se mettre en danger et reste à la limite de portée d'un adversaire qui bouge pas, et comme j'ai pas encore accès aux nombre de tours, bah il se pass rien et match nul.

J'ai suivi le conseil de la première page pour me créer une variable globale qui compte les tours.

En début de code :


global tour = 1;

Et à la fin


tour++;

Donc par exemple mon taunt de premier tour est fait comme ça :


if (tour == 1) say("Bonne chance camarade " + getName(getNearestEnemy()) + " !");

Hem
16/06/2014, 00h49
Ah nickel merci.

Ashlook
16/06/2014, 01h03
Sinon t'attends le niveau 12 :D.

Foudge
16/06/2014, 01h15
while(useWeapon(enemy) == USE_SUCCESS || USE_FAILED);

Qui devrait permettre de retenter de tirer après un miss.

Ouais bah ça marche pas, je viens d'avoir un fail et il a pas tiré une seconde fois...
Pour que ça marche, il faut utiliser une variable pour stocker la valeur retour :

var ret = USE_SUCCESS;
while (ret == USE_SUCCESS || ret == USE_FAILED)
{
ret = useWeapon(enemy);
}

Hem
16/06/2014, 01h16
L'est frustrant ce jeu, t'as plein d'idée qui te viennent en tête, tu commences à réfléchir dessus et tu te rends compte que tu peux rien faire sans des fonctions qui se débloques plus tard.
Donc t'améliores ton bot avec ce que tu peux, ça marche nickel en test. Puis tu te rends compte que c'est foireux quand tu tombes sur des originaux et que tu peux pas régler les bugs avant de débloquer de nouveaux trucs.

Siscka
16/06/2014, 02h07
Y'a un tuto ?

Kak0
16/06/2014, 06h22
Y'a un tuto ?
Ouaip : http://www.leekwars.com/help

deathdigger
16/06/2014, 07h26
Bon c'est la merde. Mon script fonctionne très bien, sauf quand l'ennemi est amorphe.
Résultat mon bot veut pas se mettre en danger et reste à la limite de portée d'un adversaire qui bouge pas, et comme j'ai pas encore accès aux nombre de tours, bah il se pass rien et match nul.

La même ici avec mon poireau qui restait bloqué. Au final, si à la fin du tour il me reste des MP, je les dépense en avançant ;)
Tu peux aussi faire un globale qui en fin de tour prend la cell de l'ennemi, que tu compares le tour d'après avec sa position actuelle pour vérifier s'il a bougé ;)

Foudge
16/06/2014, 10h17
Y'a un tuto ?Oui. De plus le jeu est très progressif (système de niveaux), t'as donc le temps d'assimiler les concepts et de faire évoluer ton IA au fur et à mesurer des nouveautés, sans être rapidement dépassé par les autres qui auraient déjà des notions de dev et/ou d'IA.

Siscka
16/06/2014, 10h21
J'ai que quelques bases en C :o

Merci, ça a l'air marrant.

deathdigger
16/06/2014, 10h31
En plus, ce qu'il faut savoir, c'est que les purs devs (genre ceux qui font du C++) sont à se prendre la tête pour avoir un code joli, mais derrière qui ne marche pas :ninja:
Mention spéciale à un canard que je ne citerai pas qui, à 23h58 (le compteur de combat est réinitialisé à 00h00) n'avait toujours pas de code fonctionnel, et qui nous sort comme excuse, qu'il a malencontreusement supprimé son script :siffle:

Sinon, va falloir commencer à penser à la stratégie d'équipe :
- Définir les cibles prioritaires
- Se diviser en deux équipes avec 4 attaquants et 2 supports
- Trouver un moyen pour que les supports restent toujours hors de portée des ennemies et à portée de chip des attaquants
- ???
- Profit !

Nattefrost
16/06/2014, 10h45
Je peux pas voir le chat d'équipe derrière le proxy de l'école :'(.

Et pourtant je préfère programmer un poireau que faire du php :p

rOut
16/06/2014, 11h03
En plus, ce qu'il faut savoir, c'est que les purs devs (genre ceux qui font du C++) sont à se prendre la tête pour avoir un code joli, mais derrière qui ne marche pas :ninja:
Mention spéciale à un canard que je ne citerai pas qui, à 23h58 (le compteur de combat est réinitialisé à 00h00) n'avait toujours pas de code fonctionnel, et qui nous sort comme excuse, qu'il a malencontreusement supprimé son script :siffle:

Sinon, va falloir commencer à penser à la stratégie d'équipe :
- Définir les cibles prioritaires
- Se diviser en deux équipes avec 4 attaquants et 2 supports
- Trouver un moyen pour que les supports restent toujours hors de portée des ennemies et à portée de chip des attaquants
- ???
- Profit !

N'empêche que ma nouvelle IA déboîte pas mal.

Apres, le language a quelques spécificités un peu chelou. Genre nulle == 0 (c'est plutôt classique mais comme les identifiants de poireaux ou cellules sont des entiers et que 0 est un id valide, c'est trompeur), ou [] == null == [1,2,...] == "123", ou encore des fonctions bugguees comme subArray. Mais une fois qu'on le sait ça va.

deathdigger
16/06/2014, 11h20
Ouais, y'a 2 3 trucs bizarres, perso, j'ai une boucle qui plante à la fin si je bute le poireau adverse. Et pourtant, j'ai bien mis un isAlive avant (mais non, il essaie de chopper une distance entre ma Cell() et celle de null). Sinon, petit bug sur le match : http://leekwars.com/fight=152110
Je suis sensé focus Patatheal, et il focus sur Patator.

Edit :


PeaK
9:18
Je me posais la même question, moi aussi j'ai focus Patator...
Ce serait pas à cause du "if target == null --> target = enemies[i]" ? Si Patatheal est le leek 0, on le remplace...

Ouais, c'est peut-être ça.

Ashlook
16/06/2014, 11h29
Pour que ça marche, il faut utiliser une variable pour stocker la valeur retour :

var ret = USE_SUCCESS;
while (ret == USE_SUCCESS || ret == USE_FAILED)
{
ret = useWeapon(enemy);
}

C'est ce que je pensais essayer, merci.

PeaK
16/06/2014, 12h07
C'est dommage qu'on ne puisse pas reset les stats... Dans mes premiers levels j'avais tout mis dans la Fréquence, ce qui ne sert strictement à rien :tired::|

Foudge
16/06/2014, 12h08
Ceci dit, vu le nombre de TP qu'on possède, on tire au max 2 fois. Je ne pense pas que ça vaille le coup de faire des boucle while potentiellement infinie.
C'est presque plus simple de faire :

var ret = useWeapon(enemy);
if (ret == USE_SUCCESS || ret == USE_FAILED)
{
useWeapon(enemy);
}
En plus par la suite tu seras amené à étudier plus minutieusement le résultat du 1er tir pour choisir une 2ème action qui ne sera pas forcément un tir, ou alors pas avec la même arme.

PeaK
16/06/2014, 12h11
Ou plus simple (mais plus crade ?):



useWeapon(enemy);
useWeapon(enemy);


^_^

Foudge
16/06/2014, 12h11
C'est ce que je pensais essayer, merci.Chez moi ça marchait, donc ya pas de raison ;)

Ceci dit, vu le nombre de TP qu'on possède, on tire au max 2 fois. Je ne pense pas que ça vaille le coup de faire des boucles while potentiellement infinie.
C'est presque plus simple de faire :

var ret = useWeapon(enemy);
if (ret == USE_SUCCESS || ret == USE_FAILED)
{
useWeapon(enemy);
}
else
{
//autre type d'attaque / défense / fuite / autre
}
Ca permet d'étudier le résultat du 1er tir pour choisir une 2ème action qui ne sera pas forcément un tir, ou alors pas avec la même arme.

Ashlook
16/06/2014, 12h20
Wi c'est pas faux.

deathdigger
16/06/2014, 15h08
Ou plus simple (mais plus crade ?):



useWeapon(enemy);
useWeapon(enemy);


^_^

C'est ce que je fais en gros, avec la fonction attaque qui vérifie si tu peux tirer :)

PeaK
16/06/2014, 16h12
Je l'utilise tel quel pour tirer sur l'ennemi le plus proche (en équipe), si ma cible est trop loin et que je n'ai rien d'autre à faire. Ça fonctionne bien, quand il n'y a pas d'autres vérifications à faire, c'est suffisant. :)

Kak0
16/06/2014, 17h13
2 topics très intéressants, à lire absolument :
http://www.leekwars.com/forum/category-7/topic-163
http://www.leekwars.com/forum/category-7/topic-311

Le premier répond à pas mal de questions qu'un noob peut se poser (notamment celle que je me posais sur les tournois ici-même ^^), à mon sens ça devrait être inclus dans la doc. J'avoue ne pas encore avoir lu le second, j'ai un peu peur de me spoiler le plaisir de la réflexion mais en survolant j'ai vu de bonnes idées.

Kak0
16/06/2014, 19h49
J'avoue les tournois c'est vraiment le bon plan, j'ai perdu en huitièmes (donc 1 match gagné, 1 match perdu) -> 850 XP et 500 habs. Yabon :)

PeaK
16/06/2014, 19h58
Oui, et plus tu progresses dans le tournoi, plus tu en gagnes. En final l'xp est multipliée par 10 :)
Bon par contre aujourd'hui j'ai perdu au premier tour... :|

Ashlook
16/06/2014, 21h04
Naaaaann j'ai perdu en demi, j’étais en train de modifier mon script -_-.

Siscka
17/06/2014, 00h52
J'arrive pas à faire parler mon poireaux.

Say(blabla); ?

Ashlook
17/06/2014, 01h07
say("blabla");

LaVaBo
17/06/2014, 14h15
Je viens de m'inscrire :
http://www.leekwars.com/leek=1045
Avec Kek0 en parrain.

J'ai déjà programmé un peu en C, Cpp (plus trop de souvenirs, à part une haine féroce envers la fonction malloc() ) et java/js, et même en VBA, donc je suis ultra 1337, mais je code quand même comme un sagouin, comme ça, pour le plaisir.

Je vais prendre un peu de temps pour bien lire la doc avant de me lancer, pour l'instant j'ai aucune idée du fonctionnement, mais ça me paraît un truc parfait pour occuper les loooongues requêtes SQL et autres accès de glandite aigüe au boulot.

Ivan Joukov
17/06/2014, 18h59
Un peu fignolé mon hit and run avec les chips débloqués si quelqu'un veut s'y essayer (niveau 16) : http://www.leekwars.com/leek=964

Sinon j'ai quitté l'équipe parce que j'ai pas le temps de me mettre à faire une IA équipe pour le moment :)

Voodoom
17/06/2014, 19h11
Excellent ce petit jeu ! :)
J'ai hâte d'avoir un peu plus de temps pour m'y mettre vraiment.

Foudge
17/06/2014, 19h31
Sinon j'ai quitté l'équipe parce que j'ai pas le temps de me mettre à faire une IA équipe pour le moment :)Tu pouvais simplement demander qu'on mette ton poireau dans les poireaux "non engagés", en attendant que ton IA soit compatible avec le combat en équipe.
D'ailleurs ya pas grand chose à modifier pour le faire. Déjà, le simple fait que ton IA choisisse la même cible que les autres (le + faible des getTotalLife) suffit dans un 1er temps ;)

Ivan Joukov
17/06/2014, 19h32
J'ai pas envie de le faire à l'arrache, je reviendrai en vacances si j'ai le temps de me mettre spécifiquement à ça, et d'ici là je devrai avoir l'accès aux combats d'éleveurs et donc travailler sur des vraies IA de teamplay.

Tomaka17
17/06/2014, 19h38
Je viens de trouver le poireau avec probablement le pire ratio du jeu : http://leekwars.com/leek=30
Son propriétaire ne s'est pas connecté depuis 6 mois, pourtant il continue de participer automatiquement à tous les tournois.

LaVaBo
17/06/2014, 20h11
D'ailleurs ya pas grand chose à modifier pour le faire. Déjà, le simple fait que ton IA choisisse la même cible que les autres (le + faible des getTotalLife) suffit dans un 1er temps ;)

C'est risqué si les adversaires scriptent le fait de fuir quand ils ont le moins de hp de l'équipe, non ?

Foudge
17/06/2014, 21h14
C'est risqué si les adversaires scriptent le fait de fuir quand ils ont le moins de hp de l'équipe, non ?Tu ne peux pas fuir à l'infini, surtout si t'as un troupeau qui s’abat sur toi.
D'autre part, on prend pas celui qui a le moins de PV, mais celui qui en avait le moins au début du combat (celui qui a potentiellement le niveau le plus bas, et donc le plus facile à battre).

Ceci dit, p'tet qu'on devrait prendre en compte également le getLevel et le getAgility, un poireau faible et faiblement protégé, ou au contraire un haut level qui aurait peu d'agilité (donc tout dans la vie et/ou la force) bref un poireau peu protégé au regard de son niveau qui fait très mal quand il attaque, donc très dangereux et à éliminer rapidement. Lire l'un des 2 liens donné par Kak0, il y a une discussion à ce sujet.

Ashlook
17/06/2014, 22h02
Je pense qu'il a bien compris que c'est le plus bas en max life total qu'on focus. Mais il a.pas tord dans ce qu'il dit, parce que si il fuit en se planquant derrière ses potes, le temps qu'on arrive à lui on peut perdre pas mal de vie à se faire dezinguer sur la route non ?

PeaK
17/06/2014, 22h23
Oui effectivement, ça arrive aussi que le poireau le plus faible reste à distance, à l'autre bout de la map. Et du coup le temps qu'on arrive jusqu'à lui, même si on tire sur les autres en passant, on prend parfois très (trop) cher.

Prendre celui qui a le moins de vie total était le moyen le plus simple de cibler une même cible, mais c'est sur qu'il y a de quoi l'améliorer. Par exemple, à partir d'un certain niveau, on peut voir quels sont les chips utilisés par tel ou tel ennemi. Les chips, la force, la vie, la dextérité, la distance... Tous ces paramètres sont à prendre en compte, faut qu'on réfléchisse à ça petit à petit :) Même la position des ennemis peut être intéressante, parfois on démarre avec un poireau ennemi isolé, loin de son équipe, ca peut faire une bonne cible aussi...

Foudge
17/06/2014, 22h42
Je pense qu'il a bien compris que c'est le plus bas en max life total qu'on focus. Mais il a.pas tord dans ce qu'il dit, parce que si il fuit en se planquant derrière ses potes, le temps qu'on arrive à lui on peut perdre pas mal de vie à se faire dezinguer sur la route non ?Sur la route on attaque tout ce qui est à portée, comme si c'était eux qu'on ciblait. Il n'y a pas vraiment de risque, au mieux ça annihile notre tentative de focus commun.

D'autre part, il y a plusieurs stratégies différentes, ce serait étonnant qu'une équipe décide de foutre derrière le poireau qui aurait le moins de total life, mais plutôt celui qui aurait le moins de défense, ou le healer, ou le niveau le plus bas, ou celui qui a le moins de PV (pour qu'il se soigne tranquille), ou celui qui a perdu le plus de PV (en pourcentage ou en quantité) ou que sais-je encore.
Bref les rares équipes qui auront mis en place une stratégie commune consistant à mettre volontairement un retrait un poireau avec certaines caractéristiques n'auront sans doute pas choisi le même critère que nous.
Et c'est tout aussi risqué pour eux de mettre en retrait un poireau en particulier, car si ce n'était pas un poireau qui intéressait prioritairement l'équipe adverse, c'est un effort qui aura été contre-productif puisque ce poireau aurait pu servir + efficacement à faire autre chose.

Au final, celui qui reste en retrait, c'est plutôt celui qui a un rôle fait pour être dans cette situation et non pas pour simplement vouloir le défendre car susceptible d'être éventuellement la cible prioritaire d'une équipe tordue d'esprit qui a décidé d'attaquer quasi arbitrairement le total life le plus faible (sans regarder son level) et cela même s'il y a un poireau près à crever à leur portée (les couillons) ! :ninja:

Hem
17/06/2014, 23h57
Premier tournoi, premier match, je tombe sur un mec lv 22 alors que je suis 19.

Ok tchao à plus.

Ivan Joukov
18/06/2014, 00h05
Ouais enfin c'est au moins un match cadeau le tournoi on va pas cracher dessus, je suis toujours tombé sur beaucoup plus fort aussi mais bon :)

J'ai besoin de matheux, comment on peut tester le plus facilement si un nombre est pair ? Tester si le reste d'une division euclidienne par 2 est égal à 0 ? C'est pour des actions alternées un tour sur deux. Pareil pour les tours multiple de 3 par exemple (lancer un buff tous les x tours...).

EDIT : Très joli match Hem, tu en as chié pour avoir une position où tu peux utiliser ton arme à chaque tour mais après la différence de dégats des armes a payé :)

Hem
18/06/2014, 00h22
Bon je commence à me heurter à un problème : http://leekwars.com/report=164222
Je tombe de plus en plus des matchs comme ça. Et je perd à chaque fois, quelqu'un aurait une idée du pourquoi?

rOut
18/06/2014, 00h23
Ouais enfin c'est au moins un match cadeau le tournoi on va pas cracher dessus, je suis toujours tombé sur beaucoup plus fort aussi mais bon :)

J'ai besoin de matheux, comment on peut tester le plus facilement si un nombre est pair ? Tester si le reste d'une division euclidienne par 2 est égal à 0 ? C'est pour des actions alternées un tour sur deux. Pareil pour les tours multiple de 3 par exemple (lancer un buff tous les x tours...).

EDIT : Très joli match Hem, tu en as chié pour avoir une position où tu peux utiliser ton arme à chaque tour mais après la différence de dégats des armes a payé :)

Heuuu quand même, c'est pas des maths ça...
1 tour sur 2 : if (getTurn() % 2 == 0)
1 tour sur 3 : if (getTurn() % 3 == 0)
2 tours sur 3 : if (getTurn() % 3 <= 1)

Hem
18/06/2014, 00h26
EDIT : Très joli match Hem, tu en as chié pour avoir une position où tu peux utiliser ton arme à chaque tour mais après la différence de dégats des armes a payé :)

Ouai ça c'est désengorgé quand t'as perdu l'avantage du terrain. Je vais essayer de bien travailler le pathfinding dès le lv 22.

rOut
18/06/2014, 00h27
Bon je commence à me heurter à un problème : http://leekwars.com/report=164222
Je tombe de plus en plus des matchs comme ça. Et je perd à chaque fois, quelqu'un aurait une idée du pourquoi?

C'est chelou, l'autre a son premier casque qui dure éternellement, et en caste un deuxième qui se cumule :wacko:

Hem
18/06/2014, 00h29
C'est chelou, l'autre a son premier casque qui dure éternellement, et en caste un deuxième qui se cumule :wacko:

Pourtant sur les logs il lance bien un seul casque tout les 4 tours.

Ivan Joukov
18/06/2014, 00h31
Heuuu quand même, c'est pas des maths ça...
1 tour sur 2 : if (getTurn() % 2 == 0)
1 tour sur 3 : if (getTurn() % 3 == 0)
2 tours sur 3 : if (getTurn() % 3 <= 1)

Si si c'est des maths, et je connaissais pas le symbole et le terme modulo ;)

rOut
18/06/2014, 00h45
Passe ta souris au dessus de l'icone du joueur pendant le combat, comme dans celui ci ou PeaK a un PROTEIN qui dure tout le combat et un autre qui s'accumule de temps en temps : http://leekwars.com/fight=164388

---------- Post added at 00h45 ---------- Previous post was at 00h32 ----------

Apparemment les effets ne durent pas, c'est sûrement juste un problème d'affichage.

Kak0
18/06/2014, 00h50
Passe ta souris au dessus de l'icone du joueur pendant le combat, comme dans celui ci ou PeaK a un PROTEIN qui dure tout le combat et un autre qui s'accumule de temps en temps : http://leekwars.com/fight=164388

---------- Post added at 00h45 ---------- Previous post was at 00h32 ----------

Apparemment les effets ne durent pas, c'est sûrement juste un problème d'affichage.
http://leekwars.com/forum/category-3/topic-314

Hem
18/06/2014, 01h02
Bon j'ai réussi à faire en sorte que mon leek se cache quand il le peut. Maintenant me reste à faire l'inverse, à savoir éviter d'avancer bêtement quand l'ennemi est caché.
J'espère que ça suffira à déjouer les mecs qui ont tout misé sur leur build.

Bon finalement ça passe pas. "Trop d'instruction executées pendant ce tour".
Pourtant c'est pas si lourd. 2 boucles imbriquées qui appellent une fonctions qui contient deux boucles imbriquées. Je dois même pas avoir 500 itérations.

deathdigger
18/06/2014, 07h57
Perso j'ai un bug à la con. Je pense que c'est une histoire de pointeur :
Je fais un test sur l'ensemble des cases et je mets dans un array les cases qui m'intéressent. Si j'ai 10 cases qui m'intéressent, il va bien me les ajouter dans ma première boucle. Par contre, si je veux lire ce tableau dans une deuxième boucle, toutes mes variables ont la valeur du dernier i de ma boucle précédente...
Je potasserai ça ce we.

Kak0
18/06/2014, 10h26
Bon j'ai réussi à faire en sorte que mon leek se cache quand il le peut. Maintenant me reste à faire l'inverse, à savoir éviter d'avancer bêtement quand l'ennemi est caché.
J'espère que ça suffira à déjouer les mecs qui ont tout misé sur leur build.

Bon finalement ça passe pas. "Trop d'instruction executées pendant ce tour".
Pourtant c'est pas si lourd. 2 boucles imbriquées qui appellent une fonctions qui contient deux boucles imbriquées. Je dois même pas avoir 500 itérations.
Y'a peut-être une condition qui foire et qui fait que t'as une boucle infinie. Partage ton code si tu veux qu'on jette un coup d'oeil ;-)

LaVaBo
18/06/2014, 11h59
Vu le système foireux de localisation (pourquoi pas en 2D bordel), comment on calcule si on est sur la même ligne (horizontale ou verticale) qu'un adversaire ?

J'ai acheté la mitraillette pour voir, et ce calcul est indispensable pour arrêter de courir vers l'adversaire, mais la fonction canUseWeapon() est level 29...
Je ne veux même pas me casser le cul avec les obstacles, juste faire un calcul, qui avec des coordonnées 2D donnerait :

if ((mon_abscisse == ennemi_abscisse)||(mon_ordonnée == ennemi_ordonnée))

Mais leur système de coordonnées me brouille le cerveau. C'est possible ?

Kak0
18/06/2014, 12h38
Vu le système foireux de localisation (pourquoi pas en 2D bordel), comment on calcule si on est sur la même ligne (horizontale ou verticale) qu'un adversaire ?

J'ai acheté la mitraillette pour voir, et ce calcul est indispensable pour arrêter de courir vers l'adversaire, mais la fonction canUseWeapon() est level 29...
Je ne veux même pas me casser le cul avec les obstacles, juste faire un calcul, qui avec des coordonnées 2D donnerait :

if ((mon_abscisse == ennemi_abscisse)||(mon_ordonnée == ennemi_ordonnée))

Mais leur système de coordonnées me brouille le cerveau. C'est possible ?
http://leekwars.com/documentation#isOnSameLine
Aussi, dans un des deux topics que j'ai posté plus haut, il y a les offsets à ajouter pour avoir les cases suivantes sur la même ligne/colonne.

PeaK
18/06/2014, 13h43
Vu le système foireux de localisation (pourquoi pas en 2D bordel), comment on calcule si on est sur la même ligne (horizontale ou verticale) qu'un adversaire ?

J'ai acheté la mitraillette pour voir, et ce calcul est indispensable pour arrêter de courir vers l'adversaire, mais la fonction canUseWeapon() est level 29...
Je ne veux même pas me casser le cul avec les obstacles, juste faire un calcul, qui avec des coordonnées 2D donnerait :

if ((mon_abscisse == ennemi_abscisse)||(mon_ordonnée == ennemi_ordonnée))

Mais leur système de coordonnées me brouille le cerveau. C'est possible ?

Leur système est en 2D, avec abscisse et ordonnée. Tu peux avoir les coordonnées d'une case avec getCellX et getCellY. A l'inverse tu peux aussi obtenir le n° de cellule grâce à des coordonnées, avec getCellFromXY. ;)
Voir dans la doc pour plus de détail. (http://leekwars.com/documentation#getCellFromXY)

---------- Post added at 13h43 ---------- Previous post was at 13h25 ----------

Y'a pas mal de bugs encore sur ce jeu, notamment sur les affichages. Ce poireau (http://leekwars.com/leek=767) a un ratio de ouf (113/1) avec 1 seule défaite affiché. Sauf que sur ses 6 derniers matchs, il en a perdu déjà 4... :p

Kak0
18/06/2014, 13h54
Y'a pas mal de bugs encore sur ce jeu, notamment sur les affichages. Ce poireau (http://leekwars.com/leek=767) a un ratio de ouf (113/1) avec 1 seule défaite affiché. Sauf que sur ses 6 derniers matchs, il en a perdu déjà 4... :p
Ces stats ne prennent en compte que les matchs "de potager" et de tournois (pas sûr pour les tournois, mais je suppose), ça ne prend pas en compte les défis amicaux. Tu peux voir que les défaites affichées sont des défis vu qu'aucun d'eux ne gagnent d'expérience ou d'argent.

Carpette
18/06/2014, 14h19
Raaah, je viens de rejoindre !

Ce jeu est dément !

Mon id de poireaux: http://leekwars.com/leek=1046

PeaK
18/06/2014, 14h21
OK, donc il perd plusieurs défis amicaux, contre des poireaux de son niveau, mais il ne perd jamais sur des matchs "de potager" ? Je trouve ça vraiment étrange, mais bon, peut être... :)

Kak0
18/06/2014, 15h17
Franchement vu certaines IA que je croise, même au niveau 35+, ça m'étonne à peine. En plus il peut très bien désactiver son Potager pour éviter que son poireau se fasse agresser, pour peu qu'il choisisse les proies faciles quand il fait ses combats journaliers y'a moyen d'arriver à un ratio monstrueux comme celui-ci je pense.

M'bon, ça peut être un bug aussi, en effet :p

Carpette
18/06/2014, 15h21
Pour défier quelqu'un en particulier, il faut remplir certaines conditions ?

Sinon, j'ai postulé dans the leek munchers (Carpoitte comme Poireau, et "Carpette" comme joueur)

Foudge
18/06/2014, 15h31
Pour défier quelqu'un en particulier, il faut remplir certaines conditions ?Non tu peux défier n'importe qui car il n'y a aucune conséquence : pas d'XP, pas d'argent, n'est pas compté dans les stats (victoires/défaites/ratio). Bref c'est un simple combat amical, assez pratique pour tester son IA dans des conditions plus réelles que celles de l'éditeur.

Sinon, j'ai postulé dans the leek munchers (Carpoitte comme Poireau, et "Carpette" comme joueur)Bienvenu ;)

Hem
18/06/2014, 15h39
Y'a peut-être une condition qui foire et qui fait que t'as une boucle infinie. Partage ton code si tu veux qu'on jette un coup d'oeil ;-)

Non en fait je viens de découvrir qu'on est limité à 10k instructions.
Et si je compte bien je dépasse les 50k facile.

Je vais devoir attendre de nouvelles méthodes pour espérer optimiser drastiquement mon algo.

Carpette
18/06/2014, 15h41
Non tu peux défier n'importe qui car il n'y a aucune conséquence : pas d'XP, pas d'argent, n'est pas compté dans les stats (victoires/défaites/ratio). Bref c'est un simple combat amical, assez pratique pour tester son IA dans des conditions plus réelles que celles de l'éditeur.
Et tu défie comment ?
La par exemple je suis sur ton poireaux, et j'ai droit à ça en guise de défi
http://tof.canardpc.com/preview2/2a3383b9-45b0-4800-9edc-4185e53bafb8.jpg (http://tof.canardpc.com/view/2a3383b9-45b0-4800-9edc-4185e53bafb8.jpg)

Bienvenu ;)
Merci :lol:


edit: OK, trouvé ... j'aurai pas du bouger : http://leekwars.com/fight=168107

Louck
18/06/2014, 15h54
J'ai postulé pour "the leek muncher", en tant que Louck :).

Le jeu est pas mal, mais c'est rare de tomber sur un joueur qui propose une IA un peu plus développée que la base "je fonce + je tire + j'utilise le chip caché dans mon calbute".

C'est limite facile :o.

Ivan Joukov
18/06/2014, 15h58
J'ai postulé pour "the leek muncher", en tant que Louck :).

Le jeu est pas mal, mais c'est rare de tomber sur un joueur qui propose une IA un peu plus développée que la base "je fonce + je tire + j'utilise le chip caché dans mon calbute".

C'est limite facile :o.

Ca change en approchant du 20 où j'ai beaucoup de joueurs qui kitent et utilisent bien les chips, je commence à perdre de plus en plus alors qu'avant en potager j'avais 90% de win. Là je sens l'urgence de développer une IA beaucoup plus développée dont je n'avais pas encore besoin.

Foudge
18/06/2014, 17h20
J'ai postulé pour "the leek muncher", en tant que Louck :).

Le jeu est pas mal, mais c'est rare de tomber sur un joueur qui propose une IA un peu plus développée que la base "je fonce + je tire + j'utilise le chip caché dans mon calbute".

C'est limite facile :o.Au début (jusqu'au niveau 16 environ je dirais), c'est principalement ça. Mais dès que t'auras accès au casque et aux soins, la donne vas changer. Ca deviendra même trop axé vers la défense.
Mais c'est bien que la difficulté soit progressive, surtout que tout le monde n'est pas développeur.

Et si t'es impatient, en faisant tous tes combats quotidiens + les combats en équipe + les tournois, tu vas rapidement monter en niveau et tu pourras faire des IA bien moins basiques qu'au début, en gérant attaque et défense et en ayant accès à plus de fonctions.

Carpette
18/06/2014, 17h41
Rien qu'au niveau 11, je suis tombé sur un mec qui utilisais du soin ... c'était chaud pour ma gueule (heureusement que je jouais sur la portée de mon chip spark, sinon, je perdais largement)

Foudge
18/06/2014, 18h18
Les premiers que j'ai rencontré avec casque et bandage, ça m'a fait drôle, moi qui étais toujours avec la technique de base qui marchait bien : foncer sur l'ennemi puis gun+gun+caillou :ninja:

Avathar
18/06/2014, 18h37
J'ai pas encore eu trop le temps de me pencher là dessus moi non plus, pour l'instant c'est "Foncer+Gun+Gun+Shock(ou Soin si ma vie est en dessous de la moitié)"

rOut
18/06/2014, 18h44
OK, donc il perd plusieurs défis amicaux, contre des poireaux de son niveau, mais il ne perd jamais sur des matchs "de potager" ? Je trouve ça vraiment étrange, mais bon, peut être... :)

A mon avis il ne fait pas de combats potager, il doit être utilisé comme support dans une équipe et levelle comme ça.

Sinon pour les combats potagers, tu peux toujours checker le niveau des adversaires potentiels en les défiant via la page de classement avant de te risquer à les affronter pour de vrai...

Basique
18/06/2014, 20h49
Je viens de m'y mettre. Ça à du potentiel.

Mais il n'y a pas moyen d'enchainer les combats sans les regarder. Genre faire ses 20 combats d'affilés et voir le résultat ensuite ?

rOut
18/06/2014, 20h56
Tu peux ouvrir dans des onglets non ?

Basique
18/06/2014, 21h03
Je demande ça parce que ma connexion internet est difficilement qualifiable de connexion internet tellement elle est lente. Du coup c'est chiant même pour lancer un seul combat :/

Robix66
18/06/2014, 21h59
Une fois que t'as lancé le combat, tu peux fermer l'onglet. Si tu veux quand même voir l'xp que tu gagnes, tu as une croix en bas à droite de la fenêtre de combats.

Foudge
19/06/2014, 00h54
Je viens de m'y mettre. Ça à du potentiel.

Mais il n'y a pas moyen d'enchainer les combats sans les regarder. Genre faire ses 20 combats d'affilés et voir le résultat ensuite ?Tu peux. A chaque combat, tu le quittes (cliquer sur la croix, touche Q, ou fermeture d'onglet). Tu pourras revenir dessus soit au niveau de ton poireau (6 derniers combats), soit dans les notifications (historique complet).

Carpette
19/06/2014, 12h27
Première fois que je croise un congénère un tant soit peu intelligent, le combat est plaisant à voir: http://leekwars.com/report=173938

rOut
19/06/2014, 13h10
Mouais, ça ne se planque pas assez.

Louck
19/06/2014, 13h41
Les premiers que j'ai rencontré avec casque et bandage, ça m'a fait drôle, moi qui étais toujours avec la technique de base qui marchait bien : foncer sur l'ennemi puis gun+gun+caillou

C'est la technique qui marche et qui semble durer jusqu'au niveau 30/40 :p.
C'est dommage d'ailleurs qu'il n'y ai pas beaucoup d'alternatives ou stratégies au niveau du contenu, dans les premiers niveaux (comme sur Gnobot).



Mouais, ça ne se planque pas assez.

Une des fonctions (canUseWeapon()) qui peut aider pour se planquer nécessite d'être niveau 29.... je crois.

Kak0
19/06/2014, 13h50
Mouais, ça ne se planque pas assez.
En même temps au niveau 16 t'as pas vraiment les fonctions pour.

PeaK
19/06/2014, 13h55
Ce serait bien de mettre un 6e poireau dans chaque team, non ? Maintenant qu'on est assez nombreux pour remplir les 3.
Quitte à mettre un petit poireau avec des gros si vous préférez ne pas péter les teams existantes, ça fera toujours un peu de cher à canon pour occuper nos adversaires :ninja:

Foudge
19/06/2014, 15h24
La seconde génération de poireau (babaAss et xX2Dx) ont évolué super vite ! Ils sont actuellement au level 48 et 52.
J'imagine que lorsqu'on a déjà des IA optimisée et qui ont fait leur preuves, ça aide, mais quand même !

rOut
19/06/2014, 16h23
En même temps au niveau 16 t'as pas vraiment les fonctions pour.

Tu as moveTowardCell et getCellDistance et c'est largement suffisant.

LaVaBo
19/06/2014, 17h24
Tu as moveTowardCell et getCellDistance et c'est largement suffisant.

Non, pas de gestion des obstacles (pour savoir si on peut tirer sur l'adversaire ou s'il faut se déplacer)

Hem
19/06/2014, 17h37
Au lv 21 tu pourras récupèrer les infos des cellules pour savoir si c'est un obstacle, une case vide, un leek, etc.

PeaK
19/06/2014, 17h39
Non, pas de gestion des obstacles (pour savoir si on peut tirer sur l'adversaire ou s'il faut se déplacer)

Tu peux essayer de tirer, s'il ne se passe rien (tu gardes tes 8 TP) c'est que t'es trop loin et qu'il faut se déplacer.

Effectivement, c'est un peu chiant au lvl 16. Mais niveau 21 y'a isEmptyCell() pour savoir ça, à la vitesse où on enchaîne les levels vous devriez pouvoir l'utiliser rapidement. Et après y'aura canUseWeapon(), qui permet de savoir si on peut tirer sur l'adversaire, mais c'est niveau 29. Pour demain ou après demain quoi ;)

LaVaBo
19/06/2014, 17h40
En tout cas, en l'absence de moveTowardLine() et canUseWeapon() (level requis trop élevés), je laisse tomber la 2e arme, trop galère d'optimiser les mouvements pour tirer en ligne.

rOut
19/06/2014, 18h05
Non, pas de gestion des obstacles (pour savoir si on peut tirer sur l'adversaire ou s'il faut se déplacer)

Bah franchement, la distance à l'ennemi est une heuristique largement suffisante pour estimer ta capacité à lui tirer dessus ou le risque auquel tu t'expose de sa part. Et à rendre les combats plus dynamiques en s'échapant. J'ai quasiment la même IA depuis le level 15 (j'ai intégré la detection d'obstacles plus tard, mais plus pour favoriser les zones denses donc protégées que pour savoir si je peux toucher l'ennemi) et ça marchait vraiment bien jusqu'à maintenant.

---------- Post added at 18h05 ---------- Previous post was at 17h50 ----------

Par exemple, avec des fonctions niveau 10 je faisais ça :



global THREAT_SAFE = 0;
global THREAT_HIGH = 1;
global THREAT_CRIT = 2;

function getCellsAround(cell, distance)
{
var cells = [];
for (var x = distance; x >= 0; x--)
{
var c1 = getCellFromXY(x, distance - x) - 306;
var c2 = getCellFromXY(x, x - distance) - 306;
for (var c in [cell + c1, cell - c1, cell + c2, cell - c2])
{
if (c < 0 || c > 612) continue;
push(cells, c);
}
}

shuffle(cells);
return cells;
}

function getCellsThreat(cells) {
var threats = [];

for (var c in cells)
{
// avoid borders
if (getCellDistance(c, 306) > 16)
{
push(threats, THREAT_CRIT);
}
else if (getCellDistance(c, 306) > 15)
{
push(threats, THREAT_HIGH);
}
else
{
var enemy = getNearestEnemy();
var enemyWeapon = getWeapon(enemy);
var distToEnemy = getCellDistance(c, getCell(enemy));

if (distToEnemy > getWeaponMaxScope(enemyWeapon) + getMP(enemy))
{
push(threats, THREAT_SAFE);
}
else if (isInlineWeapon(enemyWeapon))
{
var distToEnemyX = abs(getCellX(c) - getCellX(getCell(enemy)));
var distToEnemyY = abs(getCellY(c) - getCellY(getCell(enemy)));
if (min(distToEnemyX, distToEnemyY) > getMP(enemy))
push(threats, THREAT_SAFE);
else if (min(distToEnemyX, distToEnemyY) > 0)
push(threats, THREAT_HIGH);
else
push(threats, THREAT_CRIT);
}
else
{
if (distToEnnemy > getWeaponMaxScope(enemyWeapon))
push(threats, THREAT_HIGH);
else
push(threats, THREAT_CRIT);
}
}
}

return threats;
}

Foudge
19/06/2014, 18h42
Mouais, ça ne se planque pas assez.Tu parles de la fuite ou de l'utilisation intelligente des obstacles pour se protéger ?

rOut
19/06/2014, 18h46
Tout dépend de ce que tu appelles utilisation intelligente. Mais dans une moindre mesure on peut faire quelque chose à bas lvl. En essayant de rester à la distance de tir par exemple, le poireau aura plus tendance à se mettre parfois hors de portée derrière un rocher qu'en restant au bêtement au cac.

Nattefrost
19/06/2014, 18h48
Yo les canards, je suis pas dispo depuis quelques jours car ma fin de semestre est chargée et if(fail == true): then pay(A_LOT). J'ai désactivé mon potager, enlevez moi de l'escouade 'les petits nouveaux' si quelqu'un d'autre veut la place.

Foudge
19/06/2014, 19h38
Tout dépend de ce que tu appelles utilisation intelligente. Mais dans une moindre mesure on peut faire quelque chose à bas lvl. En essayant de rester à la distance de tir par exemple, le poireau aura plus tendance à se mettre parfois hors de portée derrière un rocher qu'en restant au bêtement au cac.Par utilisation intelligente, je parle de ne pas utiliser bêtement moveAwayFrom en priant pour ne plus être à portée de l'ennemi. Parce qu'on ne maitrise rien, et au lieu de se foutre derrière un obstacle, il s'enfuit souvent en ligne droite, rattrapé aussitôt par l'ennemi et tué froidement par un coup de laser.
Du coup je pense que je vais m'atteler à faire mon propre pathfinding plutôt que de faire des fuites au p'tit bonheur la chance.

rOut
19/06/2014, 19h54
moveAway pue effectivement du cul, par contre moveTowardCell marche assez bien sans avoir à se compliquer la vie avec le pathfinding qui est déjà calculé. La seule chose importante à mon avis c'est le choix de la cellule ou l'on va aller parmis les quelques cellules à portée, et là, tout dépend de ce qu'on a à sa disposition comme fonction.

Au départ, comme dans la fonction que j'ai donné, je n'utilisais que la distance à l'ennemi et la distance aux bords, puisque je n'avais que ça. Ensuite, tu as des fonctions pour ajouter plus d'input à la fonction de sélection de cellule.

Même si tu arrives à te mettre derrière un obstacle, il y a peu de chances que tu ais assez de MP pour que l'autre ne puisse pas bouger et te viser au tour d'après quand même. Donc à mon avis, un truc compliqué n'est pas très efficace.

Foudge
19/06/2014, 20h08
C'est vrai que le pathfinding en lui-même, le moveTowardCell le gère correctement. Je faisais plutôt allusion au choix de la cellule à atteindre, il faudra analyser +/- finement le terrain, en évitant les solution trop gourmande qui atteindront la limite d'instructions.
Mais une fois que tu as analysé le terrain, que tu sais où tu veux aller en fonction de ta position, de ton nombre de MP restant, de la position de l'ennemi et de sa portée après déplacement, le plus dur sera fait.

edit: j'ai pas encore craché une seul ligne de code, c'est juste dans ma TODO list

Carpette
19/06/2014, 20h43
Je m'oriente pour le moment avec le moveTowardCell pour trouver une cellule d'attaque et moveAwayFrom pour me barrer comme un lache.

J'ai pas encore eu le temps de faire un algo pour me barrer autrement qu'avec le moveAwayFrom qui n'est effectivement pas super performant.
Le combat que j'ai linké, c'était uniquement par ce que c'était la première fois que je croisais quelqu'un qui ne faisais pas du "je fonnce tout droit et je te fume ... ah ... tu cours aussi ?! Ah ... tu as plus de portée que moi ... ah ... merde".

(Et mon algo a été suffisant pour fumer Ravath au niveau 24 ... alors que j'étais lvl 16 :) )

Foudge
19/06/2014, 22h17
A ajouter dans ma TODO list, une détection des cul-de-sac : ça fait plusieurs fois qu'on me coince au cac sans que je puisse faire grand chose (ma plus grosse attaque est ou double gun dont la portée mini est de 2) :/

Carpette
19/06/2014, 22h21
A ajouter dans ma TODO list, une détection des cul-de-sac : ça fait plusieurs fois qu'on me coince au cac sans que je puisse faire grand chose (ma plus grosse attaque est ou double gun dont la portée mini est de 2) :/

En attendant de trouver une parade, quand je me fais coincer comme ça, je sors le pistolet. Ca évite le zéro dégat (tu mesure la distance, et si après ta phase de mouvement t'es toujours à une distance de 0 ... tu switches de gun)

Avathar
20/06/2014, 00h26
(Et mon algo a été suffisant pour fumer Ravath au niveau 24 ... alors que j'étais lvl 16 :) )

Prout !

Tu verrais la tronche de mon code, tu comprendrais, c'est sale et pas opti, et j'ai pas trop le temps de me plonger là dedans pour le moment :p

Hem
20/06/2014, 02h59
Question con : http://leekwars.com/leek=993 comment il est arrivé à ce lv avec aussi peu de match?
Comparé au mien : http://leekwars.com/leek=948

Touze
20/06/2014, 03h28
Combats avec sa team je suppose, si je compare mon poireau au tien j'ai 13 niveaux de plus alors qu'on a que 18 combats de différence.

PeaK
20/06/2014, 08h23
Et les tournois aussi. Vu les bonus d'xp qu'on y choppes, ça peut aller vite.

---------- Post added at 08h23 ---------- Previous post was at 08h05 ----------

C'est vraiment puissant ces stalagtites... Acheté hier, mis en début de script à l'arrache parce que pas le temps de faire mieux et... http://leekwars.com/fight=179221 :cigare:

Foudge
20/06/2014, 08h25
Surtout si tu les gagnes, 1er à un tournoi ça doit bien être équivalent à 20 combats gagnés en solo.

Clair que stalactite, surtout si combiné à une puce qui boost la force, c'est très puissant. C'est là qu'on voit que le casque seul ne sert plus à grand chose, et qu'il faut le combiner à un boost d'agilité voire à le remplacer par rempart ou armure (la défense relative ayant l'avantage de mieux supporter les grosses attaques, c'est p'tet un investissement à plus long terme, à voir).

edit: faudra que tu penses à voir pourquoi il a planté 2 fois, en tout cas tes stalactites ont sauvé le combat ;)

PeaK
20/06/2014, 08h46
Pour le gain d'xp en tournoi c'est simple:
16e de finale: x2
8e: x3
quart: x4
demi: x6
finale: x10

Pour l'armure relative oui, ça peut valoir le coup, sauf qu'en fait "Rempart" (25% d'armure) ne peux pas être lancé sur soi même. Il y a "Mur" (15% d'armure), mais du coup le Casque reste plus intéressant pour le moment... Ou l'Armure, sinon.

Edit: Oui oui je vais regarder ça, mon script est un peu à l'arrache depuis hier. D'ailleurs ton poireau m'a bien aidé à corriger mes erreurs :ninja:

Foudge
20/06/2014, 09h26
Donc en terme d'XP, 1 tournoi gagné = 25 combats gagnés, ça vaut clairement le coup de s'inscrire même si c'est pour perdre en 16ème.

Ha merde, j'avais pas vu pour Rempart, et c'est vrai que Mur, avant qu'il devienne intéressant... Surtout que la formule de défense relative (base + agility/50) fait qu'on gagne pas grand chose : +2% seulement avec une agility à 100 ! Je pense que son remplaçant sera l'Armure, ou je le boosterai avec stretching ou warm-up.

Kak0
21/06/2014, 00h13
Je confirme pour les tournois, je viens d'en gagner un (oui je viens aussi pour me la péter un peu : http://leekwars.com/tournament=214), j'ai gagné 4 niveaux (47 -> 51) et pas mal de thunes, et encore j'ai eu un forfait.

Hideo
22/06/2014, 19h52
6 pages en 8 jours, la vache je vais regarder ça de plus près ^_^

Foudge
22/06/2014, 21h12
Je viens de gagner mon 1er tournoi ! Au passage, j'ai obtenu 2 trophées : Baron (gagner 1 tournoi) et Magicien (gagner un combat solo sans utiliser d'arme).
Pour ce dernier, j'vais regarder les logs pour savoir comment ça a pu arriver...

PeaK
22/06/2014, 21h47
Il me semble que c'est parce que les Chips ne sont pas considérés comme des armes ;)

Foudge
22/06/2014, 22h12
Il me semble que c'est parce que les Chips ne sont pas considérés comme des armes ;)Je sais bien, mais j'vois voir pourquoi mon arme (que j'ai prise au début du combat) n'a jamais été utilisée. Quand la stalactite est dispo, forcément je l'utilise. Ensuite Ice et surtout Pebble, ce sont des puces moins puissantes que l'arme. Je pense que c'est un concours de circonstances qui a fait que, tout au long du combat, soit je n'avais plus assez de TP dispo (suite à utilisation de Steroid), soit hors de portée (Ice a une portée supérieure de 1 cellule), soit Stalactite dispo et donc prioritairement utilisée.

edit: c'était bien ça, lors de la finale du tournoi, avec notamment Cure qui me fait souvent gagner plus de PV que le double gun en fait perdre à l'ennemi. Il n'y a eu qu'une fois où le double gun aurait pu être utilisé, mais l'attaque était évaluée à -5PV donc ça vallait pas le coup de se mettre en danger pour tenter d'enlever 5PV à l'ennemi (qui en avait bien plus que 5).
Bref, gros coup de bol ce trophée :)

PeaK
22/06/2014, 22h59
Tu l'as bien améliorée du coup ton IA! :) Moi je commence à prendre cher là, faut vraiment que je me trouve un bout de temps pour l'améliorer...

Ivan Joukov
22/06/2014, 23h06
Itou j'approche du 40 et mon ratio s'est presque réduit de moitié, faudra que je me cale et voir ce que je peux faire avec toutes ces fonctions, pas touché au code depuis le 25.

Foudge
22/06/2014, 23h30
Tu l'as bien améliorée du coup ton IA! :) Moi je commence à prendre cher là, faut vraiment que je me trouve un bout de temps pour l'améliorer...Avant j'utilisais toujours l'arme et et les puces dans un certain ordre (que je considérais comme optimal), en commençant par casque et stéroïde, puis en bouclant sur arme/chip-attaque/chip-défense jusqu'à plus avoir de TP (si possible).
Finalement j'ai tout revu, et avant chaque action, je calcule le score théorique espéré de tout ce que j'ai et je détermine la meilleure action. Là ça m'a permis de bien optimiser mes tours, et ce procédé est plus évolutif.

Autre amélioration notable, surtout utile en fin de combat, ce que j'appelle le mode kamikaze : au tout début du tour, même si je suis près de la mort, je regarde si je peux utiliser les 8TP dispo en pure attaque afin d'achever l'ennemi. Et ça marche plutôt bien !

Mais j'ai encore tellement de choses à améliorer, notamment le pathfinding ou plutôt le choix de la cellule de destination. Là j'utilise encore moveAwayFrom(enemy) pour me "protéger" (= je m'enfuis les yeux fermés en priant pour que je sois à l'abri), mais ça a ses limites :ninja: Et en combat en équipe, je ne rentre pas assez dans le tas.

C'est super chronophage comme jeu :o


edit: et c'est sans compter la gestion du 2ème poireau, qui peut certes profiter des ancienne IA du 1er, mais dont il faut quand même s'occuper, et ça évolue vite, trop vite. Sans compter une problématique que j'avais oublié : on ne peut pas donner la même arme aux 2 poireaux (je pense au double gun) :(

PeaK
22/06/2014, 23h43
C'est super chronophage comme jeu :o

Ouai, je crois que c'est un très bon résumé ça! ^_^

Ma TODO liste ne cesse de grandir, mais je vois qu'on a plus ou moins tous les mêmes idées au final.

Pour la fuite je fais simple aussi pour le moment, un MoveAway de l'ennemi le plus proche, en évitant les coins pour ne pas me retrouver coincer par les poireaux qui restent constamment au cac. Mais il me semble qu'à partir de 2 coeurs il y a MoveAwayFromLine ou MoveAwayFromCells qui peuvent être bien plus utiles, et comme t'as créé ton 2e poireaux ça doit être faisable. :)

Et le mode kamikaze est prévu aussi chez moi, depuis... la période où on se tapait des matchs nuls en boucle, à force de fuir chacun de son côté, dès que la situation était critique. :p


Ah, et je ne savais pas pour le 2e poireau. Ca concerne uniquement les armes, où les chips sont aussi concernés ?

Foudge
23/06/2014, 00h04
Pour la fuite je fais simple aussi pour le moment, un MoveAway de l'ennemi le plus proche, en évitant les coins pour ne pas me retrouver coincer par les poireaux qui restent constamment au cac. Mais il me semble qu'à partir de 2 coeurs il y a MoveAwayFromLine ou MoveAwayFromCells qui peuvent être bien plus utiles, et comme t'as créé ton 2e poireaux ça doit être faisable. :)Le 2ème poireau, c'est accessible dès le level 50. Pour le 2ème coeur, faut 100 capital ou atteindre le level 100. Donc là j'ai toujours qu'un coeur et n'ai donc toujours pas accès à certains fonctions intéressantes.
J'ai également ajouté un correctif pour ne pas rester dans les coins (saloperie de double gun avec sa portée mini à 2), mais je ne peux le vérifier qu'après y être allé, et j'en sors que s'il me reste au moins 1 MP. Faut vraiment que je revois mes déplacements.


Ah, et je ne savais pas pour le 2e poireau. Ca concerne uniquement les armes, où les chips sont aussi concernés ?Juste les armes, heureusement :) Par contre le double gun a une si grande longévité qu'il peut être à la fois utilisé sur un poireau level 9 (level min requis par l'arme) que level 69 (level actuel de mon 1er poireau). Faut que je lui trouve un bon remplaçant, mon 2ème poireau va pas tarder à réclamer son double gun :p

PeaK
23/06/2014, 00h21
Ah oui, j'avais oublié cette histoire de level pour le 2e coeur, effectivement.

Sinon pour le 2e poireau, du coup il faut soit lui mettre une IA qui gère les armes qui tirent en ligne droite, soit le mettre en buffer/healer sur le 1er poireau, quitte à ce qu'il reste à distance respectable. Enfin bon, encore un point sur lequel il va falloir réflechir... :p

Ivan Joukov
23/06/2014, 00h50
Bon du coup je viens d'y passer 2 heures... Amélioré mon IA, toujours un peu bordélique et fourre tout mais j'ai du gagner en efficacité surtout en cas de blocage dans un coin.

Foudge
23/06/2014, 01h42
Ah oui, j'avais oublié cette histoire de level pour le 2e coeur, effectivement.

Sinon pour le 2e poireau, du coup il faut soit lui mettre une IA qui gère les armes qui tirent en ligne droite, soit le mettre en buffer/healer sur le 1er poireau, quitte à ce qu'il reste à distance respectable. Enfin bon, encore un point sur lequel il va falloir réflechir... :pPour l'instant le p'tit a juste une IA solo, et faudra bien qu'il passe rapidement au double gun (là il est niveau 8, à partir du niveau 9 il risquera de rencontrer d'autres poireaux qui l'ont).
J'vais sans doute prendre le Laser, ou revenir au Pistol (soyons fou) et plus axer mes attaques sur l'utilisation optimale des Stalactites (j'ai l'impression de ne pas l'utiliser assez souvent). Mais pour le laser, faudra gérer cette histoire de ligne... donc va pour le Pistol :p

Ivan Joukov> C'est quoi ton nom d'éleveur et celui de ton poireau ?

Ivan Joukov
23/06/2014, 07h34
http://leekwars.com/farmer=849

Foudge
23/06/2014, 08h17
Tu n'es pas dans notre équipe ! Tu nous a quitté, sale traitre :siffle:

-------------------

Il y a une technique pour contrer ceux qui utilisent Etincelle en restant à distance ? Sont assez pénibles, et mon poireau n'a pas encore accès à Bandage :(

edit: combattre le feu par le feu, ça semble marcher B)

Hideo
23/06/2014, 10h23
Y'a une équipe pour les petits nouveaux ? :)

Hydeo in-game si y'a besoin.

LaVaBo
23/06/2014, 14h19
Je veux bien m'incruster aussi si vous cherchez de la chair à canon.

J'ai un poireau level 21, avec 69/3/41 en stats, et une IA pas optimum du tout, mais qui fait la base (pistolet, chips spark, helmet et bandage) en attendant que je me penche fortement dessus.

J'avais posté un lien vers mon compte ou mon poireau ici, je ne sais pas comment retrouver l'url.
Pseudo : lavabo, poireau : lavapoaro

Zouhh
23/06/2014, 16h35
Je m'y suis mis pour tester. Niveau 21 actuellement.

Pseudo : Zouhh, poireau : Markas

Foudge
23/06/2014, 20h48
Y'a une équipe pour les petits nouveaux ? :)

Hydeo in-game si y'a besoin.Il y a plusieurs compositions de différents niveaux.
A noter également pour ceux qui ont peur, qu'il est possible d'intégrer une équipe mais d'avoir son poireau "non engagé" : il ne participera donc pas aux combats en équipe jusqu'à ce que vous changiez d'avis (mise au point de l'IA, monté en level).
Mais honnêtement, il n'y a rien à perdre à les faire combattre, car même en enchainant les défaites, vous gagner de l'argent et de l'XP, et cela s'additionne aux combats individuels.

Ivan Joukov
23/06/2014, 21h26
Du coup je suis de retour, par contre j'ai une IA fiable solo que j'ai juste appliquée au multi, pas de comportement de groupe et prenant en compte les multiples ennemis pour le moment, mais si y a une place dans une team assez naze je veux bien :)

EDIT : Je me suis fait un focus sur l'ennemi le plus faible comme conseillé sur le forum team à la place de ma sélection de target individuelle.

EDIT 2 : Enfin si elle marche, en solo ça prend pas et j'arrive pas à lancer un test en team il mouline dans le vide.

EDIT 3 : Qui peut lancer un combat d'équipe dans l'équipe ? On a encore nos 10 les petits nouveaux.

EDIT 4 : Ok j'ai compris c'est que des poireaux de l'équipe n'ont plus leurs points.

deathdigger
23/06/2014, 21h49
Mon code qui ne marche pas :

http://pastebin.com/CQxcc9VP

En input, j'ai bien les bonnes valeurs, mais quand je lis mon tableau, il me sort toujours la dernière valeur des boucles :tired:

Tomaka17
23/06/2014, 22h09
Ca push une référence vers la variable i dans le tableau comme si c'était un objet et non une valeur.
C'est pas censé faire ça en vrai javascript, donc j'imagine que c'est la fonction "push" qui déconne.

Tu peux peut être remplacer :

for (var i = 0; i < 300; ++i) {
...
}

Par :

for (var i = 0; i < 300; ++i) {
(function(i) {
...
})(i);
}

Mais c'est pas sûr que ce soit supporté.

Tamno
23/06/2014, 22h28
Sans compter une problématique que j'avais oublié : on ne peut pas donner la même arme aux 2 poireaux (je pense au double gun) :(
On peut acheter la même arme plusieurs fois !

deathdigger
23/06/2014, 22h47
Ca push une référence vers la variable i dans le tableau comme si c'était un objet et non une valeur.
C'est pas censé faire ça en vrai javascript, donc j'imagine que c'est la fonction "push" qui déconne.

Tu peux peut être remplacer :

for (var i = 0; i < 300; ++i) {
...
}

Par :

for (var i = 0; i < 300; ++i) {
(function(i) {
...
})(i);
}

Mais c'est pas sûr que ce soit supporté.

Vu avec un des dev, c'est bien un bug (problème de pointeur), en attendant, j'ai trouvé la solution en n'utilisant pas push() mais en faisant un ableCells[count(ableCells)] = i ;)

Edit : Pendant que j'y pense, il va falloir qu'on fasse nos stratégies d'équipes. Personnellement, je peux jouer support, et booster un tank (Foudge par exemple).

Foudge
23/06/2014, 23h23
EDIT 2 : Enfin si elle marche, en solo ça prend pas et j'arrive pas à lancer un test en team il mouline dans le vide.

EDIT 3 : Qui peut lancer un combat d'équipe dans l'équipe ? On a encore nos 10 les petits nouveaux.

EDIT 4 : Ok j'ai compris c'est que des poireaux de l'équipe n'ont plus leurs points.Tu peux tester ton IA contre plusieurs IA de test, ça permet de simuler le comportement contre plusieurs ennemis.


On peut acheter la même arme plusieurs fois !C'est vrai ? :wub:

Foudge
24/06/2014, 11h34
MAJ:

Amélioration de l'IA de mon poireau principal :
- utilisation + intensive de Stalactite (l'attaque la plus puissante)
- amélioration Force et Agility uniquement si nécessaire (prise en compte du buff en combat en équipe)
Ca devrait améliorer les choses surtout en combat en équipe, j'avais du mal à passer à l'attaque (cf certains combat vs Epitech par ex).
edit: deathdigger> améliorations constatés sur ce combat http://leekwars.com/fight=211344

Utilisation du Double Gun sur mon 2ème poireau, merci Tamno pour l'info ;)

Carpette
24/06/2014, 11h38
Si vous voulez camoufler le fait que vous bossez votre IA au lieu de votre bug chiant qu'il-faut-rendre-super-vite-par-ce-que-le-client-va-pas-être-content, y'a LeeKloud (https://github.com/GuimDev/LeeKloud), bien pratique ! (si vous avez un proxy avec identification à votre boite par contre, c'est un peu chiant. J'ai pas encore trouvé comment le contourner)

Ivan Joukov
24/06/2014, 18h05
Si l'équipe des petits nouveaux pouvaient focus le joueur le plus faible (code dans le forum de l'équipe) et ne pas avoir 2 poireaux inactifs en combat on aurait peut-être des chances de gagner un peu plus ;)

deathdigger
24/06/2014, 18h41
Y'a Nattefrost qui fout sa merde aussi (pour changer :ninja:)

rOut
24/06/2014, 19h50
Perso j'ai un peu laissé tomber depuis quelques jours, la flemme et puis c'est un peu toujours pareil quand même.

Hem
24/06/2014, 19h53
Pareil. Et le côté création d'une IA est pas si intéressante que ça au final.

rOut
24/06/2014, 20h02
En fait le truc c'est que :
1) Beaucoup de fonctions haut niveau sont déjà dispo, pas besoin de les recoder (donc peu de challenge pour ceux que ça intéresse).
2) Le langage est un peu frustrant et peu expressif.
3) La mécanique de points n'est pas très flexible, 4 points de mouvements et 8 points d'action.

3) en particulier, ça veut dire au max 2 actions par tour, et chacun bouge d'autant. C'est à dire qu'il est quasi impossible de prendre de la distance avec l'adversaire, vu que l'autre avance d'exactement le même nombre de pas. J'ai notamment eu un combat avec un mec qui avait bien compris ça, et à partir du moment ou il est parvenu à se mettre à moins de 3-4 cases de moi, il a sorti le gros laser, sûr que je ne pourrais plus jamais (ou très peu probable) me mettre hors de portée. Vous me direz, il suffit de ne jamais laisser l'autre s'approcher... mais du coup on a peu de chance de gagner aussi.

Il aurait été à mon avis beaucoup plus intéressant de mélanger les deux pool de points, et libre à chacun de décider de ce qu'il veut privilégier, mouvement ou action.

Foudge
25/06/2014, 01h06
Ya bien des puces pour augmenter temporairement le nombre de TP ou de MP, mais jsais pas si c'est si intéressant que ça.

deathdigger
25/06/2014, 07h39
Passé le niveau 50, ça devient beaucoup plus dur, après, j'ai surtout bosser mon IA pour assurer le support, je n'y ai pas touché en solo d'où le fait que je me fasse laminer.
Et trouver la parade à stalactite c'est chaud.
Niveau améliorations, j'espère que les devs vont pousser les effets des chips plus loin que les bêtes dommage/soin (rajouter paralysie, réduction de chance, ...) Je pense que c'est prévu vu les descriptions de certaines chips avancées.

Foudge
25/06/2014, 10h22
Et trouver la parade à stalactite c'est chaud.J'étais en train de réfléchir à ça, car mon simple casque ne suffit plus. Surtout qu'avec certains qui sont blindés de force (naturellement et/ou boostée) ça peut faire très mal, et l'on voit aussi des utilisateurs d'iceberg (il me semble) qui peut toucher plusieurs poireaux à la fois.
Pour les grosse attaques, j'ai l'impression qu'il faut passer à de la défense relative, rempart par ex qui protège de 40% (de base) pendant 4 tours (avec un cooldown de seulement 3!). Par contre pour du relatif, l'agility ne fait pas beaucoup gagner je trouve (seulement 1% tous les 50pts d'agility).

Ivan Joukov
26/06/2014, 22h34
Dafuk on ne peut avoir qu'un chip de chaque type et un seul poireau peut l'utiliser ? !

Foudge
27/06/2014, 09h56
Je n'ai pas eu ce problème à ce niveau.

Kak0
27/06/2014, 13h11
Dafuk on ne peut avoir qu'un chip de chaque type et un seul poireau peut l'utiliser ? !
Mes poireaux utilisent les même chips, je n'ai pas eu besoin de les acheter en double. Ca ne marche pas chez toi ?

Ivan Joukov
27/06/2014, 17h38
Mes poireaux utilisent les même chips, je n'ai pas eu besoin de les acheter en double. Ca ne marche pas chez toi ?

Si en fait, je devais avoir la berlue hier...

Carpette
27/06/2014, 17h42
Bon, j'ai mis mon poireau en mode "tank" pour la strat d'équipe, histoire que les votre puissent avoiner pendant que je morfle

Foudge
29/06/2014, 10h36
J'viens d'intégrer la puce Iceberg, et voilà les quelques infos qu'il faut savoir pour une utilisation en équipe (en solo ya rien de spécial à faire) :
- utilisation en ligne, portée de 3 à 5. Bref assez contraignant mais très puissant comme attaque. L'utilisation de getCellToUseChip simplifie les choses pour se positionner.
- des dégâts sur une zones de 2 cellules autour du point d'impact. C'est là qu'en équipe il faut faire attention : il faut éviter de faire mal a ses alliés, mais bien utilisé ça peut faire très mal à l'ennemi (d'ailleurs des trophées sont liés au nombre d'ennemis touchés voir tués en 1 seule attaque)
- le centre de l'impact prend 100% de dégâts, à 1 cellule de distance ça descend à 75%, à 2 cellules à 50%. C'est vraiment vital à savoir pour voir s'il est préférable d'utiliser Stalactite (quasi aussi puissant mais sur 1 seule cellule) ou Iceberg (plusieurs poireaux sont-ils dans la zone ? y-a-t-il des alliés ?) en faisant une estimation précise des dégâts totaux (à +/-2.5%). Le bon choix du point d'impact fera toute la différence.

J'en ai un peu chié, surtout que c'était la première fois que je bossait avec la numérotation des cellules (finalement je préfère passer par les coordonnées X et Y, plus simple à gérer je trouve que l'ID des cellules, mais le repère est inhabituel car en "biais" et les coordonnées négatives se retrouvent en haut, et ça au début je ne l'avais pas compris), mais je pense que c'est au point maintenant :)
Par contre je pourrais encore optimiser en cherchant à cibler les cellules vides plutôt que seulement les ennemis, pour maximiser le nombre d'ennemis touchés ou éviter de toucher un allié mais ce sera pour plus tard.

Carpette
01/07/2014, 16h21
Tant que t'oublie pas que Carpoitte va systématiquement au corp à corp pour la marrave, ça me va ;)

De mon côté, pour le combat en équipe, j'ai intégré le fait de booster systématiquement les copains si je ne suis pas dans un état jugé risqué pour ma pomme.
Les boost incluent de l'armure et/ou de la force (stéroïde).

Pour la suite, vu le profil de mon poireau, j'hésite entre acheter stalactites, et armure.
Quand je boost, vu mes stats en agilité, c'est monstrueux, mais du coup, je ne fais pas beaucoup de dégâts.
Je ne compte pas performer en solo avec ce poireau, il est clairement dépendant d'un autre pour faire des dégats, du coup, je me dis que "Armure" pourrait être un bon choix pour booster encore plus les copains, et devenir un point de fixation quasi immortel sur le champ de bataille.

J'attends vos avis pour acheter (surement demain, de tout façon, il me manque à peu près 10 000)

Foudge
01/07/2014, 23h38
Tant que t'oublie pas que Carpoitte va systématiquement au corp à corp pour la marrave, ça me va ;)Je ne l'oublie pas, mais clairement, j'vais parfois vous blesser :ninja:
En fait je calcule le total des dégâts, en positif si c'est un ennemi (celui au centre + éventuellement ceux autour) et en négatif si c'est un allié. Quelques règles que je m'impose :
- si le total est négatif ou nul, cette option sera rejetée.
- si un allié est collé à la cible et/ou qu'il est mal protégé, le total sera faible et sera donc moins intéressant que d'autres attaques
- si un allié est à 2 cases et/ou qu'il est protégé, ou alors s'il y a un 2ème ennemi dans la zone, il est possible que j'opte pour cette solution, le sacrifice en valant la peine
- blesser un allié est donc acceptable si cela fait vraiment très mal à l'équipe ennemie mais à condition que cette blessure ne le tue pas et à condition que sa vie ne descende pas sous les 100PV

Tout cela sera sujet à réglages, j'analyse les logs des combats en équipe pour voir ce que ça donne.
Au début par ex je n'appliquais pas ces règles quand je me mettais en "mode kamikaze" : si cela tuait l'ennemi je me foutais de savoir ce que ça allait faire autour.... jusqu'à la fois où j'ai tué un allié lors du tir (avec trophée à la clé !) :ninja: Coup de bol c'était le dernier ennemi donc ça n'a pas eu de conséquences, et c'est le seul cas où cela pourrait être acceptable. Mais j'ai corrigé le truc et je ne tuerai plus d'allié quelque soient les circonstances.

edit: j'ai déjà fait quelques tir d'Iceberg enlevant plus de 600PV à l'équipe ennemie, c'est vraiment important de bien choisir sa cible


De mon côté, pour le combat en équipe, j'ai intégré le fait de booster systématiquement les copains si je ne suis pas dans un état jugé risqué pour ma pomme.
Les boost incluent de l'armure et/ou de la force (stéroïde).

Pour la suite, vu le profil de mon poireau, j'hésite entre acheter stalactites, et armure.
Quand je boost, vu mes stats en agilité, c'est monstrueux, mais du coup, je ne fais pas beaucoup de dégâts.
Je ne compte pas performer en solo avec ce poireau, il est clairement dépendant d'un autre pour faire des dégâts, du coup, je me dis que "Armure" pourrait être un bon choix pour booster encore plus les copains, et devenir un point de fixation quasi immortel sur le champ de bataille.

J'attends vos avis pour acheter (surement demain, de tout façon, il me manque à peu près 10 000)J'avoue que pour être efficace en solo et en tournois, faut plutôt privilégier la force et la stalactite faut la prendre au plus tôt (mon 2ème poireau DeliaAntiqua vient de l'avoir dès qu'il est arrivé au niveau 55, et ça fait mal).
Si tu ne prends pas stalactite, tu vas clairement te cantonner à un rôle dans les combats en équipe. Le bon compromis est p'tet de prendre stalactite et dès que tu peux, d'autres puces de défenses moins chères qu'Armure (Casque que tu dois déjà avoir, mais aussi Mur et Bouclier). Ce qui est bien c'est que la défense se cumule.
Ou alors vu que Mur et Bouclier, qui sont pas chers mais pas terrible non plus, tu prends stalactite pour gagner les combats et les tournois, ce qui te permettra de gagner plus rapidement de l'argent pour te prendre Armure ! :)

Carpette
02/07/2014, 00h57
J'ai déja Casque et Mur, que j'arrive à empiler, donc niveau def, c'est pas dégueu du tout !

Ce qui me chagrine, c'est que la force gère les dégats des armes ET des puces ... du coup, mon stalactite va être merdique

Hem
02/07/2014, 01h58
Ah merde je pensais que c'était l'agi pour les chips dps.
Bon bah j'ai perdu 15 lv de loose pour rien x)

C'est effectivement bien efficace les petites stalactites à 250

Carpette
02/07/2014, 07h52
Et le truc moche, c'est que Stéroide, ou les autres sorts du genre sont fixe dans leur valeur. Du coup, ça boost pas mal ceux qui ont monté la force à la main.

Aucun bonus à lancer ces chips avec une haute valeur en agilité.

KeitaroSenpai
05/07/2014, 23h58
Salut les canards
Bon grâce à vous, je me suis inscrit.
Vais essayer de transférer ma roxxance en powershell en leekscript :P
Mon Poireau de combat : http://leekwars.com/leek=4309
Passez me transformer en potage à l'occase ;)

Foudge
14/07/2014, 12h54
Je viens de découvrir qu'en plus des tournois de poireaux, il y avait aussi des tournois d'éleveurs :w00t:

edit: ces dernier jours, les serveurs ont beaucoup de mal, il semblerait que ce soit l'effet Korben (http://korben.info/leek-wars.html) :)

Caligerta
17/07/2014, 18h34
Yep et grâce à Korben je m'y suis mis aussi =)
Bien fun en tout cas, j'pensais que ça allait être compliqué mais c'est plus de l'algo qu'autre chose. Super fun en tout cas !

Pareil, pour faire une bonne soupe : http://leekwars.com/leek/10163

Foudge
20/07/2014, 23h35
http://snag.gy/tG4e8.jpg

Carpette
05/06/2015, 14h49
Dites, y'a encore du monde qui y joue ? (je m'y suis remis alors ...)

Yabon14
17/10/2015, 15h15
Salut Carpette, salut les canards,

Bon alors je m'y suis mis tout récemment. Le concept est vraiment excellent. Mon nom de farmer : Yabon. J'élève un petit "ConflitDePoireau (http://leekwars.com/leek/42147)". Il se porte bien : niveau 21 avec un kill death ratio correct. Bon il n'a pas beaucoup de vie, du coup je lui ai appris la tactique dite "de petite pute" : je lui ai acheté deux points de move et j'essaie de faire en sorte qu'il reste toujours à bonne distance de l'ennemi. J'ai par contre beaucoup de difficulté contre les poireaux ayant pas mal de force et utilisant "spark" (ça tape à 10 à travers les obstacles :|). Et de manière générale, avec 160 pv, mon poireau n'a pas trop le droit à l'erreur.

Sinon je n'arrive pas à acheter un deuxième poireau (aucun message particulier au moment ou je click sur "Create", juste un click dans le vide). Du coup mon IA ne gère pour l'instant que les duels.

J'ai parcouru le threads et il y a moyen que les choses aient pas mal évolué depuis vos dernières batailles alors ça vaut le coup de s'y remettre. Revenez qu'on fasse une bonne soupe de canards :)

Blitz
17/10/2015, 17h31
Si mes souvenirs sont bons, on ne peut pas acheter de deuxième poireau avant que le premier atteigne le niveau 50.

J'avais un peu oublié mon poireau (http://leekwars.com/leek/10514), mais il à l'air de se débrouiller sans moi.

Yabon14
17/10/2015, 18h25
Hoooo merci pour l'info xotor62. Ton poireau est sacrément balèze (c'est tellement tendencieux). La gestion des bulbes doit être bien sympa parce que là pour l'instant je ne vois pas trop comment améliorer mon IA dans l'immédiat (à part faire un pathfinding à la main maintenant que j'ai accès à la fonction isObstacle()). Eventuellement, si je vois que l'adversaire utilise spark, je vais essayer de me battre uniquement avec cette arme également (et fuir ensuite comme un gros lâche).

Anonyme221030
09/04/2018, 17h12
Nécrothread!

J'ai découvert ce jeu par hasard (via un vieux lien sur un autre forum) et je trouve le concept bien sympa. Y a encore des canards qui trainent dessus?

Le seul truc qui me chagrine un peu pour l'instant c'est le temps que prennent les combats, surtout qu'il y en a 50 par jour apparemment. Y a pas moyen d'avoir direct la page des résultats (avec le graphique des PV) et regarder la "vidéo" éventuellement après?

Je me suis fait une fonction récursive pour trouver une case à l'abri (si elle existe) en fonction de l'arme de l'adversaire, jusque là ça marche pas trop mal à condition de tomber sur un poireau plus lent. J'économise pour me payer mon 5e MP, ça devrait améliorer l'efficacité de l'algo. Enfin, à condition qu'il pète pas avec l'augmentation du mouvement :p

Hideo
10/04/2018, 01h15
La vache ça date :o

Quand j'y jouais il y a quelques années on pouvait déjà faire ca (heureusement).

Edit : Apres verif, en cliquant sur "quitter", on passe bien directement a la page des resultats.

Anonyme221030
10/04/2018, 01h35
Yep mais je me demandais si on pouvait pas le rendre automatique via une option ou autre.

Bien marrant ce petit jeu en tout cas, sans doute un peu cryptique pour les gens qui connaissent rien au dev mais je trouve que ça change des jeux de grind à la con qui pullulent sur le web. Entre les builds et "l'IA" y a une grosse richesse de gameplay, on peut vraiment tenter pas mal de chose. Vivement le 2e poireau :p