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

avec Java Discussion :

Afficher une grille de sudoku


Sujet :

avec Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Mai 2016
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mai 2016
    Messages : 31
    Par défaut Afficher une grille de sudoku
    Bonjour, je suis actuellement en Terminale S avec comme spé ISN (informatique et sciences du numérique). L'épreuve pour le bac arrive et la création de mon jeu n'avance plus depuis quelques semaine car je suis bloqué...
    A vrai dire je ne suis pas très doué et le professeur souvent absent n'arrange pas les choses. Pour le moment j'ai réussi a créer une grille et mettre des numéros de 0 à 8. J'aimerais que quelqu'un m'aide a faire une grille avec les numéros de mon choix et aussi pourvoir insérer des chiffres (pour jouer).
    Ah oui et j'ai aussi un problème avec la lecture de mon fichier .txt que je n'arrive pas à résoudre.
    Merci d'avance pour votre aide.
    Mon code actuelle est :

    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
    import java.awt.Color;
    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.FileReader;
    import java.io.FileNotFoundException;
    import java.io.FileWriter;
    import java.io.IOException;
     
    import acm.graphics.GLabel;
    import acm.graphics.GRect;
    import acm.program.GraphicsProgram;
     
     
    public class sudo1 extends GraphicsProgram{
    	public GRect fond;
     
    	public int bord = 100;
    	public int tailleCase = 50 ;
    	public int espaceCase = 10 ;
     
    	public  GRect [][] bloc = new GRect[3][3];
    	public  GRect [][] cellule = new GRect[9][9];
    	public static int [][] valCase = new int [9][9];
    	public int [][] modifCase = new int [9][9];
    	public static  GLabel [][] texteCase = new GLabel[9][9];
     
    	public void init() {
    		fond = new GRect(bord,bord,9*tailleCase+10*espaceCase,9*tailleCase+10*espaceCase);
    		fond.setFillColor(Color.BLUE);
    		fond.setFilled(true);
    		add(fond);
     
    		//Création des blocs 3x3 :
    		for (int indX=0; indX<3;indX++) {
    			for (int indY=0; indY<3;indY++) {
    				bloc[indX][indY]= new GRect(bord+espaceCase+indX*3*espaceCase+indX*3*tailleCase,bord+espaceCase+indY*3*espaceCase+indY*3*tailleCase, 
    						3*tailleCase+2*espaceCase,3*tailleCase+2*espaceCase);
    				bloc[indX][indY].setFillColor(Color.WHITE);
    				bloc[indX][indY].setFilled(true);
    				add(bloc[indX][indY]);
    			}
    		}
    		// création des cases :
    		for (int indX=0; indX<9;indX++) {
    			for (int indY=0; indY<9;indY++) {
    				cellule[indX][indY]= new GRect(bord+(1+indX)*espaceCase+indX*tailleCase,bord+(1+indY)*espaceCase+indY*tailleCase, tailleCase,tailleCase);
    				cellule[indX][indY].setFillColor(Color.LIGHT_GRAY);
    				cellule[indX][indY].setFilled(true);
    				add(cellule[indX][indY]);
    				valCase[indX][indY]=indX;
    				texteCase[indX][indY] = new GLabel(String.valueOf(valCase[indX][indY]),bord+(1+indX)*espaceCase+(0.4+indX)*tailleCase,
    						bord+(1+indY)*espaceCase+(0.6+indY)*tailleCase);
    				add(texteCase[indX][indY]);
    			}
    		}
     
    		//lecture();
    		ecriture();
     
    	}
    	public static void ecriture() { 
    			String ligne ;
    			int nombre = 123;
    			BufferedWriter fichier;
    			try {
    				fichier = new BufferedWriter(new FileWriter("Toto.txt"));
    				fichier.write("bonjour tout le monde");
    				fichier.close();
    			} catch (IOException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
     
    			System.out.println("fichier créé");
    		}
     
     
    	public static void lecture() throws IOException {
    		int table[] = new int[100];
    		BufferedReader Lecteur = null;
    		try {
    			Lecteur = new BufferedReader(new FileReader("Toto.txt"));
     
    		}
    		catch(FileNotFoundException exc) {
    			System.out.println("erreur");
    		}
    	    String[] ligne = new String[1000];
    		int index = 0;
    		index = 0;
    		while ((ligne[index] = Lecteur.readLine()) != null) {
    			System.out.print("ligne : ");
    			System.out.print(index);
    			System.out.print(" > ");
    			System.out.println(ligne[index]);
    			table[index]=Integer.parseInt(ligne[index]);
    			index++;
    		}
    		for (int indX=0; indX<3;indX++) {
    			for (int indY=0; indY<3;indY++) {
    				valCase[indX][indY]= table[indX+9*indY]; 
    				texteCase[indX][indY].setLabel(String.valueOf(valCase[indX][indY]));
    			}
    		} 
     
    	}
     
     
    }

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    Il va falloir être plus précis sur la description de tes problèmes. A part quelques évidences sur la partie fichier, difficile de deviner quels sont tes problèmes.

    Déjà, en préambule, utiliser JTF soi-disant pour contourner certains difficultés de Java, un machin datant de 2006 (mis à jour en 2008) est pour moi une abbération. Si c'est le prof qui vous oblige à ça, c'est bien dommage. Sinon, vire-moi ça et profite des avancées de Java 8, ou au moins Java 7.

    En ce qui concerne la lecture de fichier, pourquoi utiliser un tableau de lignes (Strng[] line) : ça ne sert à rien (tu ne l'utilises qu'au moment de convertir en entier pour remplir le tableau table). Tout ce qui est en trop contribue à la difficulté de compréhension des problèmes dans un programme. Une simple variable String est suffisante.
    Ensuite, si tu essayes de lire un fichier que ta méthode ecriture() a écrit, ce n'est pas étonnant que ça ne fonctionne pas : dans l'écriture, tu écris juste la phrase "bonjour le monde" : quelque chose qui ne risque pas de pouvoir être converti en entier par un Integer.parseInt(). En plus, la première fois, il faut penser que le fichier n'existe pas forcément.

    Ensuite, normalement, on remplit une grille standard de sudoku par des chiffres de 1 à 9, pas de 0 à 8. Pour la remplir de nombres de son choix, de manière à ce qu'il y ait suffisamment d'indices pour qu'elle soit soluble, je dirais qu'il y a un moyen simple : procéder par table de correspondances, comme on procéderait si on voulait faire une grille de suduko avec des lettres par exemple. La méthode de remplissage serait donc exactement identique à la méthode standard, sauf qu'au lieu de mettre directement le chiffre de 1 à 9, on mettrait à la place son correspondant dans la table.

    Je ne vois nulle part de code qui permet d'obtenir une grille "mélangée", c'est normal ?
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Mai 2016
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mai 2016
    Messages : 31
    Par défaut
    Salut,

    Merci pour ta réponse tout d'abord. Pour la version de java, je n'y suis pour rien. J'utilise le programme présent sur l'ordinateur au lycée à savoir éclipse. Surement pas le meilleur mais il est gratuit et donc largement mieux pour nous (on peut l'avoir chez nous).
    Je vais donc remplacer (Strng[] line) par String ? Cela ne change rien si ?
    J'ai créé un fichier.txt dans lequel normalement je rentre les chiffres que je souhaite mettre dans la grille. Car forcément je ne veux pas tous les chiffres a l'intérieur, seulement un nombre suffisant de chiffres pour permettre la résolution progressive et complète de la grille. En soit, je rentre par exemple 108005080 (les 0 correspondent a rien dans la case), ces chiffres correspondraient a une ligne de sudoku avec seulement le 1,8,5,8 présent dans la ligne.
    Plus généralement ce que j'essaie de faire c'est pouvoir modifier les chiffres présent dans la grille comme je le souhaite et de mettre un carré vide ou je peux cliquer dessus et compléter la grille.
    Malheureusement je n'y arrive pas du tout, et l'idée du fichier.txt je sais pas si c'est une bonne idée.
    Voilà, j'espère que c'est plus clair.

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Ce n'est pas tant la version de Java que l'utilisation d'une bibliothèque externe qui n'apporte à mon avis que de la complexité supplémentaire, d'autant qu'elle n'a aucun intérêt aujourd'hui et que tu trouveras pas beaucoup de monde qui peut te répondre sur des questions spécifiques à cette bibliothèque (je parle de JTF). Et ça encore moins de rapport avec Eclipse (et qu'Eclipse soit meilleur ou pas qu'un autre EDI est plus une affaire de goûts personnels, d'habitudes et de préférences (tout est toujours une histoire de compromis entre ce qu'on aimerait avoir, ce qu'on a, et ce qu'on aime bien avoir, de compromis entre avantages et inconvénients).

    Si je comprends bien ta question ne porte pas sur la génération automatique d'une grille, mais sur le remplissage d'une grille à partir d'un fichier qui contient déjà les valeurs aux bons endroits ?
    L'idée du zéro pour les cases vides n'est pas mauvaise. Mais je le répète : il te faudra gérer les chiffres de 0 à 9, et non de 0 à 8.
    Comme tu convertis les chiffres en String pour les mettres dans un GLabel, il te suffit de faire un simple test pour remplir les cases. Par exemple, là où tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    texteCase[indX][indY].setLabel(String.valueOf(valCase[indX][indY]));
    tu ferais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if ( valCase[indX][indY]==0 ) {
        texteCase[indX][indY].setLabel(""); // case vide
    } else {
        texteCase[indX][indY].setLabel(String.valueOf(valCase[indX][indY]));
    }
    En revanche, c'est étrange que tu fasses une boucle de 0 à 3 exclu, et non de 0 à 9 exclu. Est-ce que ça veut dire que chaque GLabel constitue un bloc 3x3 ? Dans ce cas, je ne vois pas bien comment tu gères ce bloc avec un entier... En principe, il vaudrait mieux de tout manière gérer un modèle qui n'ait pas de lien avec les classes graphique, puis de l'associer ensuite à l'affichage (selon les possibilités de la bibliothèque graphique, et, là, concernant JTF, je ne peux rien dire de plus vu que je ne connais pas).

    Ensuite, pour la partie fichier le fait de remplacer le tableau par une String change évidemment quelque chose, puisque le type de la variable n'est pas le même, mais c'est assez mineure.

    Voici ton code de lecture :
    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
    int table[] = new int[100];
    		BufferedReader Lecteur = null;
    		try {
    			Lecteur = new BufferedReader(new FileReader("Toto.txt"));
     
    		}
    		catch(FileNotFoundException exc) {
    			System.out.println("erreur");
    		}
    	    String[] ligne = new String[1000];
    		int index = 0;
    		index = 0;
    		while ((ligne[index] = Lecteur.readLine()) != null) {
    			System.out.print("ligne : ");
    			System.out.print(index);
    			System.out.print(" > ");
    			System.out.println(ligne[index]);
    			table[index]=Integer.parseInt(ligne[index]);
    			index++;
    		}
    Une petite remarque au préalable : tu affiches une erreur lorsque le fichier n'est pas trouvé, mais tu continues quand même à charger des données, d'un fichier qui n'existe pas. S'il y a une erreur, autant s'arrêter de suite.
    Ensuite, pour simplifier le code, il vaut mieux initialiser les variables dans la même instruction que leur déclaration. On gagne en lisibilité.
    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
    int table[] = new int[100]; // un tableau suffisamment grand pour lire une grille de 9x9 devrait faire 81 cases, mais 100 ça fonctionne
    		BufferedReader Lecteur = null;
    		try {
    			Lecteur = new BufferedReader(new FileReader("Toto.txt"));
     
                            // remplis ici ta grille
    	                String ligne;  // pas besoin d'un tableau, puisqu'on lit ligne à ligne
    		        int index = 0; // déclaration et initialisation dans la même instruction
    		       while ((ligne = Lecteur.readLine()) != null) {
    			    System.out.print("ligne : ");
    			    System.out.print(index);
    			    System.out.print(" > ");
    			    System.out.println(ligne);
    			    table[index]=Integer.parseInt(ligne);
    			    index++;
    		       }
                           /*... remplissage de la grille graphique (GLabel ou autre) ...*/
    		}
    		catch(FileNotFoundException exc) {
    			System.out.println("erreur");
    		}
    Ensuite, quelques remarques supplémentaires :
    1. lorsqu'on lit un fichier, il peut y avoir d'autre erreur qu'un problème de fichier manquant : il faut toutes les gérer, donc catcher IOException, ou faire un throws de cette exception
    2. Il est indispensable de fermer un flux après s'en être servi, surtout si c'est un fichier. Il faut donc appeler la méthode close() de BufferedReader dans tous les cas.
      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
      BufferedReader Lecteur = null;
      		try {
      			Lecteur = new BufferedReader(new FileReader("Toto.txt"));
       
                              // remplis ici ta grille
                              /*...*/
       
      		}
      		catch(IOException exc) {
      			System.out.println("erreur");
                              exc.printStackTrace(); // il est toujours intéressant de connaitre l'erreur si on veut pouvoir la traiter
      		}
                      finally {
                            // s'exécute toujours
                            if ( Lecteur!=null ) {
      		           try {
                                        Lecteur.close();
                                 } catch( IOException exc) {
      			           System.out.println("Fichier mal fermé");
                                         exc.printStackTrace(); 
                                 }
                            }
                      }
      En Java 7, on peut écrire ça plus simplement :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
       
      		try (BufferedReader Lecteur = Files.newBufferedReader(Paths.get("toto.txt")) {
       
                              // remplis ici ta grille
                              /*...*/
       
      		}
      		catch(IOException exc) {
      			System.out.println("erreur");
                              exc.printStackTrace(); // il est toujours intéressant de connaitre l'erreur si on veut pouvoir la traiter
      		}
    3. Tu peux regrouper tes 4 lignes de System.out :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      System.out.println("ligne : " + index + " > " + ligne);
    4. Il faudrait éventuellement catcher NumberFormatException qui survient si la ligne ne peut pas être convertie en int : ce qui arrive si le fichier n'est pas correctement saisi à l'origine
      Eventuellement, il faudrait ajouter un test pour vérifier que le chiffre est bien compris entre 0 et 9 inclus.
    5. Eventuellement, ajouter un moyen à l'appelant de la méthode de savoir que la grille n'a pas pu être remplie (en retournant un booléen par exemple)
    6. Il serait intéressant que la méthode ne remplisse pas directement l'interface graphique mais qu'elle retourne une grille (un tableau de int par exemple, ou mieux une classe qui représente une grille). Et de faire le remplissage complètement à part. Ceci permettrait de remplir la grille graphique par une grille chargée depuis un fichier, ou générée aléatoirement, ou autre.
    7. La convention en Java pour les noms de variables est leur nom commence par une minuscule (lecteur donc et pas Lecteur). C'est une habitude qui facilite la lecture du code par tout le monde.
    8. Il y a d'autres petites choses, mais a ton niveau, c'est inutile d'aller aussi loin...
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Mai 2016
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mai 2016
    Messages : 31
    Par défaut
    Salut, tu m'aides beaucoup. Merci.

    J'ai donc ajouté les bouts de code que tu m'a donné et aussi un try/catch pour la lecture. Je mes mon code a la fin de mon message, je m'excuse d'avance mais je ne sais pas mettre la balise.

    Une fois l'applet lancée, cela donne:

    https://gyazo.com/2e6d1dd9bed7b29d0545a6f7cfc9c466

    Le Fichier Toto de cette applet est:

    https://gyazo.com/98cf77ce5da4dee5272177652c1a6148

    Je n'ais mis que 9 chiffres dans le fichier et la répartition de ceux-ci est incompréhensible. Mais en tout cas, les zéros donnent bien une case vide.
    Je rencontre un problème avec "Bonjour le monde". Car il faut que j'aille dans le fichier toto et remettre des chiffres et sauvegarder le fichier à chaque fois que je veux lancer l'applet sinon elle ne marche pas. Que faire avec "Bonjour le monde" pour que ce que je mette dans le fichier reste tout le temps ?

    En ce qui concerne la fin de ton message je n'ai pas tout compris, notamment :

    Il faudrait éventuellement catcher NumberFormatException qui survient si la ligne ne peut pas être convertie en int : ce qui arrive si le fichier n'est pas correctement saisi à l'origine
    Eventuellement, il faudrait ajouter un test pour vérifier que le chiffre est bien compris entre 0 et 9 inclus.
    Eventuellement, ajouter un moyen à l'appelant de la méthode de savoir que la grille n'a pas pu être remplie (en retournant un booléen par exemple)
    Il serait intéressant que la méthode ne remplisse pas directement l'interface graphique mais qu'elle retourne une grille (un tableau de int par exemple, ou mieux une classe qui représente une grille). Et de faire le remplissage complètement à part. Ceci permettrait de remplir la grille graphique par une grille chargée depuis un fichier, ou générée aléatoirement, ou autre.

    Mon code actuel:
    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
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    package sudo1;
     
    import java.awt.Color;
    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.FileReader;
    import java.io.FileNotFoundException;
    import java.io.FileWriter;
    import java.io.IOException;
     
    import acm.graphics.GLabel;
    import acm.graphics.GRect;
    import acm.program.GraphicsProgram;
     
    public class sudo1 extends GraphicsProgram{
    	/**
             * 
             */
    	private static final long serialVersionUID = 1L;
     
    	public GRect fond;
     
    	public int bord = 100;
    	public int tailleCase = 50 ;
    	public int espaceCase = 10 ;
     
    	public  GRect [][] bloc = new GRect[3][3];
    	public  GRect [][] cellule = new GRect[9][9];
    	public static int [][] valCase = new int [9][9];
    	public int [][] modifCase = new int [9][9];
    	public static  GLabel [][] texteCase = new GLabel[9][9];
     
    	public void init() {
    		fond = new GRect(bord,bord,9*tailleCase+10*espaceCase,9*tailleCase+10*espaceCase);
    		fond.setFillColor(Color.BLUE);
    		fond.setFilled(true);
    		add(fond);
     
    		//Création des blocs 3x3 :
    		for (int indX=0; indX<3;indX++) {
    			for (int indY=0; indY<3;indY++) {
    				bloc[indX][indY]= new GRect(bord+espaceCase+indX*3*espaceCase+indX*3*tailleCase,bord+espaceCase+indY*3*espaceCase+indY*3*tailleCase, 
    						3*tailleCase+2*espaceCase,3*tailleCase+2*espaceCase);
    				bloc[indX][indY].setFillColor(Color.WHITE);
    				bloc[indX][indY].setFilled(true);
    				add(bloc[indX][indY]);
    			}
    		}
    		// création des cases :
    		for (int indX=0; indX<9;indX++) {
    			for (int indY=0; indY<9;indY++) {
    				cellule[indX][indY]= new GRect(bord+(1+indX)*espaceCase+indX*tailleCase,bord+(1+indY)*espaceCase+indY*tailleCase, tailleCase,tailleCase);
    				cellule[indX][indY].setFillColor(Color.LIGHT_GRAY);
    				cellule[indX][indY].setFilled(true);
    				add(cellule[indX][indY]);
    				valCase[indX][indY]=indX;
    				texteCase[indX][indY] = new GLabel(String.valueOf(valCase[indX][indY]),bord+(1+indX)*espaceCase+(0.4+indX)*tailleCase,
    						bord+(1+indY)*espaceCase+(0.6+indY)*tailleCase);
    				add(texteCase[indX][indY]);
    			}
    		}
     
    		try {
    			lecture();
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		ecriture();
     
    	}
    	public static void ecriture() { 
    			String ligne ;
    			int nombre = 123;
    			BufferedWriter fichier;
    			try {
    				fichier = new BufferedWriter(new FileWriter("Toto.txt"));
    				fichier.write("bonjour tout le monde");
    				fichier.close();
    			} catch (IOException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
     
    			System.out.println("fichier créé");
    		}
     
     
    	public static void lecture() throws IOException {
    		int table[] = new int[100]; // un tableau suffisamment grand pour lire une grille de 9x9 devrait faire 81 cases, mais 100 ça fonctionne
    		BufferedReader Lecteur = null;
    		try {
    			Lecteur = new BufferedReader(new FileReader("Toto.txt"));
     
                            // remplis ici ta grille
    	                String ligne;  // pas besoin d'un tableau, puisqu'on lit ligne à ligne
    		        int index = 0; // déclaration et initialisation dans la même instruction
    		       while ((ligne = Lecteur.readLine()) != null) {
    		    	   System.out.println("ligne : " + index + " > " + ligne);
    			    table[index]=Integer.parseInt(ligne);
    			    index++;
    		       }
                           /*... remplissage de la grille graphique (GLabel ou autre) ...*/
    		}
    		catch(FileNotFoundException exc) {
    			System.out.println("erreur");
    			 exc.printStackTrace(); // il est toujours intéressant de connaitre l'erreur si on veut pouvoir la traiter
    		}
    		finally {
                // s'exécute toujours
                if ( Lecteur!=null ) {
             try {
                            Lecteur.close();
                     } catch( IOException exc) {
    	           System.out.println("Fichier mal fermé");
                             exc.printStackTrace(); 
                     }
                }
          }
     
    		for (int indX=0; indX<3;indX++) {
    			for (int indY=0; indY<3;indY++) {
    				valCase[indX][indY]= table[indX+9*indY]; 
    				if ( valCase[indX][indY]==0 ) {
    				    texteCase[indX][indY].setLabel(""); // case vide
    				} else {
    				    texteCase[indX][indY].setLabel(String.valueOf(valCase[indX][indY]));
    				}
     
    			}
    		} 
     
    	}
     
     
    }

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    On va reprendre les points un par un.

    le fichier :
    0
    1
    0
    1
    0
    1
    0
    1
    0
    9 valeurs donc

    la boucle qui charge le fichier dans le tableau table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    		       while ((ligne = Lecteur.readLine()) != null) {
    		    	   System.out.println("ligne : " + index + " > " + ligne);
    			    table[index]=Integer.parseInt(ligne);
    			    index++;
    		       }
    Résultat :
    table[0]=0;
    table[1]=1;
    table[2]=0;
    table[3]=1;
    table[4]=0;
    table[5]=1;
    table[6]=0;
    table[7]=1;
    table[8]=0;
    index vaut 9 et le reste du tableau est rempli de 0.

    la boucle qui transfert les valeurs dans l'affichage
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    for (int indX=0; indX<3;indX++) {
    			for (int indY=0; indY<3;indY++) {
    				valCase[indX][indY]= table[indX+9*indY]; 
    				if ( valCase[indX][indY]==0 ) {
    				    texteCase[indX][indY].setLabel(""); // case vide
    				} else {
    				    texteCase[indX][indY].setLabel(String.valueOf(valCase[indX][indY]));
    				}
     
    			}
    		}
    Les valeurs successives de indX et indY :
    0 0 0+9*0=0
    0 1 0+9*1=9
    0 2 0+9*2=18
    1 0 1+9*0=1
    1 1 1+9*1=10
    1 2 1+9*2=19
    2 0 2+9*0=2
    2 1 2+9*1=11
    2 2 2+9*2=20
    Toutes les valeurs que j'ai mises en rouge sont supérieures à 8, la dernière case qui a pu être remplie lors de la lecture de ton fichier : donc forcément toutes ces valeurs sont à 0, donc cases vides.

    Si on prend la grille de sudoku, les indX et indY correspondant aux valeurs entre 0 et 2 incluses, les cases en questions correspondent à celle que j'ai remplies ci-dessous (les cases vides ne sont pas gérées par ta lecture) :
    indX=0, indY=0, donc table[0] indX=1, indY=0, donc table[1] indX=2, indY=0, donc table[2]
    indX=0, indY=1, donc table[9] indX=1, indY=1, donc table[10] indX=2, indY=1, donc table[11]
    indX=0, indY=2, donc table[18] indX=1, indY=2, donc table[19] indX=1, indY=2, donc table[20]
    Est-ce que tu comprends mieux ce résultat (j'y ai entouré en jaune les seules cases que ta lecture remplit) :
    Nom : Capture.JPG
Affichages : 1545
Taille : 65,1 Ko


    PS pour mettre la balise CODE, voir le MP que je t'ai envoyé.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

Discussions similaires

  1. Réponses: 9
    Dernier message: 21/05/2014, 08h52
  2. Erreur code: besoin d'aide
    Par cmbelgique dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 17/11/2007, 14h09
  3. Je besoin d'aide pour terminer mon code
    Par Paulinho dans le forum C++
    Réponses: 7
    Dernier message: 06/11/2005, 23h30
  4. Débutant en C++ a besoin d'aide por son code
    Par Paulinho dans le forum C++
    Réponses: 9
    Dernier message: 08/10/2005, 08h53

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