Forums Développement Multimédia

Aller au contenu

Recherche dans un Array SI la variable existe

Array indexOf variable AS3 CODE Actionscript

3 réponses à ce sujet

#1 Gouj

    Ceinture Jaune

  • Members
  • PipPip
  • 26 messages

Posté 04 July 2013 - 17:09 PM

Bonjour à tous!

Je viens vers vous car après de nombreuses recherches sur http://livedocs.adobe.com et autre, ... je ne comprend pas pourquoi cela ne fonctionne pas !

Ma situation :

Mon objectif est de réaliser un tirage au sort ou chaque données ne peut être tiré qu'une seule foi, pour cela :
  • J'ai un premier tableau avec des données "marqueArray"
  • J'ai un tableau "doneArray" vierge qui est la pour servir de "disquette de sauvegarde" ^^
  • J'ai une fonction "tirage()" qui me sort un numéro aléatoire stocké dans la variable "id_aleatoire"
  • J'ai ensuite une fonction sur un bouton pour lancer le tirage au sort ... voici le code de cette fonction :

function tirage_marque(){
tirage(); //1ere tirage

//test si la question a déja été posé
if (doneArray.indexOf(marqueArray[id_aleatoire] == -1 )){

trace("c'est bon")
trace("la marque tiré : " + marqueArray[id_aleatoire])
//Enregistre la question pour ne pas la reposer
doneArray.push(marqueArray[id_aleatoire])
trace("les marques déja tiré : " +doneArray)
}

else {
trace("c'est pas bon")
//relance le tirage

}
  }
 

Mon problème :

bah littéralement ça ne marche pas car voila la sortie de mon tracking :


c'est bon
la marque tiré : Marque A
les marques déja tiré : Marque A
c'
est bon
la marque tiré : Marque C
les marques déja tiré : Marque A,Marque C
c'est bon
la marque tiré : Marque B
les marques déja tiré : Marque A,Marque C,Marque B
c'
est bon
la marque tiré : Marque B
les marques déja tiré : Marque A,Marque C,Marque B,Marque B
c'est bon
la marque tiré : Marque C
les marques déja tiré : Marque A,Marque C,Marque B,Marque B,Marque C
c'
est bon
la marque tiré : Marque B
les marques déja tiré : Marque A,Marque C,Marque B,Marque B,Marque C,Marque B
c'est bon
la marque tiré : Marque B
les marques déja tiré : Marque A,Marque C,Marque B,Marque B,Marque C,Marque B,Marque B

sachant que j'ai 3 marque distinct dans mon tableau de donnée je devrait pouvoir faire que 3 tirages avec les résultat "c'est bon" puis après les reste me donnerait "c'est pas bon"...

et je ne comprend pas pourquoi

Merci d'avance amis médiaboxeur !

bonne soirée :D

#2 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 6954 messages

Posté 04 July 2013 - 17:15 PM

Salut,

Pour le tirage alétoire je recommande la procédure suivante :

Créer un tableau avec la liste des chiffres à tirer
Créer un second tableau rempli des mêmes chiffres.
Mélanger aléatoirement le second tableau.
Tirer les chiffres dans l'ordre du second tableau et utiliser shift ou pop pour le tirage (ce qui a pour effet d'extraire le chiffre et le retirer du tableau ainsi plus possible de le tirer une nouvelle fois).
Lorsque le second tableau est vide c'est que tous les chiffres ont été tirés.

Le premier tableau sert de sauvegarde des chiffres.

Pour illustrer voici un exemple :


// variables
var tab1:Array = [1,2,3,4,5,6];
var tab2:Array = [1,2,3,4,5,6];
var tire:int = 0;

// mélanger le tableau
tab2.sort(tri);
function tri(a:Number, b:Number):void{
        return Math.random()
}
trace("tableau mélangé : "+tab2);

// effectuer les tirages
tirage();
function tirage(){
        tire = tab2.shift();
        debug();
        if(tab2.length) tirage(); // boucler les tirages
}

// infos de déboggage
function debug():void{
        trace("--------");
        trace("tirage : "+tire);
        trace("tableau : "+tab2);
}


 

J'ai pris des chiffres comme exemple mais ça marche avec n'importe quoi qui se trouve dans un tableau bien sur.
Impossible de tirer deux fois le même contenu puisqu'il est retiré du tableau de tirage à chaque tirage.
Si tu veux conserver l'ordre des tirage tu as juste à pousser la variable "tire" dans un nouveau tableau de sauvegarde.
Si tu veux réinitialiser le tableau de tirage, utilise "concat" pour copier une à une les valeurs du tab1 dans le tab2 sans modifier le tab1, puis tu as juste à remélanger le tab2 et relancer les tirages.

#3 Benzouye

  • Members
  • PipPipPipPipPipPipPipPip
  • 583 messages

Posté 04 July 2013 - 17:39 PM

Bonjour,

Je suis d'accord avec Mr Spi.

Par ailleurs, je ne sais pas si c'est une faute de frappe dans ton message ou dans ton code, mais :
if ( doneArray.indexOf ( marqueArray[id_aleatoire] == -1 ) )

Devrait plutôt être :
if ( doneArray.indexOf ( marqueArray[id_aleatoire] ) == -1 )

Position de la parenthèse fermante du indexOf ...
Benzouye
Travaille avec FlashDevelop 4 + Flex SDK 4.6 open source

#4 Gouj

    Ceinture Jaune

  • Members
  • PipPip
  • 26 messages

Posté 04 July 2013 - 20:10 PM

:jesors: ... je me sens un peu idiot sur ce coup !

mais bon c'est pas perdu je repars sur des bases plus saines.

Merci M. Spi et Benzouye pour votre aide et vos conseil.

Je vais me pencher sur cette méthode qui m'a l'air beaucoup moins lourde :)

Merci encore

Bonne soirée



1 utilisateur(s) li(sen)t ce sujet

0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)

authorised training centre

Centre de Formation Mediabox - Adobe et Apple Authorised Training Center.

Déclaré auprès de la Direction du Travail et de la Formation Professionnelle

Mediabox : SARL au capital de 62.000€ - Numéro d'activité : 11 75 44555 75 - SIRET : 49371646800035

MEDIABOX, 23, rue de Bruxelles, 75009 PARIS

FFP