Yoha Admin
Nombre de messages : 1212 Date d'inscription : 10/02/2008
| Sujet: Algorithmes internes Dim 18 Mai 2008 - 11:07 | |
| Bonjour, j'ai commencer à coder diverses choses utiles pour les IAs. J'ai par exemple codé un petit code pour se diriger vers la ressource de terrain du type voulu la plus proche. Je ne trouve pas ça très propre mais ça fonctionne correctement. En revanche, il me faudra sans doute d'autres algorithmes pour, par exemple, positionner une maison le plus près possible du personnage ou prévoir le plus court chemin (en gros résoudre le problème du voyageur de commerce ). Algorithme:De manière générale, suite d'instruction. Par exemple, une recette de cuisine peut être considérée comme un algorithme. Les instructions seront par exemple: - Prenez 500 grammes de sel;
- Buvez une bière;
- Mettez le sel dans un saladier;
- Etc...
Code utilisé pour aller à la ressource proche: - Code:
-
TerRessource* Monde::ChercheTerRessource(const double x, const double y, const double distanceMax, TypeTerRessource* type) const { int debutX = (int)((x - distanceMax) / Prgm::TerRessources::Largeur); if (debutX < 0) debutX = 0; int maxX = (int)((x + distanceMax) / Prgm::TerRessources::Largeur); if (maxX >= (int)(mLargeur * Prgm::Terrains::Largeur / Prgm::TerRessources::Largeur)) maxX = mLargeur - 1; int debutY = (int)((y - distanceMax) / Prgm::TerRessources::Hauteur); if (debutY < 0) debutY = 0; int maxY = (int)((y + distanceMax) / Prgm::TerRessources::Hauteur); if (maxY >= (int)(mHauteur * Prgm::Terrains::Hauteur / Prgm::TerRessources::Hauteur)) maxY = mHauteur - 1; TerRessource* ressourceTemp = NULL; TerRessource* ressourcePlusProche = NULL; int TabX = debutX; int TabY; while (TabX < maxX) { TabY = debutY; while (TabY < maxY) { ressourceTemp = &mTableauRessources[TabX * mHauteur + TabY]; if (ressourceTemp->GetActif() && ressourceTemp->GetTypeTerRessource() == type) { if (!ressourcePlusProche || CalculeDistance(x, y, ressourceTemp->GetX(), ressourceTemp->GetY()) <= CalculeDistance(x, y, ressourcePlusProche->GetX(), ressourcePlusProche->GetY())) { ressourcePlusProche = ressourceTemp; } } TabY++; } TabX++; } if (CalculeDistance(x, y, ressourcePlusProche->GetX(), ressourcePlusProche->GetY()) <= distanceMax) return ressourcePlusProche; else return NULL; } Explication: Je parcours le carré qui contient le cercle de rayon voulu puis je vérifie à chaque fois si la ressource actuellement sélectionnée est bien la plus proche des deux. A la fin, je vérifie si la ressource se trouve à la bonne distance. | |
|
Atoboldom Commerçant
Nombre de messages : 311 Age : 32 Date d'inscription : 05/03/2008
| Sujet: Re: Algorithmes internes Dim 18 Mai 2008 - 15:34 | |
| Ce me semble pas mal mais optimisable je pense. cependant je n'arrive pas à comprendre la première partie de ton code : à quoi correspondent toutes ces conditions ? Petite remarque sur les casts, utilise plutôt les static_cast pour caster les int, les casts à la C ça fait pas terrible même s'ils sont plus court à écrire PS : Il y en a qui vont encore rien comprendre à ce topic | |
|
Yoha Admin
Nombre de messages : 1212 Date d'inscription : 10/02/2008
| Sujet: Re: Algorithmes internes Dim 18 Mai 2008 - 17:36 | |
| C'est pour ça que je les utilise encore :p . Mais il faudra sérieusement que je revois ce genre de choses dans mon style de programmation (en réalité j'aimerais éviter de convertir les types / classes tout court).
Je pense qu'on peut faire une partie du topic technique et une autre plus accessible. Il faudra juste reconnaître ce qui correspond à quoi.
Pour les conditions, c'est dans les cas où je dépasse les limites de la carte (je deteste le "mLargeur * Prgm::Terrains::Largeur / Prgm::TerRessources::Largeur" pour convertir la largeur en nombre de terrain en nombre de ressources de terrain). | |
|
Atoboldom Commerçant
Nombre de messages : 311 Age : 32 Date d'inscription : 05/03/2008
| Sujet: Re: Algorithmes internes Dim 18 Mai 2008 - 18:27 | |
| Pas bête pour la partie technique/ou pas. Ne pas caster c'est possible mais bon il est souvent plus simple de mettre un cast, un peu sale je l'accorde.
Sinon si tu as vraiment horreur de cette convertion met la dans une fonction qui le fait un peu plus proprement et tu ne le verras plus :p | |
|
Yoha Admin
Nombre de messages : 1212 Date d'inscription : 10/02/2008
| Sujet: Re: Algorithmes internes Dim 18 Mai 2008 - 20:09 | |
| Je pense que je devrais pouvoir éviter la conversion, à condition de faire attention aux types transmis mais certaines fonctions fonctionnent plus ou moins bizarrement. | |
|
Contenu sponsorisé
| Sujet: Re: Algorithmes internes | |
| |
|