Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1516 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  aide jeu (morpion)

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

aide jeu (morpion)

n°2078946
Spack16
Posté le 29-05-2011 à 12:40:01  profilanswer
 

Bonjour à tous et toutes, je dois créer pour mon cours de programmation un jeu en java qui est le morpion. donc qui consiste en une interface graphique de 3x3 cases où l'on place un x ou un o en fonction du joueur et le premier qui aligne en diagonal ou en en colonne gagne. J'ai fini de créer l'interface graphique mais je ne vois pas du tout comment faire pour que le programme vérifie si il y a 3 "x" ou 3 "o" aligné... J'ai besoin de votre aide car je passe mon examen vendredi prochain et le jeu doit être fonctionnel ...  
Je vous mets le code que j'ai déjà fait ici en dessous :
 
************interface graphique**************
import javax.swing.*;
import java.awt.*;
 
public class Morpion extends JFrame
{
    //crée un fond pour recevoir l'interface graphique.
    private JPanel fond = new JPanel();
     
    //servira à créer notre tableau.
    private Case[][] grille;
       
    //Permettra de calculer le nombre de case jouées et de savoir quand la partie sera fini.
    private int nombreCaseJouees;
     
         
    public Morpion()
    {
        this.setPreferredSize(new Dimension(350,350));
        this.setResizable(false);
         
        //crée une grille de 3x3 à l'aide d'un tableau.        
        grille = new Case[3][3];
             
        fond.setLayout(new GridLayout(3,3,10,10));
         
        for(int i = 0 ; i < 3 ; i++)
        {
            for(int j = 0 ; j < 3 ; j++)
            {
                fond.add(new Case("" ));
               
            }
        }
               
 
        this.setContentPane(fond);
        this.pack();
        this.setVisible(true);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
    }  
}
 
***************Case********************
 
import javax.swing.*;
import java.awt.event.*;
 
public class Case extends JButton implements ActionListener
{
    private static int joueur = 0;
     
    public Case(String t)
    {
        super(t);
        this.addActionListener(this);
    }
     
    public void actionPerformed(ActionEvent ae)
    {
        joueur = (joueur+1)%2;
         
        if(joueur==0)
        {
            this.setText("O" );
        }
        else
        {
            this.setText("X" );
        }
    }
}
 
 
Le code ci-dessus fonctionne donc, et affiche plus ou moins ce que je désire au niveau graphique si ce n'est que j'aimerais agrandir la taille du "x" et du "o". Si vous pouvez m'aider pour ça aussi ce n'est pas de refus ....
 
Je vous remercie d'avance et vous souhaite une bonne journée ou soirée. (Tout dépend de l'heure à laquelle vous verrez ce message >< );
 

mood
Publicité
Posté le 29-05-2011 à 12:40:01  profilanswer
 

n°2078951
loic_1715
Posté le 29-05-2011 à 14:09:05  profilanswer
 

Coucou,
 
Alors j'ai fait un jeu de morpion de l'année dernière avec GUI donc je peux t'aider.
 
Pour la vérification, c'est simple : dès qu'un joueur joue et si son coup est valide (s'il ne clique pas sur une case déjà occupée par X ou O), tu utilises une fonction de vérification.
Cette fonction de vérification comporte 3 étapes :

  • vérif de l'alignement horizontal (avec une boucle)
  • vérif de l'alignement vertical (avec une boucle)
  • vérif des diagonales (à faire la main)


Mais cette fonction devrait plutôt se trouver dans la partie Contrôle que dans ta Vue (si tu utilises le MVC).


---------------
"Les animaux sont moins intolérants que nous : un cochon affamé mangera du musulman." Desproges
n°2078954
Spack16
Posté le 29-05-2011 à 14:48:01  profilanswer
 

Oui j'avais déjà pensé aux boucles, le problème est que on est vraiment mauvais en programmation et que la façon dont on a eu cours fait que on ne sais pas faire grand chose ... Du coup je sais même pas comment faire pour que l'ordinateur vérifie par exemple la case en (1;1) pour savoir si il y a un "x" ou un "o". Je ne sais même pas comment faire pour que une fois que le joueur ayant "x" clique sur une case, cette case ne puisse plus être modifiée. Je voudrais en faite éteindre le bouton une fois que l'on a cliqué dessus.

n°2078956
loic_1715
Posté le 29-05-2011 à 15:21:46  profilanswer
 

Pour la vérification, tu n'as pas besoin de vérifier le contenu de la case mais que des cases alignées ont la même valeur. En clair, le 1er test pourrait être :
case[0][0] == case[0][1] && case[0][0] == case[0][2]. Avec ça, tu vérifies la 1ere ligne, c'est-à-dire les X sur ce schéma:
XXX
OOO
OOO
 
 
Si tu colles ça dans une boucle ça dans une boucle for, ça te vérifie 3 lignes horizontale (ou verticale, je me souviens jamais de l'ordre des 2 [][]) :

Citation :

for(int i = 0; i < 3; i++)
     if(case[i][0] == case[i][1] && case[i][0] == case[i][2])
          return true;


Pour les 3 lignes verticales, tu inverses le contenu des [][] de case.
Pour les diagonales, ça se fait à la main.
 
C'est setEnabled(false) pour rendre un bouton inactif.


---------------
"Les animaux sont moins intolérants que nous : un cochon affamé mangera du musulman." Desproges
n°2078962
Spack16
Posté le 29-05-2011 à 17:18:37  profilanswer
 

Merci, ça m'aide déjà bien mais quand je lance le programme y me met directement une fenêtre avec écrit 3x gagné. Dans le "if" au lieu de mettre un "return true" qui n'est pas accepté dans un "void", j'ai mis un "System.out.println("gagné" )". Mais évidement quand on lance le programme, les cellules des 3 colonnes sont toutes identiques. Il faudrait donc que la boucle ne se lance qu'après la première case jouée ... Je suis de nouveau face à un mur.  
Si tu sais m'aider, ce serait génial.  
Merci.

n°2078964
loic_1715
Posté le 29-05-2011 à 17:36:23  profilanswer
 

Ah oui je n'avais pas pensé aux cases vides... A priori, il suffit de compléter la condition comme ça dans ton for  :
if(case[i][0] == case[i][1] && case[i][0] == case[i][2] && case[i][0] != caseVide)  
 
caseVide étant à remplacer la valeur d'une case vide dans ton jeu.


---------------
"Les animaux sont moins intolérants que nous : un cochon affamé mangera du musulman." Desproges
n°2078968
loic_1715
Posté le 29-05-2011 à 17:56:31  profilanswer
 

Je n'avais pas tilté sur le return true; non accepté dans if. Change le void par boolean.


---------------
"Les animaux sont moins intolérants que nous : un cochon affamé mangera du musulman." Desproges
n°2079199
Spack16
Posté le 30-05-2011 à 16:58:31  profilanswer
 

j'ai réussi à faire ce que je voulais. Ca renvoie true quand j'ai 3 "x" ou "o" aligné. Maintenant j'aimerai savoir comment faire pour faire un if "true" alors en grand au millieu de l'écran de jeu, on voit un message "vous avez gagné"
merci de votre aide.

n°2079205
loic_1715
Posté le 30-05-2011 à 17:04:15  profilanswer
 

Pour une popup, tu peux utiliser http://www.siteduzero.com/tutoriel [...] #ss_part_1


---------------
"Les animaux sont moins intolérants que nous : un cochon affamé mangera du musulman." Desproges
n°2079616
Spack16
Posté le 31-05-2011 à 19:32:58  profilanswer
 

oui ça ça va je sais les utiliser mais je demande comment écrire la méthode. Voila ce que j'ai comme code pour le moment :  
 
 
*************Morpion************
 
import javax.swing.*;
import java.awt.*;
import javax.swing.JOptionPane;
 
public class Morpion extends JFrame
{
    //crée un fond pour recevoir l'interface graphique.
    private JPanel fond = new JPanel();
     
    //servira à créer notre tableau.
    private Case[][] grille;    
     
         
    public Morpion()
    {    
        super();
        this.setPreferredSize(new Dimension(350,350));
        this.setResizable(false);
         
        //crée une grille de 3x3 à l'aide d'un tableau.        
        grille = new Case[3][3];
             
        fond.setLayout(new GridLayout(3,3,10,10));
         
        for(int i = 0 ; i < 3 ; i++)
        {
            for(int j = 0 ; j < 3 ; j++)
            {
                grille[j][i] = new Case("",this,i,j);
                fond.add(grille[j][i]);
            }
        }
   
        this.setContentPane(fond);
        this.pack();
        this.setVisible(true);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
    }  
     
    public boolean aGagneEn(int x,int y)
    {
         
        //on test la ligne horizontale
        if(grille[0][x].equals(grille[1][x]) && grille[0][x].equals(grille[2][x]))
        {
            return true;
        }  
         
        //on test la ligne vertical
        if(grille[y][0].equals(grille[y][1]) && grille[y][0].equals(grille[y][2]))
        {
            return true;
        }  
         
        //on test la ligne oblique de la case en haut à gauche à la case en bas à droite
        if(grille[0][0].equals(grille[1][1]) && grille[0][0].equals(grille[2][2]))
        {
            return true;
        }
         
        // on test la ligne oblique de la case en haut à droite à la case en bas à gauche
        if(grille[2][0].equals(grille[1][1]) && grille[2][0].equals(grille[0][2]))
        {
            return true;
        }
        else
        {
            return false;
        }
    }
     
    public void messageGagne()
    {
        if(true)
        {
            System.out.println("Tu as gagné !" );
        }
    }
}
 
 
 
************Case************
 
import javax.swing.*;
import java.awt.event.*;
 
public class Case extends JButton implements ActionListener
{
    private static int joueur = 0;
    int x,y;
    private Morpion m;
    private String t;
     
    public Case(String t,Morpion m,int x,int y)
    {
        super(t);
        this.t = t;        
        this.x = x;
        this.y = y;
        this.addActionListener(this);
        this.m = m;
    }
     
    public void actionPerformed(ActionEvent ae)
    {
        joueur = (joueur+1)%2;
         
        if(joueur==0)
        {
            this.setText("O" );
            t = "O";
        }
        else
        {
            this.setText("X" );
            t = "X";
        }
        setEnabled(false);
         
        System.out.println(m.aGagneEn(this.x,this.y));
         
    }
     
    public boolean equals(Case c)
    {
        return this.t.equals(c.t);
    }
}
 
en executant le prog, on voit qu'il y a un souci avec les true. Ce problème ne se pose pas si je ne mets pas les diagonales... Ce qui m'ennuye puisque j'aimerai les laisser.  
Ensuite pour le message pour dire que le joueur a gagné, ça ne fonctionne pas non plus mais ça ne m'étonne pas. Ceci dit je ne sais pas comment faire. J'aimerai encore abuser de ton aide pour me guider si tu vois une solution. D'avance merci du temps que tu prends pour me répondre.

mood
Publicité
Posté le 31-05-2011 à 19:32:58  profilanswer
 

n°2079620
loic_1715
Posté le 31-05-2011 à 20:21:52  profilanswer
 

Je ne vois pas comment tu gères la partie (alternance des joueurs, vérif d'un gain de la partie, ...). Il est où ton main()  qui gère la partie ?
 
Et je ne comprends pas ton codage de la vérification... Je t'avais proposé une méthode nettement plus simple avec les boucles. Tu n'as pas réussi à l'adapter ?


---------------
"Les animaux sont moins intolérants que nous : un cochon affamé mangera du musulman." Desproges
n°2079631
Spack16
Posté le 31-05-2011 à 21:21:01  profilanswer
 

J'avais tenté de le faire, ensuite je l'ai amené en cours mais le prof la fait à sa façon ... L'alternance des joueurs se fait de façon un peu simpliste. Une fois sur deux quand on clique, s'affiche soit un "x" soit un "o". Le main() qui gère la partie se trouve la partie "morpion". Ma vérification se fait par un if pour la ligne horizontale, un if pour la verticale puis manuellement pour la partie diagonale. Notre professeur passe dans les bancs mais nous sommes plusieurs groupes à faire un jeu différent. Il ne s'attarde pas longtemps sur un projet. Nous sommes en 6ème secondaire 4 de programmation java par semaine. C'est pour ça que c'est pas très poussé comme jeu. On fait au plus simple pour avoir un résultat juste ce qu'il faut. On ne rentre pas dans la complexité.

n°2079634
loic_1715
Posté le 31-05-2011 à 21:32:04  profilanswer
 

Ah tu es en 6ème... A mon époque (expression de vieux con ^^), on n'avait pas de cours de programmation.
 
Bref, la méthode de ton prof est assez bizarre. Si tu cliques sur une case invalide, ça compte comme un changement de joueur ?
 
Tu peux poster le code de ton main() ?


---------------
"Les animaux sont moins intolérants que nous : un cochon affamé mangera du musulman." Desproges
n°2079940
Spack16
Posté le 01-06-2011 à 19:25:18  profilanswer
 

Ton mon code est là en fait... le morpion gère toutes les "régles" et les vérif et case ne fait que dire ce que représente une case dans le jeu. Comment elle réagit.

n°2079941
loic_1715
Posté le 01-06-2011 à 19:29:26  profilanswer
 

Tout ton programme ? Mais tu n'as même pas public static void main(String[] args) pour lancer ton programme...


---------------
"Les animaux sont moins intolérants que nous : un cochon affamé mangera du musulman." Desproges
n°2080253
Spack16
Posté le 03-06-2011 à 16:13:34  profilanswer
 

Bah je peux t'assurer que quand je le lance ça fonctionne ... On utilise BlueJ comme compilateur.

n°2081415
loic_1715
Posté le 08-06-2011 à 19:00:33  profilanswer
 

Je ne connais pas ce compilo.
Tu as avancé ?


---------------
"Les animaux sont moins intolérants que nous : un cochon affamé mangera du musulman." Desproges

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  aide jeu (morpion)

 

Sujets relatifs
Aide HTML/PHP/ SQL ( Urgent pour BAC:! )Besoin d'aide pour un site web ...
Besoin d'aide!! Frise qui défileAide pour la création d'une fenêtre permettant de traiter des images
[Résolu]Un peu d'aide sous VBA !Aide Interaction entre 2 JComboBox
Publier site NetBean Aide Svp[SQL] Aide requête SQL Access 2010
Morpion 3D en python[AIDE] XSD, XSL, fichier config...
Plus de sujets relatifs à : aide jeu (morpion)


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR