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

AWT/Swing Java Discussion :

Bataille navale avec interface graphique.


Sujet :

AWT/Swing Java

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2017
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2017
    Messages : 22
    Par défaut Bataille navale avec interface graphique.
    Bonjour,

    Dans le cadre de ma deuxième année de prépa intégrée, je dois réaliser une bataille navale avec interface graphique (j'ai sélectionné SWING) avec un mode de jeu contre l'ordinateur. Globalement, j'ai saisi comment développer à peu près toutes les fonctionnalités telles que le placement des bateaux, les tirs etc. J'ai pris le parti de créer une classe Case contenant des JButton afin d'exploiter les interactions des JButton par la suite (la classe est jointe ci-dessous).

    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
     package bataillenavale;
     
    import javax.swing.JButton;
     
    /**
     *
     * @author Utilisateur
     */
    public class Case {
        private JButton button;
        private final int x;
        private final int y;
        protected int valeur;
     
        public Case(int x0, int y0){
            x=x0;
            y=y0;
            button = new JButton("0");
        }
     
    }
    J'aimerai donc réussir à afficher une grille de dimension 10 x 10 composée de Cases. Cependant, je n'arrive pas à ajouter lesdites Cases au sein d'un JPanel pour les afficher. Sauriez-vous m'aider ? Je vous joins le code, qui bloque au niveau de la ligne 30. J'ai vraiment besoin de me sortir de ce problème afin de pouvoir avancer sur le reste du problème.

    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
    package bataillenavale;
     
    import java.awt.BorderLayout;
    import java.awt.GridLayout;
    import java.util.ArrayList;
    import javax.swing.JPanel;
     
    /**
     *
     * @author Utilisateur
     */
    public class Plateau {
        private JPanel affichage;
     
        public Plateau(){
            JPanel grille = new JPanel();
            affichage = new JPanel();
            affichage.setLayout(new BorderLayout());
            ArrayList<Case> listecases = new ArrayList();
            grille = new JPanel();
            grille.setLayout(new GridLayout(11,11));
            for(int i=0;i<11;i++){
                for(int j=0;j<11;j++){
                    listecases.add(new Case(i,j));
                    grille.add(listecases);
                }
     
            }
        }
    }
    En vous remerciant.

  2. #2
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Tu as oublié d'ajouter le JPanel "grille" dans le JPanel "affichage".

    Sinon, c'est une très mauvaise pratique de placer pleins de JButton comme ça. Il est préférable d'afficher une image (BufferedImage) et de gérer complètement les interactions souris en fonction de sa position sur l'image. Le code sera plus simple et l'interface plus souple.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  3. #3
    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 : 56
    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 n'y a pas que le problème de l'ajout de la grille dans le panel affichage (si tant est que ce dernier est bien mis lui-même dans une fenêtre).

    Personnellement, je préfère également faire ce genre d'interface en Java2D + images, parce que ça permet de faire quelque chose de plus joli et plus souple, mais si tu veux continuer avec des composants Swing, il faut penser qu'un Conteneur Swing (Container) ne peut contenir que des Composants Swing (classe JComponent au moins).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    JPanel grille = new JPanel();  // grille est un JPanel
    /**...**/
    ArrayList<Case> listecases = new ArrayList(); // listecases est une liste de Case (d'ailleurs ce serait plus propre de faire List<Case> listecases = new ArrayList<>(), ne serait-ce déjà pour éviter le warning (les chevrons à droite) et pour parce que je ne pense pas que tu aies besoin de traiter ta liste spécifiquement comme une ArrayList (l'interface List est suffisante pour la manipulation)
    grille = new JPanel(); // on récrée un nouveau panel qui remplace le précédent : cette ligne est inutile
    /**...**/
     
    for(int i=0;i<11;i++){
                for(int j=0;j<11;j++){
                    listecases.add(new Case(i,j)); // on ajoute une instance de Case dans la liste
                    grille.add(listecases); // on ajoute la liste d'instances de Case dans un JPanel : il n'existe aucune méthode qui permettent d'ajouter une liste de Case (qui n'est pas un composant Swing en plus) dans un JPanel : ça ne compile donc pas
                 }       
    }
    C'est le bouton qui se trouve référencé dans la variable button de l'instance de Case qu'il faudrait ajouter à la grille (donc avoir un accesseur), pas la liste de cases, genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for(int i=0;i<11;i++){
                for(int j=0;j<11;j++){
                    Case lacase = new Case(i,j);
                    listecases.add(lacase); // on ajoute une instance de Case dans la liste
                    grille.add(lacase.getButton()); // par exemple, si tu ajoutes une méthode JButton getButton() dans Case, qui fait return button
                 }       
    }
    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.

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2017
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2017
    Messages : 22
    Par défaut
    Je vais essayer de me pencher du coup sur l'idée d'utiliser des images.

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2017
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2017
    Messages : 22
    Par défaut
    Pour être honnête, j'ai fais pas mal de recherches et je n'arrive pas à m'en sortir pour le moment. Sauriez-vous m'aider pour une exemple de grille créée comme ce dont vous parlez ?
    Actuellement, je me retrouve avec une grille de Jbutton qui affichent des images, mais je me retrouve confrontés aux problèmes de base et j'ai du mal à visualiser comment récupérer une valeur et la position "derrière" un bouton. J'aurais besoin d'aiguillage, pour être honnête.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public class Plateau extends JPanel{
     
        public Plateau(){
            this.setSize(100,100);
            this.setLayout(new GridLayout(10,10));
            for(int j=1;j<101;j++){  
               this.add(new JButton(new ImageIcon("C:\\Users\\Utilisateur\\Pictures\\grille_vide.jpg")));
            }
     
        }
        public void ActionPerform(ActionEvent e){
            System.out.println(this.getLocation());
        }
    }
    Merci beaucoup encore ...

  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 : 56
    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,

    Premièrement, pour détecter une action sur le bouton, il faut un ActionListener :

    1. A l'ancienne par classe :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      button.addActionListener( une classe qui implémente l'interface ActionListener )
    2. Par expression lambda
      [CODE]button.addActionListener( event-> "un appel de méthode" )


    Dans les deux cas, une méthode sera implémentée : cette méthode doit pouvoir savoir quelle case de la grille a été sollicitée. Il faut donc un moyen de le faire. On peut gérer ça via une classe qui représente la classe, ou soit simplement avec des paramètres. Tout d'abord, il est toujours plus simple de gérer des index compris entre 0 et un max inclus. Les formules sont plus simples, les tests aussi.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    final Icon grillevideicon = new ImageIcon("C:\\Users\\Utilisateur\\Pictures\\grille_vide.jpg"); // ici il sera préférable d'utiliser une ressource plutôt qu'un fichier
    final int size = 10;
    this.setLayout(new GridLayout(size,size)); // le GridLayout n'est pas forcément le meilleur choix, parce que la grille s'étend dans tout le composant (un GridBagLayout serait préférable je pense)
    for(int j=0,max=size*size;j<max;j++){  
               this.add(new JButton(grillevideicon));
    }
    Ensuite, partont sur principe d'une méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    private void caseClick(JButton button, int x, int y) {
    }
    On récupère le bouton ce qui permettra éventuellement de changer son état (changer l'icône par exemple). Et on récupère les coordonnées de la case, x pour les colonnes, y pour les lignes.

    Les formules pour passer d'un index j de 0 à max-1 à des coordonnées dans une grille sont simples :
    • y = j/nombre de colonnes
      la division étant entière, on obtient bien le numéro de ligne, de 0 à nombre de lignes-1
    • x = j%nombre de colonnes
      le reste de la division entière est le numéro de colonne, de à nombre de colonnes - 1
    • on retrouve j à partir de x et y : j = y*nombre de colonnes + x


    Donc on peut écrire :

    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
    public class Plateau extends JPanel{
     
        private static final int SIZE = 10; // nombre de lignes et colonnes
     
        public Plateau() {
            this.setSize(100,100); // ça ne sert à rien si le panel est géré par un Layout Manager (sauf exception, comme avec certains layout absolu)
            final Icon grillevideicon = new ImageIcon("C:\\Users\\Utilisateur\\Pictures\\grille_vide.jpg"); // ici il sera préférable d'utiliser une ressource plutôt qu'un fichier
            this.setLayout(new GridLayout(SIZE,SIZE)); // le GridLayout n'est pas forcément le meilleur choix, parce que la grille s'étend dans tout le composant (un GridBagLayout serait préférable je pense)
            for(int j=0,max=SIZE*SIZE;j<max;j++){  
               JButton button = new JButton(grillevideicon);
               button.addActionListener(event->caseClick(button, j/SIZE, j%SIZE);
               this.add(button);
            }
     
        }
        private void caseClick(JButton button, int x, int y) {
            // là tu mets le code à exécuter quand on clique sur la case
            System.out.println("Vous avez cliqué la case colonne="+x+", ligne="+y+".");
        }
    }
    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.

  7. #7
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2017
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2017
    Messages : 22
    Par défaut
    Bonjour.

    Déjà merci pour ta réponse rapide, je reverrais le point du GridLayout. J'ai voulu tester ton code pour le prendre en main, mais une erreur a lieu ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    button.addActionListener(event->caseClick(button, j/SIZE, j%SIZE));
    Il y'aura un problème de variable locale, saurais-tu me l'expliquer ?

    Encore une fois, merci beaucoup.

  8. #8
    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 : 56
    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
    Citation Envoyé par SoulHokib Voir le message
    Il y'aura un problème de variable locale, saurais-tu me l'expliquer ?
    Ah, oui, le souci c'est avec j qui n'est pas effectivement final : on ne peut pas utiliser de variable non final dans une expression lambda. Ecris :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for(int j=0,max=SIZE*SIZE;j<max;j++){  
               JButton button = new JButton(grillevideicon);
               int x=j/SIZE;
               int y=j%SIZE;
               button.addActionListener(event->caseClick(button, x, y));
               this.add(button);
            }
    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.

  9. #9
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2017
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2017
    Messages : 22
    Par défaut
    Bien, merci beaucoup, je vais tester tout ça et essayer de me dépatouiller pour le reste !

  10. #10
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2017
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2017
    Messages : 22
    Par défaut
    Bonjour !

    J'explore peu à peu les possibilités du button, mais j'ai dû mal à saisir ce que tu m'as aidé à réaliser. Concrètement, j'ai trouvé la fonction qui permet de mettre à jour l'icône du bouton. Cependant, dans le "caseClick", j'ai ajouté un champ "value", qui est la valeur que je souhaite octroyer au bouton pour me permettre de faire des comparaisons (0 = case non touchée, 1 = case touchée mais vide, 2 = case touchée avec bateau, etc ...). Je l'ai initialisé à la suite des coordonnées, mais j'ai du mal à saisir ce que je devrais écrire dans le "caseClick" pour pouvoir mettre à jour la valeur de la case, dois-je me servir du "getAccessibleContent()" ?

    Je vous fais parvenir le code que j'ai à peine modifier, n'ayant que peu retravaillé sur le projet entre temps.

    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
    public class Plateau extends JPanel{
     
        private static final int SIZE = 10; // nombre de lignes et colonnes
     
        public Plateau() {
            this.setSize(100,100); // ça ne sert à rien si le panel est géré par un Layout Manager (sauf exception, comme avec certains layout absolu)
            final Icon grillevideicon = new ImageIcon("C:\\Users\\Utilisateur\\Pictures\\grille_vide.jpg"); // ici il sera préférable d'utiliser une ressource plutôt qu'un fichier
            this.setLayout(new GridLayout(SIZE,SIZE)); // le GridLayout n'est pas forcément le meilleur choix, parce que la grille s'étend dans tout le composant (un GridBagLayout serait préférable je pense)
            for(int j=0,max=SIZE*SIZE;j<max;j++){  
               JButton button = new JButton(grillevideicon);
               int y=j/SIZE;
               int x=j%SIZE;
               int value =0;
               button.addActionListener(event->caseClick(button, x, y, value));
               this.add(button);
               button.
            }
     
        }
        private void caseClick(JButton button, int x, int y, int value) {
            // là tu mets le code à exécuter quand on clique sur la case
            System.out.println("Vous avez cliqué la case colonne="+x+", ligne="+y+"."+"Ma valeur est : "+value);
     
        }
    }
    EDIT : Même si je veux bien une explication pour la partie caseClick, que je pense cependant avoir comprise ce coup-ci, j'ai réussi par moi-même à modifier mes valeurs et changer l'icône dynamiquement. Merci beaucoup pour l'aide apportée en amont, elle correspond parfaitement à ce que j'attendais.

  11. #11
    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 : 56
    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
    Le mieux c'est de constituer une représentation de ta case indépendante de ce que tu utilises pour la représenter dans l'UI : ainsi passer d'une représentation par JButton à une représentation par autre chose (JLabel avec une image, image directement en Java2D, ou peu importe) ne modifie pas cette réprésentation. On appelle ça le MVC : modèle/vue/contrôleur. Le modèle est ce qui représente la case indépendamment de sa gestion et de l'UI, donc ses propriétés (touché, coulé, partie d'un bateau de type x...). Le contrôleur est le code de gestion (si on tire sur la case, et qu'il y a une partie de bateau dedans, alors il se passe ceci...), y compris la partie évenement d'UI. La vue est la représentation graphique. Un moyen simple d'éviter d'avoir du code qui dépend du contrôleur ou de la vue dans le modèle est de procéder par événement (voir les classes PropertyChangeSupport et SwingPropertyChangeSupport). Le modèle ignore complètement le contrôleur et la vue : il représente une case de jeu de bataille navale et c'est tout, mais permet à d'autres objets d'être informés des changements de ses attributs par évenement. La vue se met à jour en écoutant les changements dans le modèle. Le contrôleur écoute les deux et envoie des ordres aux deux pour réaliser le fonctionnement de tout ça (changer telle propriété dans le modèle).

    Maintenant, on peut aussi simplifier en faisant des tableaux qui contiennent les états.

    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
    public class Plateau extends JPanel{
     
        private static final int SIZE = 10; // nombre de lignes et colonnes
     
    /**
             * Représente l'état d'une case
             *
             */
    	public enum State {
    		HIT, // touchée
    		SUNK, // coulée
    		MISS, // tirée mais manquée
    		SEA, // mer
    		SHIP // bateau
    	}
     
    	/**
             * Représente le type de bateau
             *
             */
    	public enum ShipType {
    		CARRIER(5),
    		BATTLESHIP(4),
    		CRUISER(3),
    		SUBMARINE(3),
    		DESTROYER(2);
     
    		private int size; // la taille du bateau
    		private ShipType (int size) {
    			this.size=size;
    		}
     
    		public int size() {
    			return size;
    		}
    	}
     
        private State[][] states; // un tableau pour les états
        private Ship[][] ships; // un tableau pour les bateau
     
        public Plateau() {
            /*...*/
            states = new State[SIZE][SIZE]; // on crée un tableau qui contient l'état des cases
            ships = new Ship[SIZE][SIZE]; // on crée un tableau qui contient les instances de bateau des cases qui contiennent un bateau
            /*...*/
        }
     
    }
    Et donc tu peux ensuite écrire par exemple :

    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
    private void caseClick(JButton button, int x, int y) {
     
          switch(states[y][x]) {
          case SEA:
                // coup dans l'eau...
                states[y][x]=State.MISS;
                break;
          case SHIP:
                // touché...
                states[y][x]=State.HIT;
                     // on avertit que le bateau a été touché (
                if ( ships[y][y].hit(x,y) ) {
                     // le bateau est coulé
                     int size = ships[y][y].getType().getSize();
                     for(Point location : ships[y][y].getLocations() ) { // on parcourt les cases du bateau
                          if ( states[location.y][location.x]==State.HIT ) {
                              size--;
                          }
                     }
                     if ( size==0 ) { // le bateau est coulé
                        for(Point location : ships[y][y].getLocations() ) { 
                            states[location.y][location.x]=State.SUNK;
                        }
                     }
                }
                break;
          case SUNK:
                // on a tiré sur un bateau coulé
                // on fait un truc ou pas
                break;
          case HIT:
                // on a tiré sur un bateau déjà touché
                // on fait un truc ou pas
                break;
          case MISS:
                // on a tiré sur un bout de mer déjà touchée
                // on fait un truc ou pas
                break;
          } 
     
                setIcon(button, x,y); // on appelle une méthode qui change l'icon du bouton en fonction de son état 
                repaint();
     
     
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    setIcon(JButton button, int x, int y) {
          Icon icon;
         switch(state[y][x]) {
         case SHIP:
                icon = ships[y][x].getIcon(x,y) {
                break;
          case SEA:
                icon = ...
                break;
          ...
         }
         button.setIcon(icon);
    }
    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.

  12. #12
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2017
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2017
    Messages : 22
    Par défaut
    Je comptais initialement utiliser des classes "Bateaux". Mais comment créer des méthodes "placer bateaux", par exemple, qui se servirait d'un action listener ? Je dois ajouter un actionlistener spécifique, comme pour le "caseClicked" que tu m'as créé précédemment ?

    Merci beaucoup d'avance.

  13. #13
    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 : 56
    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
    Premièrement il faut considérer qu'il y a une phase du jeu pendant laquelle on place des bateaux, phase qu'on peut gérer avec une variable d'état (ou par un affichage d'une interface spéciale, mais il y'a toujours un moyen de savoir qu'on est en train de placer des bateaux, et non pas de jouer : par exemple, on pourrait imaginer faire une abstraction pour la grille, avec caseClic abstraite, et avoir 2 implémentations concrètes, une pour le placement, une pour le jeux, une pour la grille d'affichage de ses propres bateaux quand on joue). Si on gère plusieurs phases (le jeu finalement c'est des phases qui se succèdent), on pourrait utiliser une enum, ou un booléen spécifique (à true, on place des bateaux, à false on fait autre chose).

    Puisque tu veux faire le placement par clic (on pourrait utiliser plein d'autres moyens, comme le drag and drop par exemple), on peut
    • on peut cliquer sur un bateau dans une liste, puis cliquer sur une case pour le placer. Cliquer sur le bateau dans la grille pour le basculer horizontal/vertical.
      Pour faire ça, il faut gérer un état de plus, qui dit on est entrain de placer un bateau de ce type là. Une variable référençant une instance de classe Bateau, à null quand aucun bateau n'est sélectionné (par exemple placementBateau).
      On pourrait alors avoir dans caseClicked :
      Code pseudocode : 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
      si on  est en train de placer un bateau (test de l'état) alors
            si un bateau est selectionné pour un placement alors
                si la case cliquée contient un bateau alors
                      erreur par exemple  
                sinon
                      si le bateau peut être placé dans cette case alors 
                         on le place (ce qui consiste à affecter plusieurs cases...)
                         on pense à déselectionner le bateau (pour qu'il ne soit plus considérer en cours de placement) donc <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">placementBateau=<span style="color: #0000ff;">null</span></span>                fin si 
                fin si
            sinon
                si la clase cliquée contient un bateau alors 
                   si le bateau peut être basculer alors
                      le basculer
                   fin si
                fin si
            fin si
      fin si
      On peut aussi faire qu'un clic gauche permet de replacer et un clic droit permet de basculer...
    • La solution précédent fonctionne en pure clic et me semble assez complexe et pas forcément super ergonomique (fastidieuse). Il y a une solution un peu plus old school peut-être, mais beaucoup plus simple à implémenter.
      Il n'y a plus d'affichage de liste de bateaux. On ne fait que cliquer dans la grille, sur des cases et donc dans caseClicked,
      Code pseudocode : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      si on  est en train de placer un bateau (test de l'état) alors
           si la case cliquée contient un bateau alors
               afficher un dialogue pour proposer de retirer le bateau
               si la réponse est oui alors
                   on retire le bateau de la grille
               fin si
           sinon
               afficher un dialogue avec la liste de tous les bateaux qu'on peut placer dans la case (donc tous les bateaux qu'on peut placer, en hortzontal et/ou en vertical)
               si un bateau a été sélectionné et le placement validé alors
                  on le place
               fin si
           fin si
    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.

  14. #14
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2017
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2017
    Messages : 22
    Par défaut
    La façon dont tu m'as décris le déroulement était celle que j'avais prévu d'utiliser initialement. J'ai déjà le plan de comment développer les tours de jeu, en utilisant des listes pour les bateaux etc...
    Cependant, là où j'ai des difficultés dans la compréhension, c'est pour comment implémenter ma première méthode de "placer bateaux". En fait, j'ai commencé à faire une méthode dans ma classe bateaux. Cependant, je ne sais pas comment y faire bien intervenir le caseClick (dois-je créer un nouvel actionListener ?) Je suppose que pour la mise à jour des valeurs j'ai juste à faire une boucle similaire à celle qui a initialisé tous les boutons, mais je ne sais pas réellement où je dois créer ma méthode de placement.
    Il est sûrement possible de tout faire dans le caseClicked sans rajouter de classes supplémentaires ou de méthodes supplémentaires, mais je suppose que ce n'est pas la manière dont je suis sensé faire ?

    Désolé encore pour toutes les questions que je vous pose, je vous remercie pour chaque réponse.

  15. #15
    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 : 56
    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
    Citation Envoyé par SoulHokib Voir le message
    En fait, j'ai commencé à faire une méthode dans ma classe bateaux. Cependant, je ne sais pas comment y faire bien intervenir le caseClick (dois-je créer un nouvel actionListener ?)
    La classe Bateau est une représentation d'un Bateau. Elle n'est pas censée être au courant qu'il existe une UI Swing qui l'affiche et donc ne doit surtout pas avoir de dépendances sur Swing, ou sur ta grille, donc de rapport avec caseClick.

    Citation Envoyé par SoulHokib Voir le message
    Je suppose que pour la mise à jour des valeurs j'ai juste à faire une boucle similaire à celle qui a initialisé tous les boutons, mais je ne sais pas réellement où je dois créer ma méthode de placement.
    Ça c'est autre chose. Le code de placement doit également être indépendant de l'UI. On peut placer un bateau dans une grille même si on n'utilise pas d'affichage, ou si on fait un affichage en console ou dans une appli web, peu importe, c'est toujours la même méthode.
    En gros, l'algo c'est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    si horizontal alors
       x =casecliquée.x
       y = casecliquée.y
       i = 0
       tant que 
           placer case i du bateau dans x,y
           i++
           x++
       fin tant que i<nombredecases du bateau
    sinon
        // en vertical c'est pareil, mais y varie au lieu de x
    fin si
    Citation Envoyé par SoulHokib Voir le message
    Il est sûrement possible de tout faire dans le caseClicked sans rajouter de classes supplémentaires ou de méthodes supplémentaires, mais je suppose que ce n'est pas la manière dont je suis sensé faire ?
    Bah si justement, dans caseClick,ou dans une méthode appelée dans caseClick pour une meilleure isolation, mais cette méthode ne sera pas dans Bateau, c'est sûr.
    Et c'est exactement ce que je t'ai montré dans mes pseudocodes (pseudocode pour éviter de te donner le code tout fait)
    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.

  16. #16
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2017
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2017
    Messages : 22
    Par défaut
    Oui, avoir le code entier ne m'intéresse absolument pas, je cherche à comprendre et progresser, merci pour la réponse rapide. Je suis en train de continuer mes tests de placement, et je commence à saisir la façon de développer que je devrais avoir. Je vais essayer d'avancer et de peaufiner par moi-même. Je te remercie !

  17. #17
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2017
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2017
    Messages : 22
    Par défaut
    Bonjour !

    J'ai avancé dans la façon dont je désire placer les bateaux, mais je me confronte à quelques problèmes. Lors de mes tests, il semblerait que ma méthode "placerBateaux" se lance à chaque fois que je clique sur une case. J'ai pourtant essayer d'utiliser un booléen global appelé "placement" ainsi qu'un while pour faire en sorte de ne passer qu'une seule fois dans ma méthode "placeBateaux", mais cela ne semble pas fonctionner. Il y'a vraisemblablement quelque chose que je ne sais pas bien manipuler avec les booléens/while. Sauriez-vous m'éclairer sur ce point ?

    Je vous fournis mon code pour que vous puissiez voir, ainsi que mon avancée. A noter que je réalise des tests simplement avec Bateau2, je créerais la classe globale de bateaux par la suite, une fois que j'aurais réussi à faire fonctionner parfaitement le placement d'un bateau.

    Le code de Plateau :
    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
    public class Plateau extends JPanel{
     
        private static final int SIZE = 10; // nombre de lignes et colonnes
        private boolean placement;
     
        public Plateau() {
            ArrayList<Bateau2> lesBateaux = new ArrayList<>();
            this.setSize(100,100); // ça ne sert à rien si le panel est géré par un Layout Manager (sauf exception, comme avec certains layout absolu)
            final Icon grillevideicon = new ImageIcon("C:\\Users\\Utilisateur\\Pictures\\grille_vide.jpg"); // ici il sera préférable d'utiliser une ressource plutôt qu'un fichier
            this.setLayout(new GridLayout(SIZE,SIZE)); // le GridLayout n'est pas forcément le meilleur choix, parce que la grille s'étend dans tout le composant (un GridBagLayout serait préférable je pense)
            for(int j=0,max=SIZE*SIZE;j<max;j++){  
               JButton button = new JButton(grillevideicon);
               int y=j/SIZE;
               int x=j%SIZE;
               int value =0;
               Bateau2 b = null;
               button.addActionListener(event->caseClick(button, x, y, value, b));
               button.addActionListener(event->placerBateaux(button, x, y, value, b));
               this.add(button);
            }
     
        }
     
        private void placerBateaux(JButton button, int x, int y, int value, Bateau2 b){
            System.out.println("Placer un bateau de longueur 2");
            b = new Bateau2("b2");
            Scanner sc = new Scanner(System.in);
            System.out.println("Voulez vous placer le bateau horizontalement ? (o/n)");
            String horiz = sc.next();
            if(horiz.equals("o")){
                if(value==0){
                    if(x+1<=9){
                        b.x=x;
                        b.y=y;
                        b.or=horizontal;
                        for(int i=x; i<2;i++){
                            value=3;                        
                        }
                    }
                }
                else if(value==2){
                    System.out.println("Il y'a déjà un bateau sur cette case");
                }
            }
            else if(horiz.equals("n")){
                if(value==0){
                    if(y-1<=0){
                        b.x=x;
                        b.y=y;
                        b.or=horizontal;
                        for(int i=y; i>2;i--){
                            value=3;                        
                        }
                    }
                }
                else if(value==2){
                    System.out.println("Il y'a déjà un bateau sur cette case");
                }            
            }
            placement = false;    
        }
     
     
        private void caseClick(JButton button, int x, int y, int value, Bateau2 b) {
            // là tu mets le code à exécuter quand on clique sur la case
            while(placement == true){
                placerBateaux(button, x, y, value, b);
            }
    //        boolean bateau3= true;
    //        while(bateau3==true){
    //            if(x+2<=9){
    //                for(int i=x; i<x+3;i++){
    //                    value=3;
    //                }  
    //            }    
    //        bateau3 = false;
    //        }
    //        if(x==9 && y==0){
    //            value=3;
    //        }
    //        if(x==8 && y==0){
    //            value=3;
    //        }
    //        if(x==7 && y==0){
    //            value=3;
    //        }
            System.out.println("Vous avez cliqué la case colonne="+x+", ligne="+y+"."+"Ma valeur est : "+value);
            if(value==0){
                value=1;
                button.setIcon(new ImageIcon("C:\\Users\\Utilisateur\\Pictures\\grille_vide_touche.jpg"));
            }
            if(value==3){
                value=4;
                button.setIcon(new ImageIcon("C:\\Users\\Utilisateur\\Pictures\\bateau_touche.jpg"));
            }
     
        }
    Le code de Bateau2 :
    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
    public class Bateau2 extends Plateau{
        private String nom;
        protected int pdv;
        private int taille;
        protected int x;
        protected int y;
        public Orientation or;
     
        public Bateau2(String n){
            nom = n;
            taille = 2;
            pdv = 2;
        }
     
        public Orientation getOr(){
            return this.or;
        }
    }
    Et mon énumération nommée "Orientation" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public enum Orientation {
        horizontal, vertical;
    }
    Si vous pouviez m'aider sur ce simple point, ça me serait d'une grande utilité. En vous remerciant encore une fois d'avance.

  18. #18
    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 : 56
    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
    Oulàlà, déjà tu ne devrais pas mélanger interface Swing et interface en console. En plus, il ne faut pas créer plusieurs instance de Scanner sur System.in, donc a fortiori dans une boucle (un seul devrait être créé pour toute l'application). Plutôt qu'une interface en console, tu devrais utiliser des dialogues. Avec JOptionPane tu feras des dialogues très simples qui ressemblent à ce qu'on peut faire en console. Avec JDialog tu peux faire quelque chose de plus sympa ergonomiquement.

    En plus tu enregistres deux écouteurs évenements sur le bouton :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    button.addActionListener(event->caseClick(button, x, y, value, b));
               button.addActionListener(event->placerBateaux(button, x, y, value, b));
    et la méthode appelée dans le second écouteur appelle la méthode que celle appelée dans la boucle appelée lors de l'exécution du premier écouteur.

    Le premier écouteur fait bien une boucle tant que placement est à true. Mais le second le fait toujours. C'est pour ça que placement est toujours appelée.

    Tu dois gérer un système de phases. Au début, tu as une phase de placement de bateau : toute ton interface réagit comme un système qui ne fait que du placement de bateau. Ensuite, quand tous les bateaux sont placés, ton interface se comporte différemment : comme une interface qui permet de jouer.
    Soit tu gères ça par un état (le booléan) soit tu gères ça par des fenêtres différentes qui utilises deux versions légèrement différentes de la classe si tu penses que c'est plus simple (mais je pense que ça ne l'est pas).

    Voici un petit exemple vite fait (un jeu bidon : on saisit le texte de 4 boutons, puis les textes disparaissent et on a 8 essais pour dire où et quels étaient les textes qu'on avait mis, avec trois phases donc, une phase de placement, une phase de jeu, une phase fin 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
    public class DemoParBoolean extends JPanel {
     
    	private static final int N = 8;
    	private static final int NB = 4;
    	private static final int ESSAIS = 8;
     
    	private Map<JButton,String> buttons = new HashMap<>();
     
    	private boolean placement=true;
    	private int nbessais;
     
    	public DemoParBoolean() {
    		super(new GridLayout(N,0));
    		for(int i=0; i<N; i++) {
    			for(int j=0; j<N; j++) {
    				JButton button = new JButton();
    				final int x=i;
    				final int y=j;
    				button.addActionListener(e-> caseClick((JButton)e.getSource(),x,y));
    				add(button);
    			}
    		}
    	}
     
     
    	private void caseClick(JButton button, int x, int y) {
    		if (placement ) {
                            // ici on place
    			String text = JOptionPane.showInputDialog(button, "Saisir un texte pour le bouton n° " + buttons.size()+1 + "/" + NB + " ("+x + "," + y+")", "");
    			if ( text!=null ) {
    				button.setText(text);
    				buttons.put(button,text);
    				if (buttons.size()>=NB) {
    					placement = false; // fin de la phase de placement
    					buttons.keySet().forEach(b-> b.setText(""));
    					nbessais = ESSAIS;
    				}
    			}
    		}
    		else if ( nbessais>0 ) {
    			// ici on joue
    			if( button.getText().isEmpty() ) {
    				String text = buttons.get(button);
    				if ( text==null ) {
    					JOptionPane.showMessageDialog(button, "Et non, ce bouton était vide");
    				}
    				else {
    					String rep = JOptionPane.showInputDialog(button, "Quel était le texte dans ce bouton (Reste " + nbessais + " essais)?", "");
    					if ( text.equals(rep) ) {
    						button.setText(text);
    						buttons.remove(button);
    						JOptionPane.showMessageDialog(button, "Bonne réponse");
    					}
    					else {
    						JOptionPane.showMessageDialog(button, "Et non ce n'était pas ça");
    					}
    				}
    				if ( buttons.isEmpty() ) {
    					nbessais=0;
    				}
    				else {
    					nbessais--;
    				}
    			}
    		}
    		else {
     
                         // ici le jeu est terminé
    			JOptionPane.showMessageDialog(button, "Jeu terminé - " + (buttons.isEmpty()?"Gagné":"Perdu"));
    		}
    	}
     
     
    	public static void main(String[] args) {
     
    		JFrame frame = new JFrame("Démo");
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
    		DemoParBoolean demo = new DemoParBoolean();
     
    		frame.add(demo);
     
    		frame.setSize(500,500);
    		frame.setLocationRelativeTo(null);
    		frame.setVisible(true);
     
    	}
     
     
    }
    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.

  19. #19
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2017
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2017
    Messages : 22
    Par défaut
    Oui, l'interface console c'était juste pour faire mes tests car je ne maîtrise pas le reste, je vais y jeter un œil. Je ne comptais absolument pas mélanger les deux, désolé pour ça ^^
    J'ai compris ducoup d'où venait l'erreur, je vais tout développer par phase en utilisant des booléens ducoup. Merci beaucoup encore une fois !

  20. #20
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2017
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2017
    Messages : 22
    Par défaut
    Citation Envoyé par joel.drigo Voir le message
    La classe Bateau est une représentation d'un Bateau. Elle n'est pas censée être au courant qu'il existe une UI Swing qui l'affiche et donc ne doit surtout pas avoir de dépendances sur Swing, ou sur ta grille, donc de rapport avec caseClick.


    Ça c'est autre chose. Le code de placement doit également être indépendant de l'UI. On peut placer un bateau dans une grille même si on n'utilise pas d'affichage, ou si on fait un affichage en console ou dans une appli web, peu importe, c'est toujours la même méthode.
    En gros, l'algo c'est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    si horizontal alors
       x =casecliquée.x
       y = casecliquée.y
       i = 0
       tant que 
           placer case i du bateau dans x,y
           i++
           x++
       fin tant que i<nombredecases du bateau
    sinon
        // en vertical c'est pareil, mais y varie au lieu de x
    fin si

    Bah si justement, dans caseClick,ou dans une méthode appelée dans caseClick pour une meilleure isolation, mais cette méthode ne sera pas dans Bateau, c'est sûr.
    Et c'est exactement ce que je t'ai montré dans mes pseudocodes (pseudocode pour éviter de te donner le code tout fait)

    Pour en revenir à ce message, je n'arrive pas à faire l'actualisation en cascade. Je ne vois pas, concrètement, comment choisir la case sur laquelle je veux actualiser les données. J'arrive donc à actualiser la valeur de ma case initiale, mais pas les suivantes en cascade. J'ai essayé de reproduire l'algorithme que vous avez évoqué, mais je n'aboutis à rien. Sauriez-vous m'expliquer ? En vous remerciant.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 5
    Dernier message: 06/05/2007, 15h33
  2. Réponses: 2
    Dernier message: 27/10/2006, 19h54
  3. Débugger avec interface graphique
    Par powerpsy dans le forum x86 32-bits / 64-bits
    Réponses: 6
    Dernier message: 03/05/2006, 23h53
  4. Application multiplateforme avec interface graphique
    Par TNorth dans le forum Choisir un environnement de développement
    Réponses: 2
    Dernier message: 31/01/2004, 19h55

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