Forum du jeu de rôle, stratégie et gestion: Vendetta
 
AccueilPortailGalerieFAQRechercherS'enregistrerMembresGroupesConnexion

Partagez | 
 

 Algorithmes internes

Voir le sujet précédent Voir le sujet suivant Aller en bas 
AuteurMessage
Yoha
Admin
avatar

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

MessageSujet: 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 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.

_________________
Le développement avance !
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Atoboldom
Commerçant
Commerçant
avatar

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

MessageSujet: 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 Razz


PS : Il y en a qui vont encore rien comprendre à ce topic Laughing
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Yoha
Admin
avatar

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

MessageSujet: 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).

_________________
Le développement avance !
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Atoboldom
Commerçant
Commerçant
avatar

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

MessageSujet: 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
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Yoha
Admin
avatar

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

MessageSujet: 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.

_________________
Le développement avance !
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Contenu sponsorisé




MessageSujet: Re: Algorithmes internes   

Revenir en haut Aller en bas
 
Algorithmes internes
Voir le sujet précédent Voir le sujet suivant Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» [Codex Levan] Chapitre 9 – Des modalités internes
» Méfiez vous de vos chats !
» PRÉNOTIONS DE COS d'Hippocrate
» ailes int hornetaur
» Classement Xtreme GLOBAL (tournois internes + externes)

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