cs_8livier
Messages postés13Date d'inscriptionmardi 10 mai 2005StatutMembreDernière intervention 9 mai 2009
-
11 sept. 2005 à 12:47
slagt
Messages postés232Date d'inscriptionmercredi 2 avril 2003StatutMembreDernière intervention29 mars 2011
-
11 sept. 2005 à 17:36
bonjour,
je commence tout juste le flash, et je me suis lancé un defit peut etre un peu trop grand pour commencer...mais voila...je suis tennace
je crée un tableau de 9 colonnes et une ligne comprenant de facon aleatoire les chiffres de 1 à 9:
ligne1= new Array();
creerTableau(ligne1);
function creerTableau(table){//creation de tableaux avec des chiffres de 1 a 9 placés aleatoirement
for(z=0;z<=8;z++){
table[z]=0;
while(table[z]==10 or table[z]==0){
table[z]=Math.round(Math.random()*10);
}
for(j=0;j<z;j++){
while(table[z]==table[j] or table[z]==10 or table[z]==0 ){
j=0;
table[z]=Math.round(Math.random()*10);
}
}
}
}
ensuite, je veux mattre ce tableau dans un autre de 9 lignes et de 9 colonnes en verifiant qu'il n'y ai pas deux fois le meme chiffre dans une meme colonne, ainsi que dans un bloc de trois par trois:
tableau[0][0] tableau[0][1] tableau[0][2]
tableau[1][0] tableau[1][1] tableau[1][2]
tableau[2][0] tableau[2][1] tableau[2][2]
puis dans :
tableau[0][3] tableau[0][4] tableau[0][5]
tableau[1][3] tableau[1][4] tableau[1][5]
tableau[2][3] tableau[2][4] tableau[2][5]...etc
pour le moment il n' y a que qq lignes; mais deja la quand je teste l'animation flash m'arrete une fois sur deux en me disant que ca prend trop de temps... et quand il ne m'arrete pas le script, ca marche...Mais voila, des que j'ajoute une ligne...il m'arrete le script tout le temps...
donc mes questions:
Comment faire un tel truc sans que flash ne m'arrete le script?
est il possiblede faire un tel truc avec action script?
en clair besoin de petits conseils....
merci...en esperant avoir ete suffisamment clair...
slagt
Messages postés232Date d'inscriptionmercredi 2 avril 2003StatutMembreDernière intervention29 mars 2011 11 sept. 2005 à 14:41
Oui, ça n'est pas très optimisé tout ça !
Premièrement :
ligne1= new Array();
creerTableau(ligne1);
function creerTableau(table)
{
for(z=0;z<=8;z++)
{
table[z]=0;
while(table[z]==10 or table[z]==0)
{
table[z]=Math.round(Math.random()*10);
}
for(j=0;j<z;j++)
{
while(table[z]==table[j] or table[z]==10 or table[z]==0 ){
j=0;
table[z]=Math.round(Math.random()*10);
}
}
}
Alors, quelques optimisations :
// -----
table[z]=0;
while(table[z]==10 or table[z]==0)
{
table[z]=Math.round(Math.random()*10);
}
// -----
Au final, ça prend un nombre aléatoire entre 1 et 9 compris.
Ce serait plus simple de faire ça :
// -----
table[z] = Math.round ( Math.random() * 8 ) + 1;
// -----
Ce qui t'intéresse c'est que le plus petit soit 1, et le plus grand
soit 9. Donc, tu prend un nombre entre 0 et 8. Et tu ajoute 1. Ca
fonctionne parfaitement, et ça évite une boucle while, déjà !
Pour la suite, tu vérifies s'il n'est pas en double, et si c'est le
cas, tu refais un aléatoire jusqu'à ce qu'il ne le soit plus.
On dois pouvoir se démerder pour ne pas avoir à faire cette vérification non ?
Regardons :
L'idée serait de faire un tableau avec tous les chiffres de 1 à 9. Il
n'y en a pas bcp donc tu n'est pas obligé de créer le tableau avec une
boucle for :
var chiffre = [1, 2, 3, 4, 5, 6, 7, 8, 9];
Ensuite, tu fais une boucle for, avec 9 passages, et à chaque passage, tu vas prendre un chiffre du tableau :
for (var i=0; i<9; i++)
{
var a = Math.round( Math.random() * 8); // On prend un nombre entre 0 et 8 inclut
table[i] =
chiffre[a];
// On met dans table[i] la valeur de chiffre à l'index "a"
chiffre.splice (a, 1);
// Et on enlève l'index "a" du tableau chiffre
}
Et voilà, avec ça, tu as un tableau contenant tous les chiffres de 1 à
9 incluent, et aucun en double. Et tout ça avec 1 seule boucle for,
contre 2 boucles for et 2 boucles while avec ta méthode.
Il reste des choses à corriger dans la deuxième partie (beaucoup même
!) mais c'est déjà pas mal, et maintenant que tu as pigé le truc (je
pense quand même), tu devrais pouvoir optimiser tout seul, même rien
qu'un peu, la suite.
cs_8livier
Messages postés13Date d'inscriptionmardi 10 mai 2005StatutMembreDernière intervention 9 mai 2009 11 sept. 2005 à 15:54
c'est vrai que ce n'etait pas dutout optimisé, mais ta solution me pose un petit pb!...
var chiffre = [1, 2, 3, 4, 5, 6, 7, 8, 9];
for (var i=0; i<9; i++)
{
var a = Math.round( Math.random() * 8); // On prend un nombre entre 0 et 8 inclut
table[i] = chiffre[a]; // On met dans table[i] la valeur de chiffre à l'index "a"
chiffre.splice (a, 1); // Et on enlève l'index "a" du tableau chiffre
}
dans cette boucle, si on tombe deux fois sur la meme valeur pour "a", alors table[i] n'a aucune valeur au deuxieme tour...
slagt
Messages postés232Date d'inscriptionmercredi 2 avril 2003StatutMembreDernière intervention29 mars 2011 11 sept. 2005 à 17:36
Oops, petite erreur d'étourderie en effet
En effet avec ce code, on peut tombé sur l'index 8, alors qu'il n'existe plus. Voilà la correction, c'est... tout bête !
for (var i=0; i<9; i++)
{
var a = Math.round( Math.random() * (chiffre.length-1));
table[i] =
chiffre[a];
// On met dans table[i] la valeur de chiffre à
l'index "a"
chiffre.splice (a, 1);
// Et on enlève
l'index "a" du tableau chiffre
}
Comme ça, si le tableau a 9 entrées, ça prendra un nombre entre 0 et 8
incluent, et s'il n'a que 4 entrées, ça prendra un nombre entre 0 et 3
incluent.
Désolé, c'est bête de faire une erreur d'étourderie quand on propose une solution...