Tirer des nombres au hasard sans répétition


#1

Bonjour,
Je débute sous GDevelop et je cherche comment m’y prendre.

J’ai 8 instances d’un objet avec une variable d’objet définie qui correspond au n° d’animation que je vais afficher. Par défaut, elle est à -1.
Dans cet objet j’ai 13 animations qui vont de 0 à 12.
Je voudrai que chaque instance affiche une animation différente, au hasard parmi ces 13.

J’arrive à afficher une animation au hasard, mais il peut y avoir des doublons.

Voilà comment je fais:
J’initialise une variable de scène appelée Index à 0, puis


J’ai juste laissé pour exemple une condition sous “If one of this conditions is true” parce que sinon le jeu ne se lance pas, mais dans mon idée je compare la valeur de la variable d’instance (NumAnimation) avec les 8 valeurs de la variable de scène Peluche.

Dans le debugger, j’obtiens des valeurs correctes pour la variable de scène Peluche, du genre:
“Peluche”: {
“0”:“8”
“1”:“7”
“2”:“4”

“7”:“7”
}

Mais toujours dans le debugger, je vois qu’aucune des variables d’instance n’est modifiée. Pour chaque instance, NumAnimation vaut -1.

J’ai bien essayé de changer l’instruction d’affectation de valeur pour NumAnimation en mettant ce qui marche pour SetAnimation, à savoir: VariableString(Peluche[VariableString(Index)]) , mais une erreur est détectée dans l’éditeur qui passe en rouge.

Est-ce que cette logique est bonne pour obtenir ce que je souhaite ?
Comment faire pour obtenir un résultat correct ?

Merci.


#2

Juste une chose avant d’aller plus loin dans la résolution de ton problème : comment as-tu nommé chacune des (13) animations de ton objet “Peluche” ?
Normalement, cela devrait être ainsi :slight_smile:
0
1

12


#3

Merci Amigo54,
Je viens d’y arriver à l’instant. Je me suis beaucoup aidé du jeu de Memory présenté par Loopingstar sur le forum.
J’ai effectivement nommé mes animations Peluche:
“01”
“02”
“03”

“13”
J’ai créé une variable de scène:
PelucheChaine=“01|02|03|04|05|06|07|08|09|10|11|12|13|”
en ouverture de scène.
Puis j’ai fait ça:


En gros, je tire au hasard un nombre avec une limite supérieure du random de plus en plus petite, je vais lire dans ma chaîne le nom de l’animation correspondante, et je retire ce nom de ma chaîne.
Je m’en sors cette fois-ci, mais nul doute que j’aurais besoin de vous tous très bientôt.
Déjà je ne comprends pas comment on met les gros commentaires bleus sur les Events, je n’ai trouvé que les commentaires jaunes.
Un grand merci.


#4

Pour moi, tes animations devraient être dénommées non comme 01 02 … 09
mais comme ceci :
0
1
2
3
4
5
6
7
8
9
10
11
12

Et en bleu, ce ne sont pas des commentaires (eux sont en jaune) mais des groupes d’événements !
C’est une manière de regrouper logiquement des événements (cela facilite la lecture des évents de ton jeu mais aussi son débogage)
Pour créer un groupe d’événements, tu cliques sur image
puis sur Group" (pour la version anglicisée bien sûr)

Il y aussi l’autre façon de créer un groupe en faisant 1 clic droit sur 1 événement puis choisir “Add other” puis enfin “Group”


#5

1000 Gracias Amigo54.
J’ai expérimenté les groupes d’évènements. Ça structure la lecture effectivement, mais pourquoi dis-tu que ça facilite le débogage ?
En utilisant ces groupes, j’ai trouvé aussi Toogle disabled, qui désactive des lignes d’évènements si j’ai bien compris. Je pense que j’aurais pu l’utiliser pour “gommer” mes conditions qui ne marchaient pas plutôt que de les supprimer, c’est l’équivalent d’un rem ?
Sinon, ça m’intéresse de repartir sur la version initiale de ma scène pour comprendre ce qui échoue. J’ai bien nommé dans cette configuration les animations comme tu l’as dit: 0, 1, 2, etc… (je suppose que c’est pour qu’on puisse les cibler avec le résultat d’un calcul ?).
J’ai un peu mieux compris les erreurs détectées par l’éditeur pour la variable d’instance NumAnimation: j’essayais de changer sa valeur avec VariableString(Peluche[VariableString(Index)]), alors qu’il fallait changer son texte dans ce cas là pour que ça ne passe pas en rouge. Ça, c’est acquis.
Mais que je change la valeur ou le texte dans cette variable, c’est toujours la valeur initiale (-1) qui est affichée dans le débogueur pour chaque instance.:slightly_frowning_face:


#6

Et bien, c’est assez simple : quand tu regroupes logiquement tes conditions et actions dans un groupe d’évènements dédiés à 1 ou quelques tâches bien précises, si ton jeu ne marche pas comme tu le veux, tu sais où regarder (le groupe d’évènements dédiés) où cela a 1 grande chance de coincer.
En plus, comme tu l’as remarqué, les groupes d’évènements permettent aussi une lecture plus aisée des conditions et actions.

Voilà à quoi ressemble mon ancien jeu “Paper Plane” en utilisant des groupes d’évènements.


Tu t’imagines les longs pavés de conditions et d’actions si je n’avais pas structuré mon jeu avec ces groupes.
On peut avec GD aller encore plus loin en utilisant des évènements externes qui en programmation classique, se rapproche un peu de la notion de sous-programmes


#7

Effectivement, c’est beaucoup plus clair.:ok_hand:

C’est sympa de passer du temps à m’expliquer tout ça !


#8

De rien !
Je ne fais volontairement que de petits jeux car je ne veux pas passer trop de temps à faire des jeux. J’utilise très peu (pour le moment) le débogueur de GD sauf si je ne parviens pas à m’en sortir (souvent des problèmes de variables d’ailleurs)