IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Collection et Stream Java Discussion :

Génération tableau sudoku


Sujet :

Collection et Stream Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 24
    Par défaut Génération tableau sudoku
    Bonjour
    Voila je suis en train de créer un sudoku. Plus précisement, je veux générer une solution dans un tableau 9x9.
    Donc je parcours mon tableau[9][9], et je génère des chiffres aléatoires de 1 à 9, vérifiant s'ils sont déjà sur la même ligne , même colonne et même bloc.(la fonction qui vérifie si le chiffre existe déjà est constituée de 3 boucles, qui regardent la ligne , la colonne et le bloc qui contienent la case à traiter.

    Sauf que voilà a l'execution, j'ai une boucle infinie. En effet, lorsque je mets la partie vérification d'un bloc et de colonne en commentaire, je crée un sudoku dont les chiffres vérifient juste l'unicité des chiffres des lignes.
    Voici mon code:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
     
    public static void initGame() {
            ResolutionTableau[0][0] = (int) (Math.random() * 9 + 1);
            int coin = ResolutionTableau[0][0];
            for (int i = 0; i < 9; i++) {
                for (int j = 0; j < 9; j++) {
                    if (i != 0 || j != 0) {
                        while (verifyIfNumberAlreadyExist(i, j, ResolutionTableau, coin)) {
                            boolean stretch = false;
                            if (stretch == false) {
                                coin = (int) (Math.random() * 9 + 1);
                                System.out.println("coin " + coin);
                            } else {
                                coin = (coin + 1) % 10;
                            }
                            // System.out.println("case " + i + " ligne et " + j + "colonne");
                            System.out.println("Resolution " + ResolutionTableau[i][j]);
                            System.out.println("Resolution " + i + " and" + j);
                            stretch = true;
                        }
                        ResolutionTableau[i][j] = coin;
                    }
                }
            }
        }
        public static boolean verifyIfNumberAlreadyExist(int i, int j, int[][] tableau, int numeroaverifier) {
            boolean result = false;
            //On vérifie sur cette boucle si le chiffre existe déjà sur la même ligne
           /* if (j > 0) {
                for (int l = 0; l < j; l++) {
                    if (numeroaverifier == tableau[i][l]) {
                        result = true;
                        // System.out.println(+numeroaverifier);
                        System.out.println(result + " meme ligne avec " + i + " colonne" + l + "avec comme valeur " + tableau[i][l]);
                        return result;
                    }
                }
            }
            /*if (i > 0) {
                for (int k = 0; k < i; k++) {
                    if (numeroaverifier == tableau[k][j]) {
                        result = true;
                        System.out.println(result + " meme ligne avec " + i + " colonne" + "avec comme valeur ");
                        return result;
                    }
                }
            }*/   if (i % 3 != 0 || j % 3 != 0) {
                for (int l = i - i % 3; l < i -i%3+3; l++) {
                    for (int k = j - j % 3; k < j -j%3+3; k++) {
                        if (i != l || j != k) {
                            if (numeroaverifier == tableau[l][k] && tableau[l][k] != 0) {
                                result = true;
                                System.out.println(result +" et meme carre");
                                return result;
                            }
                        }
                    }
                }
            }
            return result;
        }

    Merci

  2. #2
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2008
    Messages
    1 190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 190
    Par défaut
    Déjà repère avec des traces sur quel boucle tu as une exécution infini.
    Ensuite il te restera juste à vérifier si c'est ta condition d'arret qui est fausse, ou le traitement dans la boucle.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 24
    Par défaut
    en faite chaque boucle à part fonctionne parfaitement, il suffit que j'active deux boucles pour que sa tourne en infini.
    J'ai déjà fait des println, je remarque qu'aléatoirement (pour un i et j ), la boucle dans initGame() tourne en infini ...

  4. #4
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2012
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2012
    Messages : 33
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    while (verifyIfNumberAlreadyExist(i, j, ResolutionTableau, coin)) {
                            boolean stretch = false;
                            if (stretch == false) {
                                coin = (int) (Math.random() * 9 + 1);
                                System.out.println("coin " + coin);
                            } else {
                                coin = (coin + 1) % 10;
                            }
                            // System.out.println("case " + i + " ligne et " + j + "colonne");
                            System.out.println("Resolution " + ResolutionTableau[i][j]);
                            System.out.println("Resolution " + i + " and" + j);
                            stretch = true;
                        }
    Bonjour,
    Je remarque que dans cette boucle while (où tu fais l'appel à ta fonction verifyIfNumberAlreadyExist), ton i et ton j ne sont pas modifiés, du coup l'appel est répété avec les mêmes coordonnées. Mais je ne m'avance pas plus, je n'ai pas été plus loin dans le code.

  5. #5
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2008
    Messages
    1 190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 190
    Par défaut
    Tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     boolean stretch = false;
                            if (stretch == false) {
                                coin = (int) (Math.random() * 9 + 1);
                                System.out.println("coin " + coin);
                            } else {
                                coin = (coin + 1) % 10;
                            }
    Ton stretch est donc toujours a false... Il faut surement l'initialiser avant le while.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 24
    Par défaut
    Citation Envoyé par deathness Voir le message
    Tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     boolean stretch = false;
                            if (stretch == false) {
                                coin = (int) (Math.random() * 9 + 1);
                                System.out.println("coin " + coin);
                            } else {
                                coin = (coin + 1) % 10;
                            }
    Ton stretch est donc toujours a false... Il faut surement l'initialiser avant le while.
    Merci, mais ça ne marche pas non plus ... voici la classe en entier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
     
     
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
     
    public final class Fenetre extends JFrame {
     
        static int[][] ResolutionTableau = new int[9][9];
     
        public static void main(String[] args) {
            int[][] tab={{1,2,3,4,5,6,7,8,9},{4,5,6,7,8,9,1,2,3},{7,8,9,1,2,3,4,5,6},{2,3,4,5,6,7,8,9,1},{5,6,7,8,9,1,2,3,4},{8,9,1,2,3,4,5,6,7},{3,4,5,6,7,8,9,1,2},{6,7,8,9,1,2,3,4,5},{9,1,2,3,4,5,6,7,8}};
            verifyIfNumberAlreadyExist(1, 1, tab, 3);
            //initGame();
            Fenetre fen = new Fenetre();
     
        }
        private JPanel pan = new JPanel();
        private JButton bouton = new JButton();
     
        public Fenetre() {
     
            this.setTitle("Sudoku 1.0");
            this.setSize(500, 500);
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            this.setLocationRelativeTo(null);
            this.setContentPane(pan);
            initGraphics();
            this.setVisible(true);
        }
     
        public void initGraphics() {
             int[][] tab={{1,2,3,4,5,6,7,8,9},{4,5,6,7,8,9,1,2,3},{7,8,9,1,2,3,4,5,6},{2,3,4,5,6,7,8,9,1},{5,6,7,8,9,1,2,3,4},{8,9,1,2,3,4,5,6,7},{3,4,5,6,7,8,9,1,2},{6,7,8,9,1,2,3,4,5},{9,1,2,3,4,5,6,7,8}};
            JButton[][] tabJButton = new JButton[9][9];
            JPanel jpanel = new JPanel();
            //Variable qui détermine le nombres de chiffres-solutions à afficher depuis le départ
            int numchiffresolution = 27;
            int x = 300;
            int y = 300;
            for (int i = 0; i < 9; i++) {
                for (int j = 0; j < 9; j++) {
                    tabJButton[i][j] = new JButton();
                    tabJButton[i][j].setSize(20, 30);
                    pan.add(tabJButton[i][j]);
                    tabJButton[i][j].setVisible(true);
                    tabJButton[i][j].setLocation(x, y);
                    //if ((int) (Math.random() * 3) == 2 && numchiffresolution > 0) {
                    tabJButton[i][j].setText(String.valueOf(tab[i][j]));
                    //numchiffresolution--;
                    //}
                    this.getContentPane().add(tabJButton[i][j]);
                    x += 30;
                }
                y = y + 20;
            }
        }
     
        public static void initGame() {
            ResolutionTableau[0][0] = (int) (Math.random() * 9 + 1);
            int coin = ResolutionTableau[0][0];
            for (int i = 0; i < 9; i++) {
                for (int j = 0; j < 9;) {
                    if (i != 0 || j != 0) {
                        while (verifyIfNumberAlreadyExist(i, j, ResolutionTableau, coin)) {
                            coin = (int) (Math.random() * 9 + 1);
                            System.out.println("coin " + coin);
                            coin = (coin + 1) % 10;
                    }
                    ResolutionTableau[i][j] = coin;
                }j++;
            }i++;
        }
    }
    public static boolean verifyIfNumberAlreadyExist(int i, int j, int[][] tableau, int numeroaverifier) {
            boolean result = false;
            //On vérifie sur cette boucle si le chiffre existe déjà sur la même ligne
           if (j > 0) {
                for (int l = 0; l <9; l++) {
                    if(l>=j){break;}
                    if (numeroaverifier == tableau[i][l]) {
                        result = true;
                        // System.out.println(+numeroaverifier);
                       System.out.println("ligne avec i=" +i +" et j=" +j +" et l="+l);
                        return result;
                    }
                }
            }
            if (i > 0) {
                for (int k = 0; k < 9; k++) {
                    if(k>=i){break;}
                    if (numeroaverifier == tableau[k][j]) {
                        result = true;
                        System.out.println("colonne avec i=" +i +" et j=" +j +" et k="+k);
                        return result;
                    }
                }
            } if (i % 3 != 0 || j % 3 != 0) {
                for (int l = i - i % 3; l < i -i%3+3; l++) {
                    for (int k = j - j % 3; k < j -j%3+3; k++) {
                        if (i != l || j != k) {
                            if (numeroaverifier == tableau[l][k] && tableau[l][k] != 0) {
                                result = true;
                               System.out.println("carre avec i=" +i +" et j=" +j +" et l="+l +" et k=" +k);
                                return result;
                            }
                        }
                    }
                }
            }
            return result;
        }
    }
    C'est la seule classe du projet. Notez que là je fais des tests de la fonction verifyIfNumberAlreadyExist . Apparement cette fonction foire, mais je vois pas comment :'(

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. XSL-FO génération tableau
    Par lenstoi dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 24/09/2008, 12h43
  2. Réponses: 5
    Dernier message: 15/02/2007, 16h47
  3. probleme d'affichage d'un tableau sudoku
    Par masterix59 dans le forum C
    Réponses: 2
    Dernier message: 05/12/2006, 00h04
  4. Tentative de génération d'un tableau type "sudoku"
    Par charlybapt dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 06/04/2006, 09h48
  5. Génération d'une hash de hash de tableau
    Par antigone dans le forum Langage
    Réponses: 3
    Dernier message: 01/09/2005, 19h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo