Random et suppression

Random et suppression

Vous avez envie de faire un quizz où les questions tombent aléatoirement ? Mais vous ne voulez pas qu'une question retombe deux fois de suite ? Alors ce tutoriel est pour vous.

Explications du fonctionnement

Si on schématise ce que devra faire le code, on va tomber sur quelque chose comme ça :

  • Choisir un élément au hasard,
  • Supprimer de la liste cet élément.

Pour ça il y a plusieurs méthodes, mais nous en utiliserons qu'une seule ici,qui est de loin la meilleure. Elle consiste à placer les éléments dans un tableau, choisir aléatoirement un des éléments du tableau, et enfin, supprimer celui-ci du tableau.

Application Action Script

Introduction

Avant de commencer, nous allons créer une scène d'exemple, afin d'être d'accord sur les noms que l'on va utiliser. On va donc créer 5 objets, contenant chacun une variable "Matiere" (je m'inspire de mes propres matières, je m'excuse d'avance pour ceux qui ont échoué en PCEM1).

Un petit rappel sur "Comment créer un objet". Il y a plusieurs méthodes. Soit vous préférez la méthode très propre (un peu trop à mon goût) qui consiste à créer l'objet, et ensuite à lui assigner des valeurs :

monObjet = new Object();
monObjet.Matiere = "Anatomie";

Soit vous préférez la méthode plus classique, plus adaptée à notre cas, qui consiste à créer l'objet directement avec les bonnes valeurs dedans :

monObjet = {Matiere:"Anatomie"};

Il faudra bien maîtriser la notation par accolade, qui n'est absolument pas difficile.

Sans plus attendre, voici donc nos 5 objets. Ce bout de code est à placer sur la première frame de notre animation, dans la fenêtre Action (F9) :

A1 = {Matiere:"Anatomie"};
B1 = {Matiere:"Biochimie"};
C1 = {Matiere:"Biohysique"};
D1 = {Matiere:"Biologie cellulaire"};
E1 = {Matiere:"Physique"};

J'ai choisit volontairement des noms de variable très différents pour vous montrer qu'ils importent peu pour faire ce que nous voulons faire.

Maintenant que nos objet sont tous créés, nous allons les mettre dans un tableau. Sur la ligne après la définition des objets, vous allez écrire ceci :

Tableau = [A1, B1, C1, D1, E1];

Encore ici, il existe d'autre méthode pour créer le tableau :

Tableau = new Array();
Tableau[0] = A1;
Tableau[1] = B1;
   ...
Tableau[4] = E1;

Ou encore :

Tableau = new Array (A1, B1, C1, D1, E1);

Développement

Voilà ! Les préparations sont faites, passons aux choses sérieuses.

Mais d'abord quelques rappels sur les tableaux. Si vous maîtrisez cette partie, sautez la :)

Un tableau fonctionne de la même façon que ceux qu'on dessine au CM2. Munissez vous d'un crayon et d'une feuille pour mieux comprendre (enfin,seulement si vous ne comprenez pas hein;)). Dessinez un tableau. Pas un tableau à double entrée (deux dimensions), mais un tableau simple. C'est à dire 2 colonnes et 5lignes. Dans la première colonne, sur la première ligne, mettez un 0, puis sur la deuxième ligne un 1, et ainsi de suite jusqu'à 4.
Sur la deuxième colonne, mettez le nom des objets que nous avons créé plus tôt. C'est à dire : A1, B1, C1, D1 et E1.

Voilà! Votre tableau est fait, et c'est EXACTEMENT à cela qu'il ressemble dans Flash. Ainsi, si vous voulez accéder au premier élément du tableau, il vous suffira de donner le chiffre de la première colonne, première ligne. Si vous voulez le dernier élément, prenez le chiffre de la première colonne, dernière ligne. C'est aussi simple que ça.

Cependant, l'AS ne s'écrit pas comme ça :
jeVeux (Numero:0 De:Tableau);

Il existe une notation propre aux tableaux que l'on nomme : notation par crochet (vous aurez compris qu'elle fera intervenir des crochets).
Ainsi, au lieu du code très malpropre que nous avions au dessus, nous allons écrire :

Tableau[0];

Ce qui est plus "propre", et plus "court" aussi ;).

Pour créer un tableau à plusieurs dimensions, par exemple 2 (deux entrées), il suffira de mettre un tableau dans un tableau. Ainsi, on pourra écrire:

Tableau[0][2];

qui nous donnera la valeur d'un tableau à deux entrés à la première ligne, deuxième colonne.

On peut continuer comme ça indéfiniment (dans les limites de la mémoire de votre ordinateur), et faire des tableaux à 3, 4, 5 voir même une dizaine de dimensions :

Tableau[0][1][4][3][2][7][2][1][2][2];

Mais si vous faites ceci, demandez vous d'abord s'il n'existe pas une meilleure méthode.

Vous savez tout sur les tableaux ? Parfait, continuons, sinon, revoyez la partie précédente, et référez vous à l'aide de Flash en cas de problèmes (ou tout simplement à votre réflexion).

Nous avons un tableau, et nous allons récupérer un de ses éléments de manière aléatoire :

Tableau[Math.round (Math.random() * (Tableau.length-1))];

Mais quelques explications s'imposent pour les plus débutant :

Premièrement le Math.round() permet d'arrondir le nombre aléatoire (en effet, choisir l'élément du tableau à la ligne un virgule cinq ne voudrait rien dire). Ensuite,la fonction Math.random() prend un nombre aléatoire entre zéro et un. Il faut donc multiplié ce résultat (pas encore arrondi) par la longueur du tableau (ici cinq). Mais auparavant, il faudra retrancher 1 à cette longueur, sinon on risque de demander le contenu de la sixième colonne (colonne qui n'existe pas). Et enfin, une fois fait, on arrondit, et on récupère ce qu'il faut.

Si vous ne comprenez pas exactement ces dernières phrases, relisez les, et faites des tests. C'est le seul moyen que vous avez de progresser.

On récupère une valeur au hasard du tableau, c'est parfait. Mais comment allons nous la supprimer cette valeur, si nous ne savons pas laquelle c'est ? Alors plutôt que de prendre un nombre aléatoire directement entre les crochets, nous allons définir une variable préalablement, et s'en servir deux fois :

var r = Math.round (Math.random() * (Tableau.length-1));

Le "var" permet une fois la boucle terminée (ou la frame passée) de supprimer automatiquement la variable (elle ne nous servira plus à rien ensuite, alors il faut éviter de saturer la mémoire de flash).

Nous allons créer une autre variable : "rec" qui servira à stocker la valeur du tableau choisit.

var rec = Tableau[r];

Et enfin, il ne reste plus qu'à supprimer du tableau, la valeur sélectionnée :

Tableau.splice (r, 1);

Avec splice(indice, nombre).

Et voilà ! Tout fonctionne. Il vous suffit ensuite d'afficher la valeur de "rec" dans la fenêtre de sortie :)

Mettre le tout sous la forme de fonction

C'est très intéressant ce petit bout de code une fois compris (je l'espère). Mais il est inutile servit comme ça.
Le mieux est de créer une fonction, qui sortira une valeur aléatoire d'un tableau, et qui supprimera celle-ci.

Vous connaissez les fonctions ? C'est pas très compliqué, nous n'allons pas aller bien loin ici. Une fonction se définit comme ceci :

function NomDeLaFonction (Paramètre1, Paramètre2, ...)
{
    // Code de la fonction
}

Ensuite, une fois la fonction définie, nous pourrons l'appeler autant de fois que désiré en la nommant, et en mettant entre parenthèses la valeur des paramètres (s'il n'y en a pas, ne rien mettre), exemple :

maFonction (1, 0);

La fonction va traiter les paramètres (ça peut être un clip, un tableau, un objet, une truite, ce que vous voulez!), et au final, agir avec une valeur retournée (vous n'êtes pas obligé de retourner une valeur cependant). Pour cela, il existe un petit outil : return.
Exemple :

function Tracer (str)
{
    return (str + " soleil");
}

trace (Tracer ("Coucou");

Ce bout de code retournera dans la fenêtre de sortie : "Coucou soleil".

Nous, ce n'est pas "Coucou soleil" que nous allons retourner, mais une valeur du tableau choisie. Et la fonction ne se contentera pas de choisir au hasard, elle supprimera l'élément du tableau au passage.

Donnez un nom à votre fonction, par exemple : randel (pour random et delete).
Il ne suffit pas de donner un nom, il faut aussi savoir ce qu'on va passer en paramètres. Dans notre cas, ce sera le tableau. et rien d'autre !

function randel (tab)
{
    var r = Math.round (Math.random() * (tab.length - 1));
    var rec = tab[r];
    tab.splice (r, 1);
    return rec;
}

Le var servira ici à supprimer la variable "r" et "rec" une fois la fonction terminée. Le choix aléatoire est bien fait, la suppression aussi. Et la valeur est bien retournée. Tout fonctionne ! Il ne vous reste plus qu'à tester :)

Voilà l'exemple du tutoriel mis en oeuvre :

function randel (tab)
{
    var r = Math.round (Math.random() * (tab.length - 1));
    var rec = tab[r];
    tab.splice (r, 1);
    return rec;
}

A1 = {Matiere:"Anatomie"};
B1 = {Matiere:"Biochimie"};
C1 = {Matiere:"Biohysique"};
D1 = {Matiere:"Biologie cellulaire"};
E1 = {Matiere:"Physique"};

Tableau = [A1, B1, C1, D1, E1];

while (Tableau.length)
{
    var rec = randel(Tableau);
    trace (rec.Nom);
}

Dans ce code, on aura tout bêtement les matières données, dans un ordre aléatoire, et jamais en double.

Voilà un autre exemple rapide :

function randel (tab)
{
    var r = Math.round (Math.random() * (tab.length - 1));
    var rec = tab[r];
    tab.splice (r, 1);
    return rec;
}

Tableau = new Array();
for (var i=0; i<100; i++)
{
    Tableau[i] = (i+1);
}

while (Tableau.length)
{
    trace (randel(Tableau));
}

Ce bout de code (ne sert à rien, oui je sais, merci pour la remarque), va définir un tableau avec dedans tous les nombres de un à cent. Puis,dans une boucle while (tant que la longueur du tableau est définie, c'est à dire différente de undefined et de 0), va afficher dans la fenêtre de sortie la valeur retournée par la fonction randel.

Conclusion

J'espère que ce petit bout de code, très simple à comprendre vous aura aidé, et j'espère surtout, ne plus revoir une question de ce genre sur le forum :)

Bonne chance à vous, et faites marchez vos méninges, c'est ce qu'il y a de mieux, et loin devant les tutoraix !

A voir également
Ce document intitulé « Random et suppression » issu de CodeS SourceS (codes-sources.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Rejoignez-nous