IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Delphi Discussion :

Generer des objets aleatoirement sur une carte


Sujet :

Langage Delphi

  1. #1
    K20
    K20 est déconnecté
    Membre du Club
    Profil pro
    Ingé DevOps
    Inscrit en
    Novembre 2005
    Messages
    183
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Ingé DevOps

    Informations forums :
    Inscription : Novembre 2005
    Messages : 183
    Points : 64
    Points
    64
    Par défaut Generer des objets aleatoirement sur une carte
    Bonjour tout le monde !
    Vous aurez peut etre vu mon topic qui parle d'une DrawGrid dans ce topic

    Je veux desormais afficher des objets aleatoirement sur ma carte
    En fait je veux placer des arbres, des montagnes et de l'eau qui sont representes par des rectangles qui font la taille de mes cases.

    Donc il faudrait si possible qu'il soit colle par petits groupes.

    La personne qui utilise mon programme a la possiblite de choisir le % en quelque sorte du nombre d'objet qu'elle veut grace a des TrackBar.

    Donc j'y suis depuis 2h, j'ai essaye beaucoup de possiblite mais le probleme c'est que la plupart du temps ca depasse ma carte et des fois ca me fait des depassements de capacite !

    Donc je fais appel a votre aide, car la je bloque

    Voici une partie du code qui s'occupe de tout ca : (a vrai dire, il faudrait recommcencer toute la partie a partir du "// On genere les arbres" ...)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    ////////////////////////////////////////////////////////////////
    (* On genere les objets quand on clique sur le bouton generer *)
    ///////////////////////////////////////////////////////////////
      Randomize;
     
      nb_arbres := Round((GenArbres.Position * 50) / nb_cases);
      nb_eau := Round((GenEau.Position * 50) / nb_cases);
      nb_montagnes := Round((GenMontagnes.Position * 50) / nb_cases);
     
      // On genere les arbres
      VarChamp := oArbres;
     
          largeur_nb := Random(nb_cases div 2);
          hauteur_nb := largeur_nb;
          j := nb_arbres;
          i := 0;
          k := 0;
          while j <> Round(nb_arbres / 10) do
            begin
            // On change le x
              x := largeur_nb + k;
              y := hauteur_nb;
     
            // On affiche l'arbre
              Gen('arbre',x,y);
     
            // On change le y
              x := largeur_nb;
              y := hauteur_nb - i;
     
            // On affiche l'arbre
              Gen('arbre',x,y);
     
            k := k+1;
            i := i+1;
            j := j-1;
            end;
    Voila, ce code permet de calculer les coordonnes des cases de mes objets et Gen s'occupe de les placer.

    Merci d'avance pour votre aide

  2. #2
    K20
    K20 est déconnecté
    Membre du Club
    Profil pro
    Ingé DevOps
    Inscrit en
    Novembre 2005
    Messages
    183
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Ingé DevOps

    Informations forums :
    Inscription : Novembre 2005
    Messages : 183
    Points : 64
    Points
    64
    Par défaut
    Personne n'a une petite idée ?

  3. #3
    K20
    K20 est déconnecté
    Membre du Club
    Profil pro
    Ingé DevOps
    Inscrit en
    Novembre 2005
    Messages
    183
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Ingé DevOps

    Informations forums :
    Inscription : Novembre 2005
    Messages : 183
    Points : 64
    Points
    64
    Par défaut
    Vraiment personne pour m'aider

  4. #4
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Points : 8 078
    Points
    8 078
    Par défaut
    Slut
    Visiblement, ta TDrawGrid n'a pas le nombre de ligne ou de colonnes suffisant...
    Donne le code de Gen() pour voir
    Pedro
    Aucune réponse aux sollicitations techniques par MP

    Faut pas attendre d'en avoir besoin pour s'en servir... (Lucien Stéphane)

    Les pages Source C'est bon. Mangez-en!
    Le défi Delphi
    Règles du forum - FAQ Delphi - Pensez au chtit
    Aéroclub Bastia Saint-Exupéry

  5. #5
    K20
    K20 est déconnecté
    Membre du Club
    Profil pro
    Ingé DevOps
    Inscrit en
    Novembre 2005
    Messages
    183
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Ingé DevOps

    Informations forums :
    Inscription : Novembre 2005
    Messages : 183
    Points : 64
    Points
    64
    Par défaut
    Ce n'est pas une TDrawGrid maus un tableau à 2 variables entières (une matrice quoi ^^)

    Et de toute façon mon code est surement très faux

    Voici le code de ma procédure Gen :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    ////////////////////////////////
    // Procedure de generation ! //
    //////////////////////////////
    procedure Ts_editeur.Gen(Outil : string; x,y : integer);
    var
      mJPEG : TJPEGImage;
      mBitMap : TBitmap;
      Chemin : string;
      ARect:TRect;
    begin
     
      mJPEG := TJPEGImage.Create;
      mBitMap := TBitmap.Create;
     
      Chemin := ExtractFilePath(Application.ExeName) + '\textures\outils\' + Outil + '.jpg';
     
      // Tableau d'occupation et textures
        if CaseOccup[x,y] = '' then
          begin
            Infos(VarChamp,'');
            Global;
          end;
        CaseOccup[x,y] := Outil;
     
      mJPEG.LoadFromFile(Chemin);
      mBitMap.Assign(mJPEG);  // "transforme" le JPEG en BMP
     
      ARect := Bounds(x*largeur_case,y*largeur_case,largeur_case,largeur_case);
      DessinCarte.Canvas.StretchDraw(AREct,mBitMap);
      mJPEG.Free;
      mBitMap.Free;
      Carte.Repaint;
    end;

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2003
    Messages : 38
    Points : 43
    Points
    43
    Par défaut
    J'avoue que j'ai un peu la flemme de me pencher sur ton probleme en detaisl (il est tard ) mais je te propose une solution alternative.

    Pour la generation aleatoire d'un element, pourquoi ne fais tu pas une simple boucle "for" pour placer tous les arbres (vu que tu as un nombre precis a placer).
    Dans cette boucle, tu fais une boucle While pour generer un nombre aleatoire. La boucle while sert a boucler tant que le nombre sorti n'est pas un "nouveau" nombre (nouveau = n'ets pas sorti auparavant). Pour cela, il est bien sur conseille de maintenir un petit tableau ou liste avec tous les nombres sortis pour verifier au fur et a mesure.

    Apres bien sur, si tu veux faire des forets ou autre, tu peux generer un nombre aleatoire jusqu'a 10 (appelons le X) et tous les X arbres, tu generes une foret autour. Dans ce cas la, il faut bien sur tenir compte que le boucle originale avec le for devra aller "moins loin" car beaucoup d'arbres seront ajoutes par tas et non arbre par arbre.

  7. #7
    K20
    K20 est déconnecté
    Membre du Club
    Profil pro
    Ingé DevOps
    Inscrit en
    Novembre 2005
    Messages
    183
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Ingé DevOps

    Informations forums :
    Inscription : Novembre 2005
    Messages : 183
    Points : 64
    Points
    64
    Par défaut
    Heu, j'ai pas très bien compris

    Sinon vous n'avez pas des exemples de sources ?

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2003
    Messages : 38
    Points : 43
    Points
    43
    Par défaut
    Precision sur mon message :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    i: integer;
    EtsAdded: array of integer;
     
    For i:=1 to nbrElements do
    begin
      RandomNbr := Random(NbrElements);
      While RandomNbr in EtsAdded do
        RandomNbr := Random(NbrElements);
      //Placage de l'element
    end;

  9. #9
    K20
    K20 est déconnecté
    Membre du Club
    Profil pro
    Ingé DevOps
    Inscrit en
    Novembre 2005
    Messages
    183
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Ingé DevOps

    Informations forums :
    Inscription : Novembre 2005
    Messages : 183
    Points : 64
    Points
    64
    Par défaut
    Ok, mais moi c'est surtout le placage de mon élément que j'ai du mal
    Car il dépasse toujours la capacité de mon tableau (à fur et à mesure que je place mes objets)

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2003
    Messages : 38
    Points : 43
    Points
    43
    Par défaut
    Excuse, je me suis plante dans mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    For i:=1 to nbrElements do
    begin
      RandomNbrX := Random(MaxX);  //MaxX est le nombre de case horizontales
      While RandomNbrX in EtsAddedX do
        RandomNbrX := Random(MaxX);
      EtsAddedX[Length(EtsAddedX)] := RandomNbrX;
      RandomNbrY := Random(MaxY);  //MaxY est le nombre de case verticales
      EtsAddedY[Length(EtsAddedY)] := RandomNbrY;
      While RandomNbrY in EtsAddedY do
        RandomNbrY := Random(MaxY);
      //Placage de l'element = MaGrille[RandomNbrX, RandomNbrY] := Arbre;
    end;
    Ca devrait mieux le faire non ?

    EDIT : j'avais oublier d'ajouter les nombres dans les tableaux

  11. #11
    K20
    K20 est déconnecté
    Membre du Club
    Profil pro
    Ingé DevOps
    Inscrit en
    Novembre 2005
    Messages
    183
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Ingé DevOps

    Informations forums :
    Inscription : Novembre 2005
    Messages : 183
    Points : 64
    Points
    64
    Par défaut
    Yep je pense :p
    Je teste ça demain et je te dis
    Merci !

  12. #12
    K20
    K20 est déconnecté
    Membre du Club
    Profil pro
    Ingé DevOps
    Inscrit en
    Novembre 2005
    Messages
    183
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Ingé DevOps

    Informations forums :
    Inscription : Novembre 2005
    Messages : 183
    Points : 64
    Points
    64
    Par défaut
    Bon je viens de commencer à transcrire le code est je voulais savoir :
    EtsAddedX c'est quoi ???

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2003
    Messages : 38
    Points : 43
    Points
    43
    Par défaut
    C'ets un "array of integer".
    Soit un tableau dynamique de chiffres entiers signés.

    Attention, une petite remarque encore, j'ai oublie d'augmenter la longueur du tableau (avec SetLength) a chaque fois que je rajoute un element.
    Pour de meilleures performances, tu peux essayer de passer par une liste, voir un tableau dont tu incremente la capacite seulement tous les 32 elements.

  14. #14
    K20
    K20 est déconnecté
    Membre du Club
    Profil pro
    Ingé DevOps
    Inscrit en
    Novembre 2005
    Messages
    183
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Ingé DevOps

    Informations forums :
    Inscription : Novembre 2005
    Messages : 183
    Points : 64
    Points
    64
    Par défaut
    C'est bon j'ai réussi

    J'ai modifié tout ça à ma sauce
    ça fonctionne nickel merci beaucoup !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. placer des coordonnées GPS sur une carte
    Par tomkiki dans le forum Débuter
    Réponses: 7
    Dernier message: 15/01/2011, 17h55
  2. [BPW] Unité TestSB - Joue des fichiers VOC sur une carte Sound Blaster
    Par Alcatîz dans le forum Codes sources à télécharger
    Réponses: 0
    Dernier message: 08/11/2010, 21h07
  3. [PHP 5.2] Localiser des adresses postales sur une carte
    Par arthuro45 dans le forum Langage
    Réponses: 3
    Dernier message: 30/08/2010, 15h29
  4. Déplacer des objets images sur une page
    Par KeKeMaN dans le forum Général Conception Web
    Réponses: 3
    Dernier message: 17/02/2009, 09h59
  5. [AJAX] Déplacer des objets HTML sur une page web
    Par brazilia28 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 09/06/2007, 12h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo