Le jeu du morpion en java
Fermé
joseph.t
-
Modifié le 26 juin 2017 à 10:30
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 - 26 juin 2017 à 11:21
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 - 26 juin 2017 à 11:21
A voir également:
- Super morpion
- Super copier - Télécharger - Gestion de fichiers
- Pc super lent - Guide
- Super zoom google maps - Guide
- Super email validator v43 - Télécharger - Mail
- Super screen recorder - Télécharger - Capture d'écran
2 réponses
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 019
Modifié le 26 juin 2017 à 10:12
Modifié le 26 juin 2017 à 10:12
Bonjour,
La structure de tableau c'est pour éviter d'avoir du code répétitif comme tes
Heureusement que tu ne fais pas un puissance 4...
Il est plus pertinent de faire un tableau de cases, à deux dimensions, pour représenter ta grille 3x3, tu n'a alors qu'une seule variable à manipuler.
Remarque : le choix du JButton n'est pas forcément le plus judicieux, un Component personnalisé avec des attributs personnalisé relatif à l'état de la case serait plus pertinent.
De plus la manière dont tu as fait ton ActionListener est pas terrible, il vaut mieux avoir un Listener dédié à chaque case, plutôt qu'un Listener commun obligé de calculer à quel composant il appartient.
PS. une fois une valeur choisie (rond ou carré) pour une case on ne peut pas la remplacer par une autre, il faudra désactiver cette possibilité.
La confiance n'exclut pas le contrôle
La structure de tableau c'est pour éviter d'avoir du code répétitif comme tes
case1, case2, case3, case4, case5, case6, case7, case8, case9;
Heureusement que tu ne fais pas un puissance 4...
Il est plus pertinent de faire un tableau de cases, à deux dimensions, pour représenter ta grille 3x3, tu n'a alors qu'une seule variable à manipuler.
JButton[][] cases = new JButton[3][3];
Remarque : le choix du JButton n'est pas forcément le plus judicieux, un Component personnalisé avec des attributs personnalisé relatif à l'état de la case serait plus pertinent.
De plus la manière dont tu as fait ton ActionListener est pas terrible, il vaut mieux avoir un Listener dédié à chaque case, plutôt qu'un Listener commun obligé de calculer à quel composant il appartient.
PS. une fois une valeur choisie (rond ou carré) pour une case on ne peut pas la remplacer par une autre, il faudra désactiver cette possibilité.
La confiance n'exclut pas le contrôle
Tout d'abord, merci pour votre réponse rapide. Que voulez-vous dire par "De plus la manière dont tu as fait ton ActionListener est pas terrible, il vaut mieux avoir un Listener dédié à chaque case, plutôt qu'un Listener commun obligé de calculer à quel composant il appartient. " ? Il faut une classe ButtonListener pour chaque bouton? Désolé, on commence à peine la partie graphique de java avec les boutons et les listener, donc je suis pas encore super calé...
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 019
Modifié le 26 juin 2017 à 11:22
Modifié le 26 juin 2017 à 11:22
"il vaut mieux avoir un Listener dédié à chaque case, plutôt qu'un Listener commun obligé de calculer à quel composant il appartient"
Cela signifie que tu n'auras pas à faire
En effet, le Listener sera lié à un seul bouton, par exemple la case 4, donc il n'y a pas besoin de tester quelle est la source pour savoir quoi faire avec tel ou tel bouton, ce sera toujours la case 4 qui sera associé à ce bouton, donc tous les traitements ne concerneront que ce bouton et on n'a pas à s'occuper des autres.
"Il faut une classe ButtonListener pour chaque bouton?"
Non, juste un objet différent, mais ça peut être la même classe - qui ne s'occupera que d'un seul bouton.
Ci-dessous un exemple de code corrigé, ça fait toujours plus ou moins la même chose, mais avec des pratiques différentes.
Cela signifie que tu n'auras pas à faire
JButton b1 = (JButton)e.getSource(); if(Joueur){ if (b1==case1 || b1==case2 || b1==case3 || b1==case4 || b1==case5 || b1==case6 || b1==case7 || b1==case8 || b1==case9){
En effet, le Listener sera lié à un seul bouton, par exemple la case 4, donc il n'y a pas besoin de tester quelle est la source pour savoir quoi faire avec tel ou tel bouton, ce sera toujours la case 4 qui sera associé à ce bouton, donc tous les traitements ne concerneront que ce bouton et on n'a pas à s'occuper des autres.
"Il faut une classe ButtonListener pour chaque bouton?"
Non, juste un objet différent, mais ça peut être la même classe - qui ne s'occupera que d'un seul bouton.
Ci-dessous un exemple de code corrigé, ça fait toujours plus ou moins la même chose, mais avec des pratiques différentes.
import java.awt.*; import javax.swing.*; public class Morpion extends JFrame { private final Case[][] cases; private boolean joueur = false; public Morpion() { super("Morpion"); setSize(300, 300); setLocationRelativeTo(null); setDefaultCloseOperation(EXIT_ON_CLOSE); setLayout(new GridLayout(3, 3)); cases = new Case[3][3]; for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { add(cases[i][j] = new Case()); } } setVisible(true); } private void choixCase(Case c) { if (c.getEtat() != Etat.VIDE) { return; } c.setEtat(joueur ? Etat.ROND : Etat.CROIX); joueur = !joueur; for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { if (cases[i][j].getEtat() == Etat.VIDE) { return; } } } JOptionPane.showMessageDialog(this, "Partie terminée !"); for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { cases[i][j].setEtat(Etat.VIDE); } } } private enum Etat { VIDE, ROND, CROIX }; private class Case extends JButton { private Etat etat; public Case() { setEtat(Etat.VIDE); addActionListener(e -> choixCase(this)); } public Etat getEtat() { return etat; } public void setEtat(Etat etat) { this.etat = etat; switch (etat) { case VIDE: setText(""); setBackground(Color.LIGHT_GRAY); break; case ROND: setText("O"); setBackground(Color.ORANGE); break; case CROIX: setText("X"); setBackground(Color.PINK); break; } } } public static void main(String[] args) { new Morpion(); } }