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

Java Discussion :

Comment fermer la 2ième fenêtre seulement


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2013
    Messages : 6
    Par défaut Comment fermer la 2ième fenêtre seulement
    Salut,
    voici mon problème, je fait un jeu de taquin pour me pratiquer avec java,
    j'ai une première fenêtre qui s'ouvre avec 4 boutons pour le choix du jeu, 4X4 ou autre format de grille, en cliquant sur un bouton une deuxième fenêtre s'ouvre pour jouer le jeu.

    Si j'écris le code ainsi pour fermer la deuxième fenêtre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fen1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    Je ferme les 2 fenêtres et c'est pas ce que je veux, et comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fen1.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    La 2ième fenêtre ferme seul, c'est bon oui, mais le problème c'est losque je clique pour rejouer sur un bouton de la première fenêtre, le jeu plante et voici l'erreur que ça donne losque je joue 3X3 en premier:
    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
    Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    	at claude.mcdo.CoeurTaquin3X3.melanger(CoeurTaquin3X3.java:59)
    	at claude.mcdo.Image3X3.jouer(Image3X3.java:40)
    	at claude.mcdo.Image3X3.<init>(Image3X3.java:35)
    	at claude.mcdo.ChoixJeu$5.actionPerformed(ChoixJeu.java:86)
    	at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
    	at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)
    	at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
    	at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
    	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
    	at java.awt.Component.processMouseEvent(Component.java:6505)
    	at javax.swing.JComponent.processMouseEvent(JComponent.java:3311)
    	at java.awt.Component.processEvent(Component.java:6270)
    	at java.awt.Container.processEvent(Container.java:2229)
    	at java.awt.Component.dispatchEventImpl(Component.java:4861)
    	at java.awt.Container.dispatchEventImpl(Container.java:2287)
    	at java.awt.Component.dispatchEvent(Component.java:4687)
    	at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
    	at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492)
    	at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
    	at java.awt.Container.dispatchEventImpl(Container.java:2273)
    	at java.awt.Window.dispatchEventImpl(Window.java:2719)
    	at java.awt.Component.dispatchEvent(Component.java:4687)
    	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:735)
    	at java.awt.EventQueue.access$200(EventQueue.java:103)
    	at java.awt.EventQueue$3.run(EventQueue.java:694)
    	at java.awt.EventQueue$3.run(EventQueue.java:692)
    	at java.security.AccessController.doPrivileged(Native Method)
    	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
    	at java.awt.EventQueue$4.run(EventQueue.java:708)
    	at java.awt.EventQueue$4.run(EventQueue.java:706)
    	at java.security.AccessController.doPrivileged(Native Method)
    	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    	at java.awt.EventQueue.dispatchEvent(EventQueue.java:705)
    	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
    	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
    	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
    	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
    	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
    	at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)
    Il faut surement libérer la mémoire pour repartir un jeu, j'ai beau fouillé sur le web, mais je n'ai rien trouvé.

    merci d'avance pour vos reponse.

  2. #2
    Membre chevronné Avatar de florentB
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2006
    Messages
    332
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Décembre 2006
    Messages : 332
    Par défaut
    tu as un soucis sur l'utilisation d'un objet (qui est initialisé la première fois puis null lors du deuxième accès).
    Suis ta stacktrace, tu as l'information.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2013
    Messages : 6
    Par défaut
    Tu as raison, mais je voie pas comment le detruire.

    Voici l'objet en question:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private CoeurTaquin3X3 coeur = new CoeurTaquin3X3();

  4. #4
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Juillet 2012
    Messages
    200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Bénin

    Informations forums :
    Inscription : Juillet 2012
    Messages : 200
    Par défaut
    Hello. serait-il possible de voir le code dans son ensemble? Je ne pense pas qu'on puisse t'aider avec ce que tu nous a montrés.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2013
    Messages : 6
    Par défaut
    La classe pour le choix du jeu..
    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
    public class ChoixJeu {
     
    	private JFrame fen = new JFrame("Taquin");
    	private JPanel centre;
    	private Image taquinFond;
     
    	// constructeur
    	ChoixJeu() {
    		 fenetre();
    	}
     
    	private void fenetre() {
     
    		// Création du premier calque 
    		JLayeredPane calque1 = new JLayeredPane(); 
            calque1.setPreferredSize(new Dimension(360,360));  // Dimension du centre de la fenêtre
     
            // Bloc pour afficher l'image
    		JPanel centre = new JPanel() {
    			public void paint(Graphics g) {
    				ImageIcon image = new ImageIcon(this.getClass().getResource("images/taquinFond.png"));
    				taquinFond = image.getImage();
    				Graphics2D g2d = (Graphics2D) g;
    				g2d.drawImage(taquinFond,  0,  0, null);
    			}
    		};
     
    		// Ancrage du premier calque
    		centre.setBounds(0, 0, 360, 360);       // Point de départ et dimension du premier calque
    		calque1.add(centre, new Integer(0));
     
    		// Creation du second calque
    		JPanel calque2 = new JPanel();
     
    		// Premier bouton
    		JButton b1 = new JButton("<html>Niveau difficile<br>Image 5 X 5</html>");
    		b1.setPreferredSize(new Dimension(160, 50));
    		b1.addActionListener(new ActionListener() {
    			public void actionPerformed(ActionEvent e) {
    				new Image5X5();
    			}
    		});
    		calque2.add(b1);
     
    		// Deuxième bouton
    		JButton b2 = new JButton("<html>Niveau moyen<br>Taquin classique</html>");
    		b2.setPreferredSize(new Dimension(160, 50));
    		b2.addActionListener(new ActionListener() {
    			public void actionPerformed(ActionEvent e) {
    				new TaquinClassique();
    			}
    		});
    		calque2.add(b2);
     
    		// Troisième bouton
    		JButton b3 = new JButton("<html>Niveau moyen<br>Image 4 X 4</html>");
    		b3.setPreferredSize(new Dimension(160, 50));
    		b3.addActionListener(new ActionListener() {
    			public void actionPerformed(ActionEvent e) {
    				new Image4X4();
    			}
    		});
    		calque2.add(b3);
     
    		// Quatrième bouton
    		JButton b4 = new JButton("<html>Niveau facile<br>Image 3 x 3</html>");
    		b4.setPreferredSize(new Dimension(160, 50));
    		b4.addActionListener(new ActionListener() {
    			public void actionPerformed(ActionEvent e) {
    				new Image3X3();
    			}
    		});
    		calque2.add(b4);
     
    		// Ancrage du second calque avec transparence
    		calque2.setBounds(100,60,160,220);         // Point de départ et dimension du deuxième calque
    		calque2.setOpaque(false);
     
    		// Fusionnement des 2 calques pour l'affichage
    		calque1.add(calque2,new Integer(1));
     
    		// Création de la fenêtre principale
    		fen.add(calque1);
    		fen.setLocationRelativeTo(null);
    		fen.setResizable(false);
    		fen.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            fen.pack();
            fen.setVisible(true);
    	}
     
    	JPanel getCentre() {
    		return centre;
    	}
     
    }
    La classe qui gère le tableau, permet de faire une liste à 2 dimensions et qui est appelé par la classes CoeurTaquin soit 3X3, 4X4 ou encore 5X5.
    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
    import java.awt.image.BufferedImage;
     
    public class Case {
     
    	private static int nbrCases = 0;
    	private int noCase;
    	private BufferedImage img = null;
     
    	Case() {
     
    		nbrCases ++;
    		noCase = nbrCases;
    	}
     
    	int getNoCase() {
    		return noCase;
    	}
     
    	void setImage(BufferedImage i) {
    		img = i;
    	}
     
    	BufferedImage getImage() {
    		return img;
    	}
     
    }
    La classe pour gèrer les déplacements, mélanger les cases, etc.
    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
    137
    138
    139
    140
    141
     
    public class CoeurTaquin3X3 {
     
     
    	public int dimX = 3;                             // Dimension horizontal
    	public int dimY = 3;                             // Dimension vertical
    	private int noCaseVide = dimX * dimY;            // Case vide en bas à droite
    	private Case[][] coeur = new Case[dimX][dimY];   // Tableau à 2 dimensions
     
     
     
    	CoeurTaquin3X3() {
     
    		remplirTableau();  // Construction du tableau
    	}
     
     
     
    	// Remplir le tableau à 2 dimensions
    	private void remplirTableau() {
     
    		for ( int i=0; i<dimX; i++)
    			for ( int j=0; j<dimY; j++) {
    				coeur[i][j] = new Case();
    			}
    	}
     
    	// Retour des nombres dans les cases du tableau
    	int getNumeroCase(int i, int j) {
    		return coeur[i][j].getNoCase();
    	}
     
    	// Déplace la case blanche pour mélanger le jeu, permet de le réussir à tout coup
    	void melanger(int nbrFois) {
     
    		Point nord = new Point(0,-1);
    		Point sud = new Point(0,1);
    		Point est = new Point(1,0);
    		Point ouest = new Point(-1,0);
    		Point posCaseVide = trouver(noCaseVide);
    		Point posNouvelle = new Point();
    		Random random = new Random();
     
    		for (int i=0; i<nbrFois; i++) {
     
    			int r = random.nextInt(4);
     
    			switch (r) {
    			case 0:
    				posNouvelle.x = posCaseVide.x+nord.x;
    				posNouvelle.y = posCaseVide.y+nord.y;
    				break;
    			case 1:  
    				posNouvelle.x = posCaseVide.x+sud.x;
    				posNouvelle.y = posCaseVide.y+sud.y;
    				break;
    			case 2:  
    				posNouvelle.x = posCaseVide.x+est.x;
    				posNouvelle.y = posCaseVide.y+est.y;
    				break;
    			case 3:  
    				posNouvelle.x = posCaseVide.x+ouest.x;
    				posNouvelle.y = posCaseVide.y+ouest.y;
    				break;
    			}
     
    			Point temp = swap(posCaseVide, posNouvelle);
    			posCaseVide.x = temp.x;
    			posCaseVide.y = temp.y;
    		}
    	}
     
    	// Mémoire tampon des cases
    	private Point swap(Point vide, Point nouv) {
     
    		if(nouv.x >= 0 && nouv.x < dimX && nouv.y >= 0 && nouv.y < dimY) {
    			Case temp = coeur[vide.y][vide.x];
    			coeur[vide.y][vide.x]= coeur[nouv.y][nouv.x];
    			coeur[nouv.y][nouv.x]= temp;
    			return nouv;
    		}
    		return vide;
    	}
     
    	// Échange la case cliquer avec la case vide
    	boolean echanger(int choix) {
     
    		if (choix < 1 || choix > noCaseVide-1) {
    			return false;
    		}
    		Point posChoix = trouver(choix);
    		Point posZero = trouver(noCaseVide);
     
    		if (posChoix.x == posZero.x-1 && posChoix.y == posZero.y || 
    				posChoix.x == posZero.x+1 && posChoix.y == posZero.y ||
    				posChoix.x == posZero.x && posChoix.y == posZero.y-1 || 
    				posChoix.x == posZero.x && posChoix.y == posZero.y+1) {
     
    				swap(posChoix, posZero);
    		}
    		return true;
    	}
     
    	// Trouve la case vide
    	Point trouver(int n) {
     
    		Point p = null;
    		for (int i=0; i<dimX; i++) {
    			for (int j=0; j<dimY; j++) {
    				if (coeur[i][j].getNoCase() == n) {
    					p = new Point(j,i);
    					return p;
    				}
    			}
    		}
    		return p;
    	}
     
    	// Vérifie si les numéro des cases sont en ordre
    	boolean enOrdre() {
     
    		for (int i=0; i<dimX; i++) {
    			for (int j=0; j<dimY; j++) {
     
    				if (coeur[i][j].getNoCase() != i*dimY+j+1) {
    					return false;
    				}
    			}
    		}
    		return true;
    	}
     
    	void setImageCase(int i, int j, BufferedImage img) {
    		coeur[i][j].setImage(img);
    	}
     
    	BufferedImage getImageCase(int i, int j) {
    		return coeur[i][j].getImage();
    	}
     
    }
    La classe qui contôle l'affichage
    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
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    public class Image3X3 {
     
    	public int dimX = 3;
    	public int dimY = 3;
    	JFrame fen1 = new JFrame("Image 3X3");
    	JPanel centre = new JPanel();
    	private CoeurTaquin3X3 coeur = new CoeurTaquin3X3();
    	private int nbrBouton = dimX*dimY;
    	private JButton[] bouton = new JButton[nbrBouton];
    	private int nbrFois = 1000;
    	private String refImage = "images/bugs.png";
    	private String refBlanc = "images/blanc1.png";
    	private BufferedImage bufferedImage = null;
    	private BufferedImage bufferedBlanc = null;
    	int hauteurFen = 370;
    	int largeurFen = 350;
    	int coupJouer = 0;
     
     
    	Image3X3() {
     
    		fenetre();
    		jouer();
    	}
     
    	void jouer() {
    		ouvreImage();
    		coeur.melanger(nbrFois);
    		dessiner();
     
     
     
    	}
     
     
    	// Ouvre les images
    	private void ouvreImage() {
     
    		try {
    			bufferedImage = ImageIO.read(this.getClass().getResource(refImage));
    		}
    		catch (Exception e) {
    			e.printStackTrace();
    		}
    		try {
    			bufferedBlanc = ImageIO.read(this.getClass().getResource(refBlanc));
    		}
    		catch (Exception e) {
    			e.printStackTrace();
    		}
     
    		// Calcule la dimension d'une icone, carré d'image
    		int hauteurIcone = bufferedImage.getHeight()/dimX;
    		int largeurIcone = bufferedImage.getWidth()/dimY;
     
    		// Sépare l'image en icones et l'incorpore dans chaque case du tableau
    		for (int i=0; i<dimX; i++) {
    			for (int j=0; j<dimY; j++) {
    				int noCase = coeur.getNumeroCase(i,j);
    				if (noCase == nbrBouton) {
    					coeur.setImageCase(i, j, bufferedBlanc);
    				}
    				else {
    					coeur.setImageCase(i, j, bufferedImage.getSubimage(i*hauteurIcone, j*largeurIcone,largeurIcone,hauteurIcone));
    				}
    			}
    		}
    	}
     
    	void dessiner() {
     
    		int k = 0;
    		for (int i=0; i<dimX; i++) {
    			for (int j=0; j<dimY; j++) {
     
    				// Met les boutons dans une liste
    				bouton[k] = new JButton();
     
    				// Pour chaque bouton, on met un écouteur d'évènement
    				bouton[k].addActionListener(new ActionListener() {
    					@Override
    					public void actionPerformed(ActionEvent e) {
     
    						// Détermine quel bouton a été cliqué
    						Object source = e.getSource();
    						JButton bou = (JButton)source;
     
    						// Obtient et nettoie le text du bouton
    						String texte = bou.getName().trim();
     
    						// Si le texte est un nombre, on l'échange avec la case vide
    						if (unNombre(texte)) {
     
    							// Appel de la méthode echanger de la classe CoeurTaquin et transforme le texte en nombre
    							if (coeur.echanger(Integer.parseInt(texte))) {
     
    								coupJouer ++;       // Compte le nombres de clic de souris
     
    								remplirBoutons();   // Réaffiche les boutons
    							}
    						}
    						// Appel de la méthode enOrdre de la classe CoeurTaquin
    						if (coeur.enOrdre()) {
    							remplirBoutons();
     
    							JOptionPane.showMessageDialog(fen1, "             Bravo!\n" +
    									                                "   Vous avez réussi!\n" +
    									                                "  Coups joués = "+coupJouer);
    						}
    					}
    				});
     
    				// Ajout des boutons au centre la la fenêtre
    				centre.add(bouton[k]);
    				k++;
    			}
     
    		}
    		remplirBoutons();
     
    	}
     
    	// Met sur les boutons les numéros de case et les fragments d'image
    	private void remplirBoutons() {
    		int k = 0;
    		for (int i=0; i<dimX; i++) {
    			for (int j=0; j<dimY; j++) {
     
    				// Obtient le numéro de la case et on le met dans le bouton
    				int noCase = coeur.getNumeroCase(j, i);
    				if (noCase == nbrBouton) {
    					bouton[k].setName(" ");
    				}
    				else {
    					bouton[k].setName(String.valueOf(noCase));
    				}
     
    				// Met un fragment sur caque bouton à partir de la classe CoeurTaquin
    				bouton[k].setIcon(new ImageIcon(coeur.getImageCase(j, i)));
    				k++;
    			}
    		}
    	}
     
    	// Vérifie si c'est un nombre
    	public static boolean unNombre(String s) {
    		try {
    			Integer.parseInt(s);
    		}
    		catch(NumberFormatException e) {
    			return false;
    		}
    		return true;
    	}
     
    	// Création de la fenêtre
    	private void fenetre() {
     
    		centre.setLayout(new GridLayout(3, 3, 0, 0));
     
     
    		fen1.setSize(largeurFen, hauteurFen);
    		fen1.setLocationRelativeTo(null);
    		fen1.setResizable(false);
    		fen1.setVisible(true);
    		fen1.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    		fen1.add(centre);	
    	}
    }
    Voici les principales classes, et merci de m'aider

  6. #6
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Juillet 2012
    Messages
    200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Bénin

    Informations forums :
    Inscription : Juillet 2012
    Messages : 200
    Par défaut
    Je psense qu'il y a deux possibles raison au problème :

    1.
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public class Case {
     
    	private static int nbrCases = 0;
    	private int noCase;
    	private BufferedImage img = null;
     
    	Case() {
     
    		nbrCases ++;
    		noCase = nbrCases;
    	}
    Dans le constructeur de la classe Case, tu incrémentes nbrCase à chaque instanciation d'un nouvel objet. Si on lance le jeu une première fois et que les case sont toutes créées, nbrcase vaudra 9. Si l'utilisateur mélange seconde fois nbrCase vaudra donc 10, 11, 12, ... Or Le numéro max pour une case est 9. Donc quand l'utilisateur mélange tu dois donc remettre à 0 ce compteur. Tu peux créer une fonction publique statique dans la classe Case pour cela.

    2. dans la classe CoeurTaquin3X3 tu fais
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public class CoeurTaquin3X3 {
    	public int dimX = 3;                             // Dimension horizontal
    	public int dimY = 3;                             // Dimension vertical
    	private int noCaseVide = dimX * dimY;            // Case vide en bas à droite
    	private Case[][] coeur = new Case[dimX][dimY];   // Tableau à 2 dimensions
    La variable noCaseVide vaut alors 9.
    Ensuite dans la fonction CoeurTaquin3X3.melanger() tu fais appel à
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Point posCaseVide = trouver(noCaseVide);
    Le code de trouver() est le suivant :
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Point trouver(int n) {
    		Point p = null;
    		for (int i=0; i<dimX; i++) {
    			for (int j=0; j<dimY; j++) {
    				if (coeur[i][j].getNoCase() == n) {
    					p = new Point(j,i);
    					return p;
    				}
    			}
    		}
    		return p;
    	}
    Il est possible que la fonction trouver renvoie null, ce qui poserait l'exception quand plus tard tu en fais usage dans melanger().

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

Discussions similaires

  1. Réponses: 11
    Dernier message: 20/09/2007, 14h51
  2. Comment fermer une fenêtre dynamique avec onclose
    Par nopnop dans le forum Delphi
    Réponses: 23
    Dernier message: 18/07/2006, 18h08
  3. Comment fermer une fenêtre enfant MDI ?
    Par DeveloMagaly dans le forum Composants VCL
    Réponses: 2
    Dernier message: 30/09/2005, 13h10
  4. Comment fermer une fenêtre quand la souris et clavier sont inactifs ?
    Par Goldenkiller dans le forum Composants VCL
    Réponses: 7
    Dernier message: 06/12/2004, 22h09
  5. [MDI] comment fermer la bonne fenêtre enfant ?
    Par KThrax dans le forum Langage
    Réponses: 5
    Dernier message: 01/09/2002, 09h42

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