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

Développement 2D, 3D et Jeux Discussion :

[C++][Jeux 2D][Algo] Générateur aléatoire d'objets


Sujet :

Développement 2D, 3D et Jeux

  1. #1
    Expert confirmé
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Points : 4 388
    Points
    4 388
    Par défaut [C++][Jeux 2D][Algo] Générateur aléatoire d'objets
    Bonjour,

    Dans le cadre du développement de mon jeu vidéo 2D (un Zelda), je cherche un algorithme pas trop simple pour générer aléatoirement des objets (coeurs, rubis...) après une action spécifique (détruire buisson, herbe...)

    Je n'ai pas trop d'idées à part un rand() mais bon je suis sur qu'on peut faire mieux

    Si vous avez un algo intelligent, faites le savoir

    Merci
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

  2. #2
    Expert éminent

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 813
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Fabricant et casseur d'avions
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 813
    Points : 7 638
    Points
    7 638
    Par défaut
    Salut,

    Citation Envoyé par Aspic Voir le message
    je cherche un algorithme pas trop simple pour générer aléatoirement [...] à part un rand() [...] Si vous avez un algo intelligent [...]
    Alors là, il va falloir nous préciser ce que tu entends par de l'aléatoire intelligent... parce que ça m'a l'air assez subjectif comme notion!

    De l'aléatoire sur une sous-population judicieusement sélectionnée, ça irait ou pas?
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

  3. #3
    Expert confirmé
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Points : 4 388
    Points
    4 388
    Par défaut
    Citation Envoyé par plegat Voir le message
    De l'aléatoire sur une sous-population judicieusement sélectionnée, ça irait ou pas?
    Ouais je pense

    En fait pour être plus clair, sur une map, il peut y avoir X objets destructibles. Chaque objet destructeur à une certaine probabilité de laisser derrière lui un item (coeur, potion, rubis...). Mais chaque item a aussi une probabilité d'apparaitre différente :
    Ex : un rubis à plus de chance d'apparaitre d'un coeur

    J'espère que je suis clair
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

  4. #4
    Expert éminent

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 813
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Fabricant et casseur d'avions
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 813
    Points : 7 638
    Points
    7 638
    Par défaut
    Un peu plus...

    Ce que je ferai... pour chaque objet, tu définis un seuil à partir duquel on laisse un item. Et pour chaque item, tu définis un seuil.

    Exemple:

    Objet A, seuil 0.6, item X: 0 à 0.6, item Y: 0.6 à 0.8, item Z: 0.8 à 1.0

    En traduisant, tu tires deux rand, un qui sera à comparer au seuil, le second qui déterminera quel item apparait.
    Si le premier rand est inférieur au seuil (donc 0.6), l'item apparait. Par exemple si le second rand a donné 0.68, ça donnera un item Y. Si il avait donné 0.89, ça aurait donné un item Z.

    Et tu modules en fonction de tes différents objets. Par exemple:
    Objet B, seuil 0.4, item X: 0 à 0.35, item Y: 0.35 à 0.4, item Z: 0.4 à 1.0

    Plus sioux, si tu ne veux tirer qu'un seul rand, tu définis un item "fantome" qui va consommer une partie des probabilités, exemple:

    Objet A, item "fantome" (ou "pas d'item"): 0 à 0.6, item X: 0.6 à 0.7, item Y: 0.7 à 0.8, item Z: 0.8 à 1.0

    C'est un peu moins direct sous cette forme pour voir quelle est la probabilité d'un vrai item par rapport à un autre, mais ça économise un rand. Là, tu vois que les item X, Y et Z sont tous sur une plage de 0.1, ils ont tous la même probabilité d'apparaitre... si un item apparait!

    Avec l'objet A du début, on avait 60% pour l'item X, 20% pour le Y et 20% pour le Z, ce qui se traduirait avec la version uni-rand:
    Objet A, item "fantome" (ou "pas d'item"): 0 à 0.6 (=seuil à 60%), item X: 0.6 à 0.84 (60% des 40% restants, ça fait 24% du total), item Y: 0.84 à 0.92 (20%*40%=8%), item Z: 0.92 à 1.0 (idem que pour Y)
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

  5. #5
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 361
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 361
    Points : 20 379
    Points
    20 379
    Par défaut
    Citation Envoyé par Aspic Voir le message
    Chaque objet destructeur à une certaine probabilité de laisser derrière lui un item (coeur, potion, rubis...). Mais chaque item a aussi une probabilité d'apparaitre différente :
    justement si tu parles de probas et que tu souhaites te casser la tête tu peux regarder des algorithmes à base d'arrangements mathématiques , permutations.
    Si tu as fait terminale scientifique tu te souviendras très certainement des exercices ou on place ou non des boules dans un jeu et que l'on souhaite connaitre la probabilité pour qu'une boule soit tirée ou non
    http://fr.wikipedia.org/wiki/Arrangement

    après pour gérer cela une structure en arborescence fera l'affaire

  6. #6
    Expert confirmé
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Points : 4 388
    Points
    4 388
    Par défaut
    Citation Envoyé par plegat Voir le message
    Un peu plus...

    Ce que je ferai... pour chaque objet, tu définis un seuil à partir duquel on laisse un item. Et pour chaque item, tu définis un seuil.

    Exemple:

    Objet A, seuil 0.6, item X: 0 à 0.6, item Y: 0.6 à 0.8, item Z: 0.8 à 1.0

    En traduisant, tu tires deux rand, un qui sera à comparer au seuil, le second qui déterminera quel item apparait.
    Si le premier rand est inférieur au seuil (donc 0.6), l'item apparait. Par exemple si le second rand a donné 0.68, ça donnera un item Y. Si il avait donné 0.89, ça aurait donné un item Z.

    Et tu modules en fonction de tes différents objets. Par exemple:
    Objet B, seuil 0.4, item X: 0 à 0.35, item Y: 0.35 à 0.4, item Z: 0.4 à 1.0

    Plus sioux, si tu ne veux tirer qu'un seul rand, tu définis un item "fantome" qui va consommer une partie des probabilités, exemple:

    Objet A, item "fantome" (ou "pas d'item"): 0 à 0.6, item X: 0.6 à 0.7, item Y: 0.7 à 0.8, item Z: 0.8 à 1.0

    C'est un peu moins direct sous cette forme pour voir quelle est la probabilité d'un vrai item par rapport à un autre, mais ça économise un rand. Là, tu vois que les item X, Y et Z sont tous sur une plage de 0.1, ils ont tous la même probabilité d'apparaitre... si un item apparait!

    Avec l'objet A du début, on avait 60% pour l'item X, 20% pour le Y et 20% pour le Z, ce qui se traduirait avec la version uni-rand:
    Objet A, item "fantome" (ou "pas d'item"): 0 à 0.6 (=seuil à 60%), item X: 0.6 à 0.84 (60% des 40% restants, ça fait 24% du total), item Y: 0.84 à 0.92 (20%*40%=8%), item Z: 0.92 à 1.0 (idem que pour Y)
    Ca me semble une solution très intéressante sans trop se faire chier avec des calculs de probabilités !

    Je vais tester
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

  7. #7
    Expert éminent

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 813
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Fabricant et casseur d'avions
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 813
    Points : 7 638
    Points
    7 638
    Par défaut
    Citation Envoyé par Aspic Voir le message
    Ca me semble une solution très intéressante sans trop se faire chier avec des calculs de probabilités !
    ça reste des probabilités, mais hyper simplifiées.

    Avec cette méthode, tu peux en plus moduler les différents seuils en cours de route.

    Par exemple si ton perso chope une potion magique qui lui file 200% de chance en plus, tu passes tous les seuils de tes objets à 100% (ou tous les max des items "fantômes" à 0). Si il se chope une potion magique de poisse, tu les passes tous à 0% et hop, plus d'items!

    En gros, c'est modulable à souhait, mais de manière très très simple. Il faut juste prévoir comment ça doit évoluer avec les règles du jeu pour l'intégrer dans ton code.
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 30
    Points : 11
    Points
    11
    Par défaut
    Pour mon jeu en C, j'utilise un rand.
    Pour garder un certain équilibre, j'ai 34% de chance de rien avoir, 33% d'avoir un combat et 33% d'avoir un effet positif. Comment je fait ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    srand(time(NULL));
    rate = (rand () % (100 -1 +1)) + 1;
    if (rate <= 34 )
        //rien
    else if (rate <= /*34+33*/ 67)
       //effet positif
    else 
      //effet negatif
    Mais attention, ce n'est pas vraiment de l'aléatoire. Il me semble que si on fait un millier de rand, on obtient une courbe de gauss et donc les effet positif serait ici favoriser.
    En C++, je ne m'en rappelle plus je dois bien l'avouer mais il me semble que c'est pareil...

  9. #9
    Membre chevronné Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 043
    Points : 2 234
    Points
    2 234
    Par défaut
    @Foelthanos :
    Pourquoi faire ça? O_o
    Homer J. Simpson


  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 30
    Points : 11
    Points
    11
    Par défaut
    Il y a 2 manière pour l'alea mais je me rappelle que du (MAX - MIN +1)- MIN
    Ici, MAX = 100 et MIN =1. L'autre m'en rappelle plus.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 20/04/2011, 13h52
  2. Réponses: 8
    Dernier message: 05/07/2010, 19h59
  3. [z/OS] Générateur aléatoire sous Cobol
    Par vivia363 dans le forum Cobol
    Réponses: 1
    Dernier message: 25/07/2007, 21h23
  4. Creation aléatoire d'objets
    Par belzeluc dans le forum C++
    Réponses: 1
    Dernier message: 25/04/2006, 22h45

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