J'essaie actuellement de développer une IA sur un jeu en ligne, Dofus. Je serai bien incapable de "hacker" le jeu est de connaître les requêtes à envoyer au serveur pour effectuer telle ou telle action, mais quelqu'un s'est déjà chargé de cette partie. Je lui fait une petite pub, parce que son programme est vraiment bien foutu (bien que payant) : https://www.snowbot.eu/
Mais à vrai dire, ce qui nous intéresse ici n'a aucun rapport avec le jeu (ou du moins, aucune connaissance du jeu ne vous ai nécessaire pour m'aider). Pour coder une IA, j'ai besoin régulièrement d'avoir accès à des distances entre deux entités, de savoir si des entités sont alignés ou non, ou de calculer des lignes de vue (j'aurais sûrement besoin de votre aide pour ça aussi , mais pas tout de suite).
Il s'agit d'un jeu par cases : Ainsi, si j'ai une case de coordonnées \( A = (x_{1}, y_{1})\), une case de coordonnées \(B = (x_{2}, y_{2})\), la distance entre les deux est assez trivialement \(|x_{1}-x_{2}| + |y_{1}-y_{2}|\) (et pas la distance euclidienne comme on pourrait s'y attendre). Le fait d'avoir des coordonnées simplifie énormément beaucoup de calculs.
Le problème, c'est que je n'ai jamais accès aux coordonnées de mes entités, mais à leur idCase. Et je ne vois pas comment transformer un idCase en une coordonnée de manière simple. Un bon schéma vaudra toujours mieux qu'on long discours, donc je vous mets en pièce jointe la manière dont sont numérotées les cases dans le jeu.
Voyez-vous une manière intelligente d'avoir accès aux coordonnées d'une case, en fonction de sa numérotation ? Ca me paraît complexe étant donnés que toutes les diagonales ne font pas la même taille etc... Si je suis vraiment bloqué, je me résoudrai à faire une transcription à la main, un gros tableau tel que tab[idCase]=(x,y), mais ça me paraît moche, donc j'aimerais savoir si vous voyez plus intelligent.
Merci et bonne journée !
- Edité par gasasaa 27 mai 2020 à 17:09:54
Vous n'auriez pas un ptit calcul à me montrer ? :D
Pour info, la distance que tu utilises s'appelle distance de Manhattan ; ça peut t'aider pour tes recherches. La solution de leukos paraît correcte pour placer chaque point. Et je ne pense pas qu'on puisse trouver plus simple.
Ok merci Leukos, le processus est vraiment bien foutu. Je vais essayer de trouver un moyen d'inverser l'algorithme à partir de ce que tu m'as dis (obtenir l'id à partir des coordonnées, je te ferai signe si j'y arrive pas. Merci !
Vous n'auriez pas un ptit calcul à me montrer ? :D
Si je dis pas de bêtises, la version actuelle de dofus a des maps de tailles fixes. A l'époque de la 1.29, certaines zones avaient des maps plus grandes (bonta ou brakmar par exemple). (c'est la map (-1;0) ton screen si je ne m'abuse).
Si on part du principe que chaque map a exactement la même forme, avec le même nombre de cases, ça pourrait être intéressant de te faire un mapping maison et de passer d'un idCase à une coordonné cartésienne. Car une fois que c'est fait, ça sera beaucoup plus simple pour toi de faire ce que tu veux à partir de cases avec des coordonnées qu'une liste d'idCase.
Après, pour m'y être dejà essayé il y a longtemps, je n'avais pas trouvé de solution magique pour modéliser ce genre de maps proprement, le fait que les cases soient en quinconce pose un petit soucis. Après, rien d'insurmontable, le soucis est juste de trouver comment faire un truc propre.
Tiffado regarde l'algorithme de Leko, tout marche parfaitement. Et oui, toutes les maps font la même taille (au moins sur la version actuelle de Dofus), c'est pour ça que j'essaie de passer avec un système de coordonnées plutôt que des idCases.
Vous n'auriez pas un ptit calcul à me montrer ? :D