Simulation de coffre jeux de role

Fermé
polskleforgeron Messages postés 2 Date d'inscription lundi 24 juin 2013 Statut Membre Dernière intervention 24 juin 2013 - 24 juin 2013 à 15:07
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 - 25 juin 2013 à 08:22
Bonjour,
Je suis en train d'écrire un petit programme tout con (j'ai juste des notions vraiment basique de c++ glanées sur le site du zéro) qui simule l'ouverture d'un coffre pour un jeu de rôle que j'ai créé. Le problème c'est que j'ai été obligé de faire ça "à la bourrin". Je m'explique :

L'utilisateur (le maitre du jeu) doit entrer le grade du coffre (sorte de niveau qui détermine le nombre et la rareté des objets à l'intérieur). Ensuite le programme génère autant de nombres aléatoires entre 1 et 100 qu'il y a d'objet dans le coffre. J'ai ensuite mis plusieur "if" à la suite. Du type :

if (nombrealéatoie1 compris entre telle et telle bornes)
{cout << "objet correspondant à la plage entre telle et telle bornes" << endl;
if (nombrealéatoie2 compris entre telle et telle bornes)
{cout << "objet correspondant à la plage entre telle et telle bornes" << endl;
etc...

Cette technique bête et méchante fonctionne car elle me permet de donner un pourcentage de chance de tomber sur l'objet X mais vous vous doutez bien que si on veut faire 5 grades de coffres contenant jusqu'à 10 objets l'écriture du programme deviens vite loooongue. Le truc que j'aimerais faire c'est être capable de faire une boucle for qui génère un nombre aléatoire puis l'associe à l'objet correspondant (au sens jeu de rôle pas au sens programmation) puis "sort" cette objet de la boucle for a chaque fois. En effet lors de mon premier essai avec une boucle for, le programme "oubliait" l'objet à chaque retour de la boucle et ne me sortait que le dernier.

Je pense avoir lu quelque chose a propos du passage par valeur ou par référence qui pourrait m'aider mais je vous avoue que je bloque un peu.

Autre chose moins importante mais qui me ferait bien kiffer c'est d'ajouter, une fois que l'utilisateur à entré le grade du coffre, un bruitage style "grincement de coffre qui s'ouvre".

Je travail avec Codeblock.

Merci de m'avoir lu jusque là !

A voir également:

3 réponses

Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
24 juin 2013 à 15:42
Salut.
Sympa ton projet.
Tu demandes une réponse très concrete, mais tu donnes extremement peu d'élément concret, très peu de code source.

La première chose à savoir, c'est comment tu gère ta liste d'objet (ou on va dire trésor pour ne pas confondre avec objet C++) ? Il te faut une espèce de base de données des trésors.
J'avoue avoir un peu de mal à comprendre ce qu'il se passe exactement;

Sinon, pour le son, si c'est un programme console : oublie. Si tu utilises SDL ou Qt ça devrait être faisable facilement.
0
polskleforgeron Messages postés 2 Date d'inscription lundi 24 juin 2013 Statut Membre Dernière intervention 24 juin 2013
24 juin 2013 à 18:10
Le son c'est un bonus mais si c'est galère tant pis. Mes trésors ont différentes probabilités de sortir. Les potions et trucs de base en ayant une plus faible que les trésors plus utile ! Prenons un exemple :

Je veux que ça soit rare de trouver une épée magique. Par exemple 2% de chance. Je vais dire à l'ordinateur de tirer un nombre au hasard entre 1 et 100 et je lui dis que si ce nombre est compris entre 0 et 3 exclus il affiche à l'écran "épée magique". Si ce nombre est compris entre 2 et 21 exclus l'ordinateur affiche "rien" etc. Ça me permet donc de donner un certain nombre de chances sur 100 d'obtenir un objet ou rien dans un coffre. Pour représenter un plus gros coffre je tire plus de nombres aléatoires à la base. Pour l'instant je n'ai fait que les coffres de grade 1 (3 slots d'objet). Bien sur cette technique m'oblige à régler "manuellement" les chances de donner un objet pour chaque slot du coffre. J'avais penser à faire un tableau mais la complexité du code nécessaire m'a fait changé d'avis (plus tard peut être, j'ai beaucoup de petit programmes comme ça à faire pour ce jeu, histoire de faciliter le jeu en supprimant les jets de dés répétitifs et chiants).

Voici le code (oui il y a beaucoup de bibliothèque mais j'ai essayer des trucs ^^ et du coups j'ai peur qu'en les enlevant ça bug..) :

#include <iostream>
#include <cstdlib>
#include <ctime>
#include <cstdio>
#include <unistd.h>
#include <conio.h>
#include <dos.h>
#include <windows.h>
#include <Mmsystem.h>
using namespace std;

int main()
{
    int fin(3);
    do {
        cout << "Veuillez entrer le grade du coffre." << endl;
        int grade(0);
        cin >> grade;

            if (grade == 1)
            {
            srand(time(NULL));
            int x=0;
            int A;
            int B;
            int C;
            A = (x + 1)*rand()%100;
            B = (x + 1)*rand()%100;
            C = (x + 1)*rand()%100;
            if (A<=20)
            {
            cout << "Rien " << endl;
            }
            if (A>20 && A<=40)
            {
            cout << "Potion " << endl;
            }
            if (A>40 && A<=80)
            {
            cout << "Charge toxine " << endl;

            }
            if (A>80 && A<=100)
            {
            cout << "Batterie " << endl;

            }
            if (B<=20)
            {
            cout << "Rien " << endl;
            }
            if (B>20 && B<=40)
            {
            cout << "Potion " << endl;
            }
            if (B>40 && B<=80)
            {
            cout << "Charge toxine " << endl;

            }
            if (B>80 && B<=90)
            {
            cout << "Panneau solaire " << endl;

            }
            if (B>90 && B<=100)
            {
            cout << "Arme de melee " << endl;

            }
            if (C<=20)
            {
            cout << "Rien " << endl;
            }
            if (C>20 && C<=40)
            {
            cout << "Habits " << endl;
            }
            if (C>40 && C<=80)
            {
            cout << "50 I$ "<< endl;

            }
            if (C>80 && C<=90)
            {
            cout << "Une lettre d'amour " << endl;

            }

            if (C>90 && C<=95)
            {
            cout << "100 I$ " << endl;

            }
            if (C>95 && C<=98)
            {
            cout << "500 I$ " << endl;

            }
            if (C>98 && C<=100)
            {
            cout << "x2 cartouche d'amelioration de competence de base. " << endl;

            }
            cout << "Tapes 1 pour sortir du programm, 0 pour ouvrir un autre coffre."<<endl;

            cin >> fin;

            }

    } while(fin!=1);

    return 0;
}
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
25 juin 2013 à 08:22
Salut.
Tu ne souhaite rien d'autre qu'un affichage écran si je comprend bien.
D'une manière ou d'une autre il faudra que tu rentres les liens probabilités <-> trésor.
Si je comprend bien, pour un coffre de grade 1, tu as 3 tirages au sort parmis 3 lots de trésors. un coffre de grade2 plus de 3 tirage au sort, mais conserve ton les même lots ?

Ce que je ferai : je créerai une classe "Lot" qui contiendrai les objets et leur probabilité, ainsi qu'une méthode d'affichage. ça simplifierai nettement la lisibilité du code.
class Tresor
{
      std::string def;
      int proba;// nombre entre 0 et 100
      Tresor (std::string definition,int p):def(definition),proba(p){}
}
class Lot
{
    std::vector<Tresor> tresors;
    void choix(int alea)// affiche le tresor selon le nombre alea fourni entre 0 et 100
     {
          int sum=0;
          for(int n=0;n<tresors.size();++n)
          {
               if(alea <sum+tresors[n].proba)
               {
                     cout<<tresors[n].def;
                     break;//le bon tresor est trouvé : on sort
                }
                else
                     sum+=tresors[n].proba;
           }
      }
      void ajout_tresor(Tresor&);
      bool verif_som_proba{
          int sum=0;
          for(int n=0;n<tresors.size();++n)
                sum+=tresors[n].proba;
          return sum==100;
       }
}
0