Bonjour tout le monde :)
Voici la mise à jour 2.22 de Leek Wars, avec un unique thème pour cette fois, et un sujet rarement traité dans les dernières mises à jour, le LeekScript lui-même !
Trop long ; pas lu : Nouvelle version du LeekScript, la 1.1, qui ajoute la programmation orientée objet (POO), le passage par référence par défaut, les références dans les tableaux, une fonction clone(), des erreurs multiples dans l'éditeur, une pile d'appel complète dans les erreurs, les points virgules non obligatoires et quelques corrections. Pas de compatibilité descendante pour changer ces points fondamentaux.
En 2016, j'ai annoncé le développement d'une nouvelle version du langage de Leek Wars, le LeekScript v2, avec un ensemble conséquent d'évolutions : performance, fonctionnalités, corrections. Cette version a très bien avancé mais nécessite hélas encore beaucoup de travail pour arriver à une certaine stabilité. En attendant, le langage utilisable par les joueurs (dont moi) n'avance pas et c'est dommage.
J'ai donc eu l'idée de réaliser une version intermédiaire en partant de la version actuelle et en rajoutant un ensemble de fonctionnalités qui vont améliorer nettement l'expérience de programmation sur le jeu tout en étant rapide à faire (en effet cela m'a pris une ou deux semaines). Cela permet de rajouter progressivement des briques au langage au lieu de tout sortir d'un coup. Il y a aura aussi du retour d'expérience sur les fonctionnalités déjà sorties qui faciliteront le développement du LSv2.
Les objectifs pour cette version 1.1 étaient de traiter les problèmes de la version 1.0 les plus pénibles et de faciliter le développement de grandes IA. Corriger ces problèmes signifie changer certains comportement fondamentaux du langage et donc il était impossible de garder une compatibilité entre les IA 1.0 et 1.1 (ce qui sera peut être le cas entre la 1.1 et 2.0 au passage).
Ça sera donc à l'utilisateur de décider de créer une nouvelle IA 1.1 ou de migrer une IA 1.0 vers 1.1 et effectuer certains changements dans ses algorithmes. J'ai l'ai fait avec mon IA personnelle et j'ai compilé les points pouvant poser souci dans un petit guide de migration sur l'encyclopédie : .
Pour activer cette version 1.1, un bouton est disponible en bas à gauche de l'éditeur. Elle n'est donc pas obligatoire et les deux version cohabitent parfaitement.
Programmation Orientée Objet (POO)
La programmation orientée objet est un paradigme de programmation consistant à représenter les concepts par des objets qui sont des structures possédant leur propres données et méthodes. Fonctionnalité la plus attendue du LeekScript v2, elle fait son apparition dès maintenant dans la 1.1, dans une version basique mais tout de même efficace : toute la syntaxe classique de la POO est présente : classes, propriétés, méthodes, niveaux d'accès, constructeurs, champs statiques, héritage etc.
Néanmoins, le LeekScript 1.1 ne possédant toujours pas d'inférence de type, la vérification des champs et des méthodes demandés sur un objet se fait uniquement à l’exécution (comme pour les fonction actuelles) et non à la compilation dans l'éditeur. C'est une grande limitation comparé à un langage fortement typé comme le Java, mais cela ne retire pas l'avantage d'utiliser la POO dans son IA. Tout le moteur d'inférence de type qui se prépare dans le LSv2 viendra se brancher dans un second temps et nous aurons une expérience encore meilleure.
Pour tous les détails sur la POO en LeekScript, rendez-vous sur cette page de l'encyclopédie : .
Passage par référence par défaut
Dans la version 1.0, toutes les valeurs passées en paramètre de fonction ou en affectation d'une variable sont copiées, entraînant des coups en opérations à chaque fois. La syntaxe avec le @ permet plus ou moins de contourner les copies mais est complexe à mettre en place et à maintenir.
Désormais, les valeurs non-primitives, c'est à dire les tableaux et les objets sont toujours passés par référence, sans aucune copie. Ce comportement est celui de la plupart des langages comme JavaScript et Java. Il est beaucoup plus intuitif et pratique pour manipuler beaucoup de ces structures de données.
Bien sûr, il est toujours possible d'effectuer une copie, avec la fonction créée pour l’occasion : clone(). Elle permet d'ailleurs de copier avec une certaine profondeur pour optimiser au maximum son algorithme.
Références dans les tableaux
Il est maintenant possible d'ajouter des références dans les tableaux (et les objets), permettant de créer des structures complexes et/ou récursives à un coût raisonnable.
Exemples de structures de données difficilement réalisables en 1.0 et très facile en 1.1 : Listes chaînées, Arbres, Graphes, File de priorité. À vos claviers ;)
Erreurs multiples dans l'éditeur
Plusieurs erreurs peuvent être renvoyés à la sauvegarde d'une IA contre une seule avant. Plus pratique pour coder.
Pile d'appel complète
La pile d'appel complète est affichée sous chaque erreur, au lieu d'une seule ligne auparavant.
Points virgules non obligatoires : tout est dans le titre ^_^
arrayFilter Correction de arrayFilter : le tableau est correctement réindexé sans laisser de valeurs null.
Chaîne "\\" Correction de l'échappement de la chaîne "\\" qui affiche bien un seul \ au lieu de deux.
Déclaration de globales Correction sur les déclarations de globales à travers plusieurs fichiers.
Opérateur ^= Correction de l'opérateur ^= qui devient le OU binaire au lieu de la puissance.
Fonction shuffle La fonction shuffle prend en compte le générateur de nombre aléatoire branché sur la graine du combat et est donc déterministe pour une même graine. Elle pouvait provoquer des variations entre deux combats générés à partir d'une même graine, ce qui impacte les tests.
Le LeekScript, 1.0 ou 1.1 est plus rapide d'environ 2% pour une même IA grâce aux petites optimisations réalisées à l'occasion.
Pour la différence entre une IA 1.0 et 1.1 (la mienne car c'est la seule actuellement en 1.1), j'ai mesuré les valeurs suivantes, pour un combat strictement identique bien sûr :
Le but principal n'était pas d'améliorer les performances mais l’utilisation d'objet au lieu de tableaux qui simulaient des objets dans mon IA résulte en un gain de 12% de performance, c'est un résultat appreciable.
Je laisse exprès des coûts en opérations avantageux mais ils pourront bien sûr être modifiés dans le futur.
J'espère que tout ça vous plaira et vous permettra de développer mieux et plus rapidement les IA de vos chers poireaux. C'était un plaisir de nettoyer son code des artifices que j'avais utilisés pour simuler de la POO et également les @ dans tous les sens !
Comme c'est lancé, il pourrait éventuellement y avoir une 1.2 avec un autre pack de changements avant la 2.0. La liste des points qui restent exclusifs à la 2.0 sont maintenant :
Il n'est pas impossible que certains de ces points se retrouvent implémentés avant la sortie de la V2 ;)
En tout cas bon jeu à tous et à la prochaine màj !
Impossible de charger les données du jeu.
Vérifiez votre connexion et réessayez.