¤ Vendetta ¤
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.


Forum du jeu de rôle, stratégie et gestion: Vendetta
 
AccueilPortailGalerieRechercherDernières imagesS'enregistrerConnexion
Le Deal du moment :
Funko POP! Jumbo One Piece Kaido Dragon Form : ...
Voir le deal

 

 Algorithmes internes

Aller en bas 
2 participants
AuteurMessage
Yoha
Admin
Yoha


Masculin
Nombre de messages : 1212
Date d'inscription : 10/02/2008

Algorithmes internes Empty
MessageSujet: Algorithmes internes   Algorithmes internes EmptyDim 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 Shocked ).

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.
Revenir en haut Aller en bas
Atoboldom
Commerçant
Commerçant
Atoboldom


Masculin
Nombre de messages : 311
Age : 32
Date d'inscription : 05/03/2008

Algorithmes internes Empty
MessageSujet: Re: Algorithmes internes   Algorithmes internes EmptyDim 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 Razz


PS : Il y en a qui vont encore rien comprendre à ce topic Laughing
Revenir en haut Aller en bas
Yoha
Admin
Yoha


Masculin
Nombre de messages : 1212
Date d'inscription : 10/02/2008

Algorithmes internes Empty
MessageSujet: Re: Algorithmes internes   Algorithmes internes EmptyDim 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).
Revenir en haut Aller en bas
Atoboldom
Commerçant
Commerçant
Atoboldom


Masculin
Nombre de messages : 311
Age : 32
Date d'inscription : 05/03/2008

Algorithmes internes Empty
MessageSujet: Re: Algorithmes internes   Algorithmes internes EmptyDim 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
Revenir en haut Aller en bas
Yoha
Admin
Yoha


Masculin
Nombre de messages : 1212
Date d'inscription : 10/02/2008

Algorithmes internes Empty
MessageSujet: Re: Algorithmes internes   Algorithmes internes EmptyDim 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.
Revenir en haut Aller en bas
Contenu sponsorisé





Algorithmes internes Empty
MessageSujet: Re: Algorithmes internes   Algorithmes internes Empty

Revenir en haut Aller en bas
 
Algorithmes internes
Revenir en haut 
Page 1 sur 1

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
¤ Vendetta ¤ :: Autour du forum :: Vos idées-
Sauter vers: