Partage
  • Partager sur Facebook
  • Partager sur Twitter

Simplification d'un problème.

27 mai 2020 à 17:08:47

Bonjour ! :)

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 :D, 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

  • Partager sur Facebook
  • Partager sur Twitter
Vous n'auriez pas un ptit calcul à me montrer ? :D
27 mai 2020 à 22:06:32

Salut,

Voici une idée d'algo un peu bourrin :

Si les cases 0,14 et 1 ont pour coordonnées respectives (0,0), (1,0) et (1,1) :

Tu calcules le quotient et le reste de la division euclidienne de idCase par 28.

Le quotient te donne le nombre de translation (1,-1).

Ensuite, si le reste est inférieur ou égale a 13, il te donne le nombre de translations (1,1).

Sinon, tu lui retire 14, tu obtiens le nombre de translations (1,1) et tu en rajoutes une (1,0).

Par exemple, pour la case 29 : 29 = 28*1+1 -> (1,-1)*1+(1,1)=(2,0) 

J'ai pas réussi à trouver plus simple pour l'instant.

-
Edité par leukos 27 mai 2020 à 22:07:13

  • Partager sur Facebook
  • Partager sur Twitter
27 mai 2020 à 23:38:56

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.

  • Partager sur Facebook
  • Partager sur Twitter
28 mai 2020 à 22:39:46

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 !
  • Partager sur Facebook
  • Partager sur Twitter
Vous n'auriez pas un ptit calcul à me montrer ? :D
19 juin 2020 à 0:13:24

Je suis quand meme vraiment pas sur que tu puisse boter sur dofus ..
  • Partager sur Facebook
  • Partager sur Twitter
19 juin 2020 à 9:14:10

Tu peux :) 

Mais tu n'as pas le droit. 

  • Partager sur Facebook
  • Partager sur Twitter
Vous n'auriez pas un ptit calcul à me montrer ? :D
19 juin 2020 à 10:30:48

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.

-
Edité par Tiffado 19 juin 2020 à 10:33:07

  • Partager sur Facebook
  • Partager sur Twitter
19 juin 2020 à 11:36:54

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.
  • Partager sur Facebook
  • Partager sur Twitter
Vous n'auriez pas un ptit calcul à me montrer ? :D