[DB-RS] Supprimer un chiffre déjà généré par un random

Pour les scripts écrits en C#
Règles du forum
Merci de respecter la NOMENCLATURE suivante pour vos TITRES de messages :

Commencez par le niveau de vos scripts
DB = Débutant
MY = Moyen
CF = Confirmé

Puis le domaine d'application
-RS = Réseau
-AL = Algorithmie

Exemple :

[DB-RS] Mouvement perso multijoueur
laurent3dblend
Messages : 4
Inscription : 22 Jan 2017 23:37

[DB-RS] Supprimer un chiffre déjà généré par un random

Message par laurent3dblend » 22 Nov 2017 15:33

Bonjour à tous, je travail ces derniers temps sur un projet de jeux-vidéo, et comme tout projet n'est pas sans quelques difficultés, j'ai aujourd'hui besoin de votre aide. En fait, dans mon jeu (une sorte de quiz), les niveaux sont générés aléatoirement. Mais le problème est le suivant: Dans mon jeu, une fois le niveau passé, on ne doit plus pouvoir revenir dessus, et avec ce système de "random", on peut très bien retomber sur un niveau déjà généré. Je vous montre la ligne de mon script qui génère un niveau aléatoirement.

SceneManager.LoadScene("Level" + Random.Range(1, 20));

Et là où j'aurai besoin de votre aide, c'est pour faire en sorte qu'une fois un numéro généré, ce dernier ne puisse plus l'être de nouveau. J'espère avoir été le plus clair possible aha. Merci d'avance pour vos éventuelles réponses.

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6220
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: [DB-RS] Supprimer un chiffre déjà généré par un random

Message par boubouk50 » 22 Nov 2017 16:05

Au lieu d'aller chercher aléatoirement un nombre entre 0 et 20, va chercher aléatoirement dans une liste d'entiers à laquelle tu enlèveras au fur et à mesure le nombre trouvé.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

laurent3dblend
Messages : 4
Inscription : 22 Jan 2017 23:37

Re: [DB-RS] Supprimer un chiffre déjà généré par un random

Message par laurent3dblend » 22 Nov 2017 17:34

Sans vouloir beaucoup d'embêter, comme je l'ai indiqué dans l'en-tête du titre de mon post, je suis très novice dans la programmation. Est-ce que tu pourrai m'expliquer brièvement comment est-ce que je pourrai retirer les "entiers" dans une liste ?

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6220
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: [DB-RS] Supprimer un chiffre déjà généré par un random

Message par boubouk50 » 22 Nov 2017 17:57

La doc d'abord: https://msdn.microsoft.com/fr-fr/librar ... .110).aspx

Ensuite, soit tu crées au départ une liste déjà aléatoire de nombre compris entre 0 et 20 non répétitifs.
https://stackoverflow.com/questions/101 ... dom-number
https://stackoverflow.com/questions/962 ... 829#962829

Soit tu crées une liste triée de 0 à 20 puis tu vas piocher aléatoirement dedans et supprimer l'élément de la liste.
Il te faut donc choisir un nombre aléatoire entre 0 et list.Count, récupérer la valeur contenue à cet index (list [index]) puis le supprimer de cette liste (myList.RemoveAt (index)).
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Avatar de l’utilisateur
DevAmat
Messages : 435
Inscription : 23 Nov 2016 11:50

Re: [DB-RS] Supprimer un chiffre déjà généré par un random

Message par DevAmat » 23 Nov 2017 10:59

Salut,

Une manière simple pour un novice:

-En premier, tu détermines ton int (qui représente l'index aléatoire dans ton tableau)
int randIndex = UnityEngine.Random.Range(0, TONTABLEAU.Length - 1);
Le "-1" car on commence à parcourir les tableaux à partir de l'index 0 donc si ton TONTABLEAU.Length = 5 alors tes index vont de 0 à 4.

-Ensuite tu récupères ton élément (ton niveau si c'est un tableau de niveaux) donc TONELEMENT = TONTABLEAU[randIndex ];
TONELEMENT sera ton niveau a charger. Maintenant on va faire en sorte que l'on ne retombe pas dessus.
TONELEMENT est une copie de TONTABLEAU[randIndex ] donc tu va pouvoir supprimer TONTABLEAU[randIndex ].

-Donc tu vas remplacer TONTABLEAU[randIndex ] par le dernier élément de ta liste donc
TONTABLEAU[randIndex ] = TONTABLEAU[TONTABLEAU.Length - 1];

-La dernière étape, tu as juste à supprimer le dernier élément de ta liste que tu as dupliqué. Là c'est simple tu as juste à resize ton tableau. Tu lui enlèves une case.
Array.Resize(ref TONTABLEAU, TONTABLEAU.Length - 1);
Avec cette méthode il te supprime la dernière case.

Voilà je trouve cette méthode assez accessible et compréhensible pour un débutant (et tu peux la mettre dans une boucle assez facilement), j'espère avoir été clair.

Avatar de l’utilisateur
ZJP
Messages : 5748
Inscription : 15 Déc 2009 06:00

Re: [DB-RS] Supprimer un chiffre déjà généré par un random

Message par ZJP » 24 Nov 2017 18:27

Avec une variable nbLEVELdejaTROUVE qui s’incrémente à chaque tirage, plus besoin de "resize" du tableau.
Il suffit de "int randIndex = UnityEngine.Random.Range(0, TONTABLEAU.Length - nbLEVELdejaTROUVE );" .
En définitive, elle remplace tout les "-1" de ta (bonne) méthode. ;-)

Cette variable est de toute façon obligatoire pour indiquer le nombre de niveaux déjà chargés, quel que soit algorithme retenu. :mrgreen:

Répondre

Revenir vers « (C#) CSharp »