begin process at 2010 02 10 09:45:30
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive Flash

 > 

Archives

 > 

ActionScript

 > 

remplir un tableau comme un sudoku...


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

remplir un tableau comme un sudoku...

dimanche 11 septembre 2005 à 12:47:49 | remplir un tableau comme un sudoku...

8livier

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:

[code]
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);
      }
    }
   }
 }
[/code]

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

ce qui donne:

[code]
ligne1=new Array(8);
  creerTableau(8,ligne1);
  colonne1=new Array(8);
  creerTableau(8,colonne1);
  ligne2=new Array(8);
  creerTableau(8,ligne2);  
  ligne3=new Array(8);
  creerTableau(8,ligne3);   
  ligne4=new Array(8);
  creerTableau(8,ligne4); 
  while(colonne1[0]!= ligne1[0] or colonne1[1]== ligne1[1] or colonne1[2]== ligne1[1] or colonne1[1]== ligne1[2] or colonne1[2]== ligne1[2]){
   creerTableau(8,colonne1);
  }
  for(parcourLigne=0;parcourLigne<=2;parcourLigne++){
   for(parcourColonne=0;parcourColonne<=2;parcourColonne++){
    while( colonne1[1]!= ligne2[0] || ligne2[parcourLigne]==ligne1[parcourColonne] || ligne2[3+parcourLigne]==ligne1[3+parcourColonne] || ligne2[6+parcourLigne]== ligne1[6+parcourColonne] ){
    creerTableau(8,ligne2);parcourLigne=0;parcourColonne=0;
    }
   }
  }
  for(test1=0;test1<=2;test1++){
   for(test2=0;test2<=2;test2++){
    while( colonne1[2]!= ligne3[0] || ligne3[test1]==ligne1[test2] || ligne3[3+test1]==ligne1[3+test2] || ligne3[6+test1]== ligne1[6+test2] || ligne3[test1]==ligne2[test2] || ligne3[3+test1]==ligne2[3+test2] || ligne3[6+test1]== ligne2[6+test2]){
    creerTableau(8,ligne3);test1=0;test2=0;
    }
   }
  }

  k=0;
  for(z=0;z<=8;z++){
   tableau[0][z]=ligne1[k];
   tableau[z][0]=colonne1[k];
   tableau[1][z]=ligne2[k];
   tableau[2][z]=ligne3[k];
   k++;
    
  }
[/code]

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...



dimanche 11 septembre 2005 à 14:41:07 | Re : remplir un tableau comme un sudoku...

Slagt

Membre Club
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.
dimanche 11 septembre 2005 à 15:54:42 | Re : remplir un tableau comme un sudoku...

8livier


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...

dimanche 11 septembre 2005 à 17:36:08 | Re : remplir un tableau comme un sudoku...

Slagt

Membre Club
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...


Cette discussion est classée dans : tableau, colonne1, ligne1, ligne2, ligne3


Répondre à ce message

Sujets en rapport avec ce message

url dynamique ? [ par creaman ] je voudrais faire un top5 de site en flash. mais j'ai un probleme je sais comment faire pour changer le nom des sites dans le tableau a partir de donn action sur tableau.. [ par nirousse ] Voila, je vous explique.j'ai un tableau nommé x.Pour exemple, on va dire qu'il contient les valeurs suivantes : x=[3,2,1].Moi, en appelant 1 fonction, txt vers tableau [ par Eren76 ] Dans un programme en flash 5, j'ai un fichier txt avec une liste de données du type :&donnee1=KABOUL&&donnee2=PRETORIA&&donnee3=TIRANA&Je les récupère txt vers tableau [ par Eren76 ] Dans un programme en flash 5, j'ai un fichier txt avec une liste de données du type :&donnee1=KABOUL&&donnee2=PRETORIA&&donnee3=TIRANA&Je les récupère créer un tableau [ par ihen ] Salut,J'ai fait un jeu et j'aimerais faire un tableau qui effectue un classement des 10 meilleurs.mes variables à integrer au tableau sont pseudo et t PROBLEME DE MENU DYNAMIQUE [ par zikaphil ] J'ai un gros probleme, je souhaite créer un menu dynamique à partir d'un fichier XML, tout marchait correctement jusqu'a ce que je veuille y insérer d catalogue énorme ! [ par sherka68 ] Bonjour à tous,Je veux faire un catalogue avec Flash.La base exportée en XML contient environ 6000 références.Lorsque je charge le fichier XML et que ASP et Flash [ par RayusgnaL ] Bonjour,Voilà je viens demander de l'aide parce que je ne connais pas vraiment Flash et on m'a demandé de modifier un .fla de manière à le rendre dyna les tableau [ par kodiask ] kelkun peut maider jarrive pa a afficher les donnée d'un tableau parce que je comprend pas le fonctionnement ac i++ / i+++ Tableau de donnees [ par Ric38 ] Salut,certains ont peut etre vu l animation sur la saison actuelle de Formule 1 disponible dans la categorie sports de Yahoo France.J aimerais reprodu


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,920 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales