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 :

Jeu de sudoku : problème dans mes classes Case Placement


Sujet :

avec Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Webmaster
    Inscrit en
    Janvier 2012
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2012
    Messages : 15
    Par défaut Jeu de sudoku : problème dans mes classes Case Placement
    Bonjour,
    J'ai le même probleme a résoudre que dans cette discussion avec les même contrainte, j'ai 2 questions :
    - la class Placement permet de garder via une listeArray l'historique des placements et valeurs ,pourquoi avoir une class Case d'après vous ? Est ce pour avoir une historique par rapport a la cellule sans ?

    Pour Case j'ai trouvé cela mais je ne comprends pas la variable sqr et son calcul : this.sqr=(c/board.K)+board.K*(r/board.K);

    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
    public class Cell {
    	final public int col,row,sqr;
     
    	private int value;
    	private Board board;
     
    	public Cell(Board board,int r, int c, int v) {
    		this.board=board;
    		this.col=c; this.row=r;
    		this.sqr=(c/board.K)+board.K*(r/board.K);
    		this.setValue(v);
    	}
     
    	public boolean setNextPossibleValue() {
    		int currentvalue=this.value;
     
    		// unset current value (if any)
    		this.unsetValue();
     
    		// find and set the next value
    		for(int v=currentvalue+1;v<=board.N;v++) {
    			if (board.isLocked(this, v)) continue;
    			this.setValue(v);
    			return true;
    		}
     
    		return false;
    	}
     
    	public void setValue(int v) {
    		this.value=v;
    		board.setLock(this,true);
    	}
     
    	public void unsetValue() {
    		board.setLock(this,false);
    		this.value=0;
    	}
     
    	public int getValue() {
    		return this.value;
    	}
     
    }

    Merci

  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,

    Pour comprendre la formule, il faudrait qu'on sache ce que représente cette variable K (dont le nom est plutôt sybillin !). Il est probable qu'il s'agisse de déterminer dans quelle sous partie du plateau se trouve la case (un plateau du sudoku de 9x9 est souvent divisé en 9 blocs de 3x3).
    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
    Webmaster
    Inscrit en
    Janvier 2012
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2012
    Messages : 15
    Par défaut Problème Initiale :
    Problématique
    Vous poursuivez le mandat qui vous a été confié par la directrice de l’école Saint Pruneau, soit la conception d’un jeu de Sudoku. Dans ce mandat particulier, vous aurez à concevoir les classes associées au jeu de Sudoku et les méthodes qui s’y réfèrent, permettant d’accéder aux données de la grille, la manipulation de la grille et la validation d’une solution. Le fichier/classe tp2.java permettant de démarrer le logiciel devra se nommer tp4.java.

    Dans le cadre de ce travail pratique, vous aurez en prendre un certain nombre de décision dans la conception des classes, soit : Quelles méthodes doivent être abstraite ou non? À quel niveau doit se situer l’implémentation finale du code? Quel type de polymorphisme doit être utilisé? Veuillez utiliser les commentaires dans le code, pour justifier vos choix de conception pour chaque méthode créée !

    1-Créer des classes
    Le programme devra être développé autour de plusieurs classes soit :

    1-tn4.java permettant de démarrer le programme. Cette classe aura une méthode main qui devra faire comme actions :
    1 - Créer une instance de la classe Sudoku9x9;
    2 - Imprimer la grille de Sudoku original;
    3 - Imprimer le degré de difficulté de la grille;
    4 - Effectuer 10 placements;
    5 - Imprimer la grille de Sudoku suite aux placements;
    6 - Annuler 2 placements;
    7 - Imprimer la grille de Sudoku suite à l’annulation;
    18 - Valider la solution et imprimer le résultat de la validation.

    1-Sudoku.java, une classe abstraite représentant la notion abstraite de grille de Sudoku et des méthodes communes à tous les sous-types de grille de Sudoku. Elle aura donc comme attribut :
    1 - Une matrice de nombre entier (int[][]) représentant la grille de Sudoku
    2 - Une liste d’action de placement (Une ArrayList de classe Placement (voir plus bas))
    3 - Le degré de complexité de la grille (int)
    4 - L’attribut placement (int) indiquant le nombre de chiffre restant à placer dans la grille

    Elle aura comme méthodes abstraites ou non :

    1 - Initialiser une grille
    2 - Réinitialiser la grille (revenir à la grille de Sudoku originale) à l’aide de la liste de placements effectués. Vous devez concevoir la solution par vous-même!
    3 - Tester la validité de la solution (voir code en annexe)
    4 - Faire un placement (voir plus bas au point 5)
    5 - Annuler un placement (voir plus bas au point 5)
    6 - Méthodes get et set pour accéder aux attributs de classes (attention à la visibilité des méthodes, c.a.d. public, private, protected).
    7 - Imprimer la grille

    1- Sudoku9x9.java, une sous-classe de Sudoku.java qui implémente les méthodes spécifiques à un Sudoku9x9, soit :
    1 - Les sous-implémentations des méthodes abstraites de la classe Sudoku.java
    2 - Toutes autres méthodes nécessaires pour effectuer le mandat

    2- Case.java, une classe représentant une case de la grille. Cette classe sera utilisée par la méthode placement et annuler placement afin de garder un trace des actions sur la grille de jeu. À vous de déterminer quels sont ces attributs et méthodes pour répondre aux besoins de la problématique. À vous également de spécifier sa visibilité et de la justifier.

    1-Créer des appels de méthodes
    Au travers de votre conception orientée-objet, répondant à la problématique, les différentes instances de classes auront à interagir entre elles. Elles s’échangeront des appels de méthodes permettant de répondre aux besoins du mandat, soit (rappel du comportement de la classe tn4.java) :

    1 - Créer une instance de la classe Sudoku9x9;
    2 - Imprimer la grille de Sudoku original;
    3 - Imprimer le degré de difficulté de la grille;
    4 - Effectuer 10 placements;
    5 - Imprimer la grille de Sudoku suite aux placements;
    6 - Annuler 2 placements;
    7 - Imprimer la grille de Sudoku suite à l’annulation;
    8 - Valider la solution et imprimer le résultat de la validation.

    1-Faire et annuler des placements
    Grâce à la classe Case, il est possible de sauvegarder une trace des actions du joueur sur la grille. À l’aide de la méthode, fairePlacement, vous aurez à (1) effectuer le placement sur la grille; (2) sauvegarder le placement (c’est à dire l’instance de la classe Case) dans un structure de type ArrayList..

    À l’aide de la méthode annulerPlacement, vous aurez à (1) récupérer la dernière instance dans l’arraylist (en utilisant la méthode remove et la méthode size pour connaître le nombre d’élément) et (2) annuler le placement dans la grille.

    Pour plus d’information sur les ArrayList, aller à la page : http://docs.oracle.com/javase/7/docs...ArrayList.html (en anglais seulement).


    1-Code de validation de la grille Sudoku
    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
    public boolean validate() {
    // un tableau : int[][] board = new int[9][9]();
    // initialisation et actions sur le Sudoku
     
    //Vérifie les lignes et les colonnes 
    for (int i = 0; i < board.length; i++) {
    BitSet bsRow = new BitSet(9);
    BitSet bsColumn = new BitSet(9);
    for (int j = 0; j < board[i].length; j++) {
    if (board[i][j] == 0 || board[j][i] == 0) continue;
    if (bsRow.get(board[i][j] - 1) || bsColumn.get(board[j][i] - 1))
    return false;
    else {
    bsRow.set(board[i][j] - 1);
    bsColumn.set(board[j][i] - 1);
    }
    }
    }
     
      //Vérifie les quandrans (3x3)
    for (int rowOffset = 0; rowOffset < 9; rowOffset += 3) {
    for (int columnOffset = 0; columnOffset < 9; columnOffset += 3) {
    BitSet threeByThree = new BitSet(9);
    for (int i = rowOffset; i < rowOffset + 3; i++) {
    for (int j = columnOffset; j < columnOffset + 3; j++) {
    if (board[i][j] == 0) continue;
    if (threeByThree.get(board[i][j] - 1))
    return false;
    else
    threeByThree.set(board[i][j] - 1);
    }
    }  
    }
    }
    return true;
    }

  4. #4
    Membre averti
    Homme Profil pro
    Webmaster
    Inscrit en
    Janvier 2012
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2012
    Messages : 15
    Par défaut Suite..
    La grille est Sudoku9x9.
    Je ne vois pas l'utilité d'une classe Case et d'une classe Placement sauf si cela est pour un historique des placements et des valeurs.

    Merci

  5. #5
    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
    L'exercice demande de faire une classe Case : son utilité est déjà de répondre à la question. Ensuite, le sujet précise dans le paragraphe "Faire et annuler des placements", à quoi va servir cette classe Case.

    Par contre, le sujet ne parle pas de classe Placement.
    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.

  6. #6
    Membre averti
    Homme Profil pro
    Webmaster
    Inscrit en
    Janvier 2012
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2012
    Messages : 15
    Par défaut
    Merci oui tout a fait d'accord pas de Class Placement ....
    Par contre je ne comprend pas pourquoi on fait un grille de int et non une grille de Case

    L'énoncé par de : Une matrice de nombre entier (int[][]) représentant la grille de Sudoku
    int grille[][];

    serait il possible de faire une grille de Case ?
    Case grille[][];


    Une liste d’action de placement : Une ArrayList de classe Placement (voir plus bas))
    J'ai testé un peu les ArrayList...
    List<String> al = new ArrayList<String>();
    Et je ne vois pas encore qu'elle type mettre ou mettre une structure class dedans

    List<Placement> al = new ArrayList<Placement>();
    ou de Case ??


    4 - L’attribut placement (int) indiquant le nombre de chiffre restant à placer dans la grille
    En fait c'est juste le nombre de 0 dans la grille ??


    Merci

Discussions similaires

  1. [numpy] problème dans mes imports
    Par Kuroro dans le forum Calcul scientifique
    Réponses: 1
    Dernier message: 28/05/2007, 23h07
  2. [débutant]remarques dans mes class
    Par pingoui dans le forum Langage
    Réponses: 4
    Dernier message: 17/02/2007, 20h26
  3. problème dans mes études
    Par étudiant en galère.. dans le forum Etudes
    Réponses: 6
    Dernier message: 29/10/2006, 13h33
  4. Problème dans une Classe
    Par Orbix dans le forum Langage
    Réponses: 8
    Dernier message: 02/10/2006, 14h52
  5. [DAO] Comment gérer les liens avec la bdd dans mes classes?
    Par Wormus dans le forum Autres
    Réponses: 6
    Dernier message: 22/02/2006, 16h14

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