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

C# Discussion :

Utiliser un random d'une List [Débutant]


Sujet :

C#

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2021
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2021
    Messages : 8
    Points : 8
    Points
    8
    Par défaut Utiliser un random d'une List
    Bonjour, j'ai un petit programme qui simule des combats façon JDR et qui marche bien. Pour progresser, je souhaite le modifier avec un peu d'aléatoire dans les combats au lieu d'affronter un monstre prédéfini.

    J'ai donc une liste de créatures dont je peux récupérer sans soucis les infos avec un console.writeline mais par contre, quand je veux lui associer certaines méthodes, j'ai des soucis d'accessibilité. J'ai tenté de modifier les conditions d'accès mais sans succès. Merci par avance pour les pistes.

    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    using System;
    using System.Collections.Generic;
    using System.Linq;
     
    namespace Test_aleatoire
    {
        public class Entite
        {
            protected string nom;
            protected bool estMort = false;
            protected int pointsDeVie;
            protected int degatsMin;
            protected int degatsMax;
            protected Random random = new Random();
     
            public Entite(string nom)
            {
                this.nom = nom;
            }
     
            public void Attaquer(Entite uneEntite)
            {
                int degats = random.Next(degatsMin, degatsMax);
                uneEntite.PerdrePointsDeVie(degats);
     
                Console.WriteLine(this.nom + "(" + this.pointsDeVie + ")" + " attaque: " + uneEntite.nom);
                Console.WriteLine(uneEntite.nom + " a perdu " + degats + " points de vie");
                Console.WriteLine("Il reste " + uneEntite.pointsDeVie + " point de vie à " + uneEntite.nom);
                if (uneEntite.estMort)
                {
                    Console.WriteLine(uneEntite.nom + " est mort !");
                    pointsDeVie += 15;
                }
            }
     
            protected void PerdrePointsDeVie(int pointsDeVie)
            {
                this.pointsDeVie -= pointsDeVie;
                if (this.pointsDeVie <= 0)
                {
                    this.pointsDeVie = 0;
                    estMort = true;
                }
            }
            public bool EstMort()
            {
                return this.estMort;
            }
        }
        public class Monstre
        {
            string nom;
            string pointsDeVie;
            string degatsMin;
            string degatsMax;
            public Monstre(string nom, string pointsDeVie, string degatsMin, string degatsMax)
            {
                this.nom = nom;
                this.pointsDeVie = pointsDeVie;
                this.degatsMin = degatsMin;
                this.degatsMax = degatsMax;
            }
            public string Nom { get => nom; set => nom = value; }
            public string PointsDeVie { get => pointsDeVie; set => pointsDeVie = value; }
            public string DegatsMin { get => degatsMin; set => degatsMin = value; }
            public string DegatsMax { get => degatsMax; set => degatsMax = value; }
     
            public override string ToString()
            {
                return "Nom: " + nom + "   Points de Vie: " + pointsDeVie + "  Degats Min: " + degatsMin + "  Degats Max:  " + degatsMax;
            }
        }
        public abstract class Personnage : Entite
        {
            private int niveau;
            private int experience;
     
            public Personnage(string nom) : base(nom)
            {
                this.nom = nom;
                niveau = 1;
                experience = 0;
            }
     
            public void GagnerExperience(int experience)
            {
                this.experience += experience;
                while (this.experience >= ExperienceRequise())
                {
                    niveau += 1;
                    Console.ForegroundColor = ConsoleColor.Yellow;
                    Console.WriteLine("Bravo : Vous avez atteint le niveau " + niveau + " !");
     
                    pointsDeVie += 100;
                    degatsMin += 25;
                    degatsMax += 35;
                }
            }
     
            public double ExperienceRequise()
            {
                return Math.Round(4 * (Math.Pow(niveau, 3) / 5));
            }
     
            public string Caracteristiques()
            {
                return this.nom + "\n" + "Niveau: " + niveau + "\n" + "Points d'expérience: (" + experience + "/" + ExperienceRequise() + "\n" + "Dégats: [" + degatsMin + ";" + degatsMax + "]" + "\n" + "Points de vie: " + pointsDeVie;
            }
        }
        class Program
        {       
            static void Main(string[] args)
            {
                Menu();
            }        
            static void Jouer(Personnage monPerso)
            {
     
                List<Monstre> monstre = new List<Monstre>();
     
                monstre.Add(new Monstre("Ours", "70", "15", "20"));
                monstre.Add(new Monstre("Loup", "50", "10", "15"));
                monstre.Add(new Monstre("Lynx", "60", "20", "25"));
                monstre.Add(new Monstre("Castor mutant", "80", "30", "35"));
                monstre.Add(new Monstre("Ecureuil ninja", "100", "25", "30"));
     
                var random = new Random();
                int monstreAlea = random.Next(monstre.Count);
                //Console.WriteLine(monstre[monstreAlea]);
                Monstre creature = (monstre[monstreAlea]);
                Console.WriteLine(creature);
     
                bool victoire = true;
                bool suivant = false;
     
                while (!creature.EstMort())
                {
                    //tour du monstre
                    Console.ForegroundColor = ConsoleColor.Red;
                    monPerso.Attaquer(creature);
                    Console.WriteLine();
                    Console.ReadKey(true);
     
                    if (monPerso.EstMort())
                    {
                        victoire = false;
                        break;
                    }
                    //tour du personnage
                    if (!creature.EstMort())
                    {
                        Console.ForegroundColor = ConsoleColor.Green;
                        creature.Attaquer(monPerso);
                        Console.WriteLine();
                        Console.ReadKey(true);
                    }
                }
                if (victoire)
                {
                    monPerso.GagnerExperience(5);
     
                    Console.ForegroundColor = ConsoleColor.White;
                    Console.WriteLine();
                    Console.WriteLine(monPerso.Caracteristiques());
     
                    Console.ForegroundColor = ConsoleColor.Yellow;
                    Console.WriteLine();
     
                    while (!suivant)
                    {
                        Console.WriteLine("Combat suivant ? (O/N");
                        string saisie = Console.ReadLine().ToUpper();
                        if (saisie == "O")
                        {
                            suivant = true;
                            Jouer(monPerso);
                        }
                        else if (saisie == "N")
                        {
                            Environment.Exit(0);
                        }
                    }
                }
                else
                {
                    Console.ForegroundColor = ConsoleColor.DarkRed;
                    Console.WriteLine();
                    Console.WriteLine("C'est perdu !!!");
                    Console.ReadKey();
                }
            }
            static void Menu()
            {
                Console.ForegroundColor = ConsoleColor.White;
                Console.WriteLine("Le jeu");
                Console.WriteLine();
                Console.WriteLine("Choisis ta classe: ");
                Console.WriteLine("1: Guerrier");
                Console.WriteLine("2: Archer");
                Console.WriteLine("3: Voleur");
                Console.WriteLine("4: Quitter");
                Console.WriteLine();
     
                switch (Console.ReadLine())
                {
                    case "1":
                        Console.WriteLine("Vous avez choisis Guerrier !");
                        Console.WriteLine();
                        Jouer(new Guerrier("OlafMegabaff"));
                        break;
                    case "2":
                        Console.WriteLine("Vous avez choisis Archer !");
                        Console.WriteLine();
                        Jouer(new Archer("Legolas"));
                        break;
                    case "3":
                        Console.WriteLine("Vous avez choisis Voleur !");
                        Console.WriteLine();
                        Jouer(new Voleur("Renshaw"));
                        break;
                    case "4":
                        break;
                }
            }
        }
    }

  2. #2
    Membre chevronné
    Avatar de PixelJuice
    Homme Profil pro
    Ingénieur .NET & Game Designer
    Inscrit en
    Janvier 2014
    Messages
    640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur .NET & Game Designer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2014
    Messages : 640
    Points : 2 149
    Points
    2 149
    Par défaut
    Bonjour,

    En effet c'est pas le top que chaque entité possède une instance de Random.

    • Tu peux déclarer une seule et unique instance en static, un peu comme un Singleton. Tu pourrais y accéder partout dans ton code.
    • Tu peux aussi centraliser tout ce qui est aléatoire dans une seule et même classe et y mettre l'instance dedans.


    Repère les endroits ou tu en auras besoin et comme ça tu pourrais voir quelle solution te convient.


    D'ailleurs si tu choisis la 2 ième solution, tu pourrais aussi dépouiller un peu ta méthode Jouer qui s'occupe de pas mal de truc dont elle ne devrait pas. Pourquoi pas une classe MaitreDuJeu ou quelque chose dans ce genre ?

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2021
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2021
    Messages : 8
    Points : 8
    Points
    8
    Par défaut
    Salut et merci pour ta réponse. Entre temps, j'avais continué à creuser le sujet et j'ai fait quelques modifications sur le code et je n'avais plus d'erreur de compilation mais je pouvais bien afficher le choix aléatoire de mon monstre mais quand je lançais le combat, c'était vide. Toujours je suppose mon souci d'accessibilité par rapport à ma liste qui n'est pas instancié ?

    Nom : Sans titre-1.png
Affichages : 98
Taille : 64,0 Ko

    Par contre, pour développer ta soluce, j'ai testé en mettant ma liste dans ma classe monstre, sans succès non plus, ca me retourne un résultat vide.

    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
    38
    public class Monstre
            {
                public string nom;
                public string pv;
                public string degatsMin;
                public string degatsMax;
                public bool estMort;
     
                public Monstre(string nom, string pv, string degatsMin, string degatsMax)
                {
                    this.nom = nom;
                    this.pv = pv;
                    this.degatsMin = degatsMin;
                    this.degatsMax = degatsMax;
     
                    List<Monstre> monstres = new List<Monstre>();
                    monstres.Add(new Monstre("Lynx", "50", "15", "20"));
                    monstres.Add(new Monstre("Ours", "80", "20", "25"));
                    monstres.Add(new Monstre("Loup", "40", "10", "15"));
                    monstres.Add(new Monstre("Castor Ninja", "70", "10", "20"));
                    monstres.Add(new Monstre("Ecureuil mutant", "80", "25", "30"));
     
                    var random = new Random();
                    int monstreAlea = random.Next(monstres.Count);
                    Monstre monstre = (monstres[monstreAlea]);
                    Console.WriteLine("Le monstre à combattre est :" + monstre);
                }
     
                public bool EstMort()
                {
                    return this.estMort;
                }
     
                public override string ToString()
                {
                    return "Nom: " + nom + " PV: " + pv + " Dégats Min: " + degatsMin + " Dégats Max: " + degatsMax;
                }
            }
    PS: l'image de gauche correspond à la version sans Random List pour le monstre, j'ai directement instancié une classe Monstre avec les paramètres par défaut tandis que l'image de droite correspond a celle avec les codes présentés.

  4. #4
    Membre chevronné
    Avatar de PixelJuice
    Homme Profil pro
    Ingénieur .NET & Game Designer
    Inscrit en
    Janvier 2014
    Messages
    640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur .NET & Game Designer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2014
    Messages : 640
    Points : 2 149
    Points
    2 149
    Par défaut
    Bonsoir,

    Désolé pour la réponse un peu tardive.

    Je ne sais pas pour ton problème de liste, il faudrait peut-être le nouveau code. Par contre le code que tu as posté ne peut pas marcher. A mon avis si tu n'as pas d'erreur c'est qu'il n'est jamais appelé car tu fais une boucle infinie.

    Le constructeur de Monstre s'appelle lui-même.

    De plus, c'est pas du tout la bonne place, je t'avais suggérer une classe MaitreDuJeu qui regrouperait tout ce qui est création de monstre et / ou aléatoire.

    Même si ton code marchait, tu aurais autant de fois la liste des monstres par monstre. La classe Monstre ne doit servir qu'à représenter un monstre et c'est tout.

    Je t'ai bricolé un truc qui pourrait te montrer un début d'architecture, en reprenant un peu déjà tout ce que tu avais posté tout en essayant de régler ton problème

    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
    public class Entite
        {
            public string nom;
            public int pv;
            public int pvMax;
            public int degatsMin;
            public int degatsMax;
     
            public Entite(string nom, int pv, int degatsMin, int degatsMax)
            {
                this.nom = nom;
                this.pv = pvMax = pv;
                this.degatsMin = degatsMin;
                this.degatsMax = degatsMax;
            }
     
            public void ModifierPv(int montant)
            {
                pv += montant; // Cette méthode permet de soigner autant que de blesser une entité, mais tu peux très bien te contenter d'une méthode qui ne fait qu'appliquer des dégâts
            }
     
            public void Reset()
            {
                pv = pvMax;
            }
     
            public override string ToString()
            {
                return "Nom: " + nom + " PV: " + pv + " Dégats Min: " + degatsMin + " Dégats Max: " + degatsMax;
            }
     
            public bool EstMort
            {
                get { return pv <= 0; } // Cette propriété permet de supprimer la variable "estMort" qui est superflu.
            }
        }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
        public class Monstre : Entite
        {
            public Monstre(string nom, int pv, int degatsMin, int degatsMax) : base(nom, pv, degatsMax, degatsMax)
            {
                // Classe  vide mais je la laisse car j'imagine qu'après tu fera le distinguo entre une entité et un monstre
            }
        }
    Et enfin la classe qui nous intéresse

    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
    38
    39
    40
    public class MaitreDuJeu
        {
            Random random;
            List<Monstre> monstres;
     
            public MaitreDuJeu()
            {
                random = new Random();
                monstres = new List<Monstre>();
     
                monstres.Add(new Monstre("Lynx", 50, 15, 20));
                monstres.Add(new Monstre("Ours", 80, 20, 25));
                monstres.Add(new Monstre("Loup", 40, 10, 15));
                monstres.Add(new Monstre("Castor Ninja", 70, 10, 20));
                monstres.Add(new Monstre("Ecureuil mutant", 80, 25, 30));
            }
     
            public Monstre MonstreAléatoire()
            {
                var rng = random.Next(monstres.Count - 1);
     
                var monstre = monstres[rng];
     
                monstre.Reset(); // On le reset avant
     
                return monstre;
            }
     
            public void Combat(Entite attaquant, Entite cible)
            {
                int degats = random.Next(attaquant.degatsMin, attaquant.degatsMax);
     
                cible.ModifierPv(-degats);
     
                if (cible.EstMort)
                {
                    attaquant.ModifierPv(15);
                }
            }
        }
    • La classe Entité est plus simple et plus complète
    • La classe MaitreDuJeu s'occupe maintenant de tout ce qui est "gameplay"
    • J'ai enlevé les textes pour plus de clarté mais maintenant ils seront quasi tous dans MaitreDuJeu


    Je t'ai mis une méthode Reset car tu vas faire face à un petit problème, si tu tombes sur un même monstre, il sera déjà mort. Cette méthode permet donc de le remettre à zéro comme si il venait d'être crée.

    Il y a plein de façons de régler ce soucis, ma méthode pour réinitialiser le monstre en est une, il y a celle qui consisterait à cloner le monstre, a en créer un nouveau à chaque fois, etc ... Bref il y en a pas mal.




    Pour finir, il te suffit juste de créer une instance de MaitreDuJeu qui s'occupera de tout ça.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
            static public void Jouer(Personnage perso)
            {
                MaitreDuJeu mj = new MaitreDuJeu();
     
                var monstre = mj.MonstreAléatoire();
     
                mj.Combat(perso, monstre);
     
                // Etc ...
            }
    En fait la clé dans tout ça c'est que chaque classe s'occupe de ses affaires et c'est tout.

    Voilà, n'hésite pas a dire si tu n'as pas compris un des points et normalement ça réglera ton problème de liste, random, et quelques autres soucis.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2021
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2021
    Messages : 8
    Points : 8
    Points
    8
    Par défaut
    Salut et merci pour ton aide Je regarde tout ca en détail, je fais mes essais et je reviens dans la journée.

    Edit : 10h25

    Un gigantesque MERCI !! Cela marche nickel, j'ai pris la base de ta démo que j'ai adapté sur mes spécificités. Je peux donc choisir un type de héros différents pour le départ et affronter aléatoirement un monstre parmi la liste.
    Ainsi, ca me donne en architecture :

    Entite => Personnage =>Guerrier/Voleur/Archer
    => Monstre
    MaitreDeJeu qui gère les méthodes Menu() et Jouer()

    Maintenant, j'ai plus qu'a continuer à développer et complexifier la chose.
    Encore merci

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

Discussions similaires

  1. [WSS3] utiliser la valeur d'une liste dans une autre
    Par chatroux dans le forum SharePoint
    Réponses: 2
    Dernier message: 21/10/2008, 13h51
  2. RANDOM sur une liste d'entiers ?
    Par simodsio dans le forum C
    Réponses: 2
    Dernier message: 18/09/2008, 12h15
  3. Random dans une liste de bigDecimal
    Par coquero dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 24/06/2008, 17h03
  4. Utiliser la valeur d'une liste comme paramètre
    Par eudeline91 dans le forum IHM
    Réponses: 0
    Dernier message: 10/06/2008, 11h03
  5. Utilisation de random avec une liste
    Par husobom dans le forum Prolog
    Réponses: 4
    Dernier message: 24/11/2007, 23h43

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