Probleme pour un projet pour mes etudes

Raph382 Messages postés 14 Date d'inscription mercredi 10 octobre 2007 Statut Membre Dernière intervention 2 septembre 2015 - 15 oct. 2007 à 17:46
KenZara Messages postés 112 Date d'inscription vendredi 24 décembre 2004 Statut Membre Dernière intervention 20 décembre 2011 - 16 oct. 2007 à 21:51
Bonjour, je suis etudiant en informatique et j'ai un projet a faire, un jeu de morpion en applet Java, je l'ai fini mais lorsque je le lance il fais bugger mon ordinateur, je n'arrve pas a comprendre ou je me suis trompé!

Si quelqu'un pourrais m'aider, voila le code :

<hr size="2" width="100%" />
import java.awt.Graphics;
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;

public class Morpion extends Applet implements MouseListener
{
    Dessin zone=new Dessin();
    Joueur j1;
    Joueur j2;
    int nulles=0;
    int x;
    int y;
    char montableau[][];
   
    public void init()
    {
        //Creation des 2 joueurs et du Tableau//
        setSize(302,500);
        j1=new Joueur("Toto");
        j2=new Joueur("Titi");
        j1.gagne=0;
        j2.gagne=0;
        montableau= new char [3][3];
        zone.setSize(302,500);
        this.add(zone);
                       
    }
   
   
   
    public void start()   
    {
       
        while (true)     //Boucle qui se repete tant qu'il reste des coups a jouer et que personne ne gagne//
        {
            while (true)          //Boucle pour repeter le jeu a l'infini tant que l'applet n'est pas fermé//
            {   
                initialiser();   // initialisation du Tableau et du nombre de coups restants//
                int n=9;          //nombre de case vides a l'initialisation//
                int valeur;
                               
                if (n==0)    //On arrete la boucle si il ne reste plus de coups a jouer//
                {
                    partienulle();
                    break;
                }
               
               
                //On selectionne le joueur qui doit jouer//
                if (n==1 || n==3 || n==5 || n==7 || n==9)
                {
                    j1joue();
                }
                else
                {
                    j2joue();
                }
               
               
                valeur = verifier();  //On verifie après chaque coup si un joueur a gagné//
                if (valeur==1)
                {
                    j1gagne();
                    break;
                }
                else if (valeur==2)
                {   
                    j2gagne();
                    break;
                }
                else if(valeur==0)
                {
                    n=n-1;
                }
            }
        }
    }
   

    public void initialiser()
    {
        int i;
        int j;
           
        //Initialisation du tableau : on remplit toutes les cases avec un espace//
        for (i=0 ; i < 2 ; i++ )
        {
            for (j=0 ; j < 2 ; j++ )
            {
                montableau[i][j]=' ';
            }
        }
    }

    public int verifier() //Pour voir si quelqu'un a gagné//
    {
        int valeurretourne=3;
       
        //test des diagonales//
        if (montableau[0][0]==montableau[1][1] && montableau[1][1]==montableau[2][2] && montableau[1][1]!= ' ')
        {
            if (montableau[1][1]=='X')
            {
                valeurretourne=1;
            }
            else if(montableau[1][1]=='O')
            {
                valeurretourne=2;
            }
        }
        else if (montableau[2][0]==montableau[1][1] && montableau[1][1]==montableau[0][2] && montableau[1][1]!= ' ')
        {
            if (montableau[1][1]=='X')
            {
                valeurretourne=1;
            }
            else if(montableau[1][1]=='O')
            {
                valeurretourne=2;
            }
        }
       
        //Test des lignes horiszontales et verticales//
        for(int i=0 ; i < montableau.length ; i++)
        {
            if (montableau[i][0]==montableau[i][1] && montableau[i][1]==montableau[i][2] && montableau[i][1]!= ' ')
            {
                if (montableau[i][1]=='X')
                {
                    valeurretourne=1;
                }
                else if(montableau[i][1]=='O')
                {
                    valeurretourne=2;
                }
                else
                {
                    valeurretourne=0;
                }
            }
        }
        for(int j=0 ; j < montableau.length ; j++)
        {
            if (montableau[0][j]==montableau[1][j] && montableau[1][j]==montableau[2][j] && montableau[1][j]!= ' ')
            {
                if (montableau[1][j]=='X')
                {
                    valeurretourne=1;
                }
                else if(montableau[1][j]=='O')
                {
                    valeurretourne=2;
                }
                else
                {
                    valeurretourne=0;
                }
            }
        }
        return valeurretourne;
    }

    public void j1gagne()
    {
        j1.gagne=j1.gagne+1;
        zone.repaint();
    }
   
    public void j2gagne()
    {
        j2.gagne=j2.gagne+1;
        zone.repaint();
    }
   
    public void partienulle()
    {
        nulles=nulles+1;
        zone.repaint();
    }
   
    public void j1joue()
    {   
        //Boucle: tant qu'un joueur n'a pas cliqué sur une case vide, la boucle s'execute//
            addMouseListener(this);
            if (montableau[x][y]==' ')
            {
                montableau[x][y]='X';
               
            }
        zone.repaint();
       
    }
   
    public void j2joue()
    {
        //Boucle: tant qu'un joueur n'a pas cliqué sur une case vide, la boucle s'execute//
            addMouseListener(this);
            if (montableau[x][y]==' ')
            {
                montableau[x][y]='O';
               
            }
       
        zone.repaint();
    }
   
    public void mouseClicked(MouseEvent e) //Attente d'un clic du joueur//
    {
        int a,b;
        a=e.getX();
        b=e.getY();
       
        //Modification des coordonnées pour que (x,y) prenne la valeur des coordonnées dans le tableau//
        if (a<100)
        {
            x=0;
        }
        else if(a>100 && a<200)
        {
            x=1;
        }
        else if(a>300)
        {
            x=2;
        }
        if (b<175 && b>75)
        {
            y=0;
        }
        else if (b>175 && b<275)
        {
            y=1;
        }
        else if(b>275 && b<375)
        {
            y=2;
        }
       
    }
   
    public void mouseEntered(MouseEvent e) {}

    public void mouseExited(MouseEvent e) {}

    public void mousePressed(MouseEvent e) {}

    public void mouseReleased(MouseEvent e) {}
   
    public class Dessin extends Canvas
    {
        public void paint(Graphics g)
        {
            //Tracage de la grille et du titre//
            g.setColor(Color.black);
            g.drawRect(0, 75, 302, 302);
            g.drawRect(1, 76, 300, 300);
            g.drawRect(2, 77, 298, 298);
            g.drawLine(99, 75, 99, 377);
            g.drawLine(100, 75, 100, 377);
            g.drawLine(101, 75, 101, 377);
            g.drawLine(199, 75, 199, 377);
            g.drawLine(200, 75, 200, 377);
            g.drawLine(201, 75, 201, 377);
            g.drawLine(0, 174, 302, 174);
            g.drawLine(0, 175, 302, 175);
            g.drawLine(0, 176, 302, 176);
            g.drawLine(0, 274, 302, 274);
            g.drawLine(0, 275, 302, 275);
            g.drawLine(0, 276, 302, 276);
            Font fonte = new Font("ComicsansMS ",Font.BOLD,20);
            g.setFont(fonte);
            g.drawString("Jeu du Morpion",70,25);
            Font fonte2 = new Font("ComicsansMS ",Font.BOLD,10);
            g.setFont(fonte2);
            g.drawString("Par La Greca Raphael",95,40);
            Font fonte3 = new Font("ComicsansMS ",Font.BOLD,14);
            g.setFont(fonte3);
           
            //Tracage des scores//
            g.drawString("Le Joueur Toto a gagné :  " +j1.gagne +" fois.",10,400);
            g.drawString("Le Joueur Titi a gagné :  " +j2.gagne +" fois.",10,420);
            g.drawString("Il y'a eu :    " +nulles +" parties nulles.",10,440);
           
            //Tracage des croix et des cercles : si X dans mon tableau, trace CROIX//
            //Si O dans montableau, trace ROND//
            for (int i=0;i<montableau.length;i++)
            {
                for (int j=0; j<montableau[i].length;j++)
                {
                    if (montableau[i][j]=='X')
                    {
                        g.drawLine(10+100*i, 85+100*j, 90+100*i, 165+100*j);
                        g.drawLine(10+100*i, 165+100*j, 90+100*i, 85+100*j);
                    }
                    else if(montableau[i][j]=='O')
                    {
                        g.drawOval(50+100*i, 125+100*j, 80, 80);
                    }
                }
            }
        }
    }
}

<hr size="2" width="100%" />
Je vous remercie d'avance

5 réponses

KenZara Messages postés 112 Date d'inscription vendredi 24 décembre 2004 Statut Membre Dernière intervention 20 décembre 2011
15 oct. 2007 à 19:22
Bonsoir,

Ca aurait meilleur si tu nous avais filé aussi ta classe Joueur, mais bon, tu n'as pas dit quel genre d'erreur tu as? Est ce que ton appli tourne sans rien afficher? As tu essayé de mettre des System.out.println("") un peu partout pour voir à quel niveau ça plante. Tu n'as pas trop détailler, et avec la classe au moins j'aurais du mal à compiler.
Le problème provient peut être d'une boucle qui s'éternise.

Kenza
0
Raph382 Messages postés 14 Date d'inscription mercredi 10 octobre 2007 Statut Membre Dernière intervention 2 septembre 2015
15 oct. 2007 à 19:48
Bonjour, et merci de me repondre!!!

j'ai essayé de mettre des choses un peu partout pour voir ou ca plante, et ca plante dans start au moment ou le joueur 1 joue (quand j1joue() est lancé) et en fait ca m'affiche l'applet tout blanc et le processeur tourne (il est a 100% pour java) et ca prends environ 100Mo de memoire vive, ca me fais tout ramer et je suis obligé d'arreter le processus!!!
sinon je n'ai aucun message d'erreur a part un probleme de UID (je sait pas trop ce que c'est mais c'est juste une mise en garde).

Sinon voila la classe joueur :

<hr size="2" width="100%" />
class Joueur
    {
    String name;
    int gagne;
    public Joueur(String name)
        {
        this.name=name;
        this.gagne=0;
        }
    public int RetourneGagne()
        {
        int retourne=this.gagne;
        return retourne;
        }
    }
0
KenZara Messages postés 112 Date d'inscription vendredi 24 décembre 2004 Statut Membre Dernière intervention 20 décembre 2011
16 oct. 2007 à 17:46
Bonsoir,

Au fait, ton code déconne au niveau de ta méthode start(), en effet le fait de tourner en rond avec ta boucle while, ne te permet pas d'afficher ce qu'il y a ds ta classe Dessin ni d'écouter l'événement de click de la souris.
Ce qui serait bien, c'est de séparer ce qu'il y a ds la méthode paint de ta classe Dessin, je m'explique, ca serait bien d'avoir un paint ds ta classe Morpion qui te permet de dessiner ton tableau à 6cases. Ce tableau est permanent.
Ensuite, dans ta classe Dessin tu laisses ta méthode paint mais avec comme info ton graphics g, la position x et la position y et le type de dessin à dessiner (croix ou rond), donc il y aura un simple :
    public class Dessin extends Canvas{
        double x,y; // qui correspondant à tes postisions de tableau.
        int type; // 0 pour rond et 1 pour croix.
       void setPosition(double valX, double valY){
             x = valX;
             y = valY;       
       }

    void setType(int valT) {
           type = valT;
    }
    public void paint(Graphics g) {
       if (type == 0) {
            g.drawOval(50+100*x, 125+100*y, 80, 80);
        else {
            g.drawLine(10+100*x, 85+100*y, 90+100*x, 165+100*y);

            g.drawLine(10+100*x, 165+100*y, 90+100*x, 85+100*y);
        }
       }

Donc tu feras appel à ta méthode repaint de cette classe juste au cas ou lors de l'événement de souris [MouseClicked] tu as ce que tu cherches à trouver.

Autre point, dans ta méhode start [J'ai pas eu le temps de tout tester désolée] tu as un n qui équivaut toujours 9, ton joueur va jouer éternellement.

Là je te donne une première partie de ce que j'ai percu, faudrait tout de meme que je reteste chez moi. [N'hésite pas à te contacter au chat de CS]

Kenza
0
Raph382 Messages postés 14 Date d'inscription mercredi 10 octobre 2007 Statut Membre Dernière intervention 2 septembre 2015
16 oct. 2007 à 18:17
Salut, alors j'ai repris un peu tout, j'ai supprimé mes 2 while (je verrai comment je fais pour recommencer la partie plus tard), maintenant ca marche mais en fait il prends pas le click de souris en compte, il me met directement une croix dans la premiere case de mon tableau et ensuite m'incremente le nombre de parties nulles et s'arrete.
merci beaucoup de m'aider parce que la je galere!!

voila le code :

<hr size="2" width="100%" />
import java.awt.Graphics;
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;

public class Morpion extends Applet implements MouseListener
{
        Dessin zone=new Dessin();
        Joueur j1;
        Joueur j2;
        int nulles=0;
        int x;
        int y;
        char montableau[][];
   
        public void init()
        {
                //Creation des 2 joueurs et du Tableau//
                setSize(302,500);
                j1=new Joueur("Toto");
                j2=new Joueur("Titi");
                j1.gagne=0;
                j2.gagne=0;
                montableau= new char [3][3];
                zone.setSize(302,500);
               this.add(zone);
        }
   
   
   
    public void start()   
    {
        initialiser();   // initialisation du Tableau et du nombre de coups restants//
        char r='X';
        char s='O';
        jouer(r);
        jouer(s);
        jouer(r);
        jouer(s);
        jouer(r);
        jouer(s);
        jouer(r);
        jouer(s);
        jouer(r);
       
        nulles=nulles+1;
        zone.repaint();
        stop();
    }
   

    public void initialiser()
    {
        int i;
        int j;
           
        //Initialisation du tableau : on remplit toutes les cases avec un espace//
        for (i=0 ; i <= 2 ; i++ )
        {
            for (j=0 ; j <= 2 ; j++ )
            {
                montableau[i][j]=' ';
            }
        }
    }

    public void jouer(char t)
    {
        int valeur;
        zone.addMouseListener(this);
        if (montableau[x][y]==' ')
        {
            montableau[x][y]=t;
        }
        zone.repaint();   
        valeur = verifier();  //On verifie après chaque coup si un joueur a gagné//
        if (valeur==1)
        {
            j1.gagne=j1.gagne+1;
            zone.repaint();
            stop();
        }
        else if (valeur==2)
        {   
            j2.gagne=j2.gagne+1;
            zone.repaint();
            stop();
        }
    }
   
    public int verifier() //Pour voir si quelqu'un a gagné//
    {
        int valeurretourne=3;
       
        //test des diagonales//
        if (montableau[0][0]==montableau[1][1] && montableau[1][1]==montableau[2][2] && montableau[1][1]!= ' ')
        {
            if (montableau[1][1]=='X')
            {
                valeurretourne=1;
            }
            else if(montableau[1][1]=='O')
            {
                valeurretourne=2;
            }
        }
        else if (montableau[2][0]==montableau[1][1] && montableau[1][1]==montableau[0][2] && montableau[1][1]!= ' ')
        {
            if (montableau[1][1]=='X')
            {
                valeurretourne=1;
            }
            else if(montableau[1][1]=='O')
            {
                valeurretourne=2;
            }
        }
       
        //Test des lignes horiszontales et verticales//
        for(int i=0 ; i <= 2 ; i++)
        {
            if (montableau[i][0]==montableau[i][1] && montableau[i][1]==montableau[i][2] && montableau[i][1]!= ' ')
            {
                if (montableau[i][1]=='X')
                {
                    valeurretourne=1;
                }
                else if(montableau[i][1]=='O')
                {
                    valeurretourne=2;
                }
                else
                {
                    valeurretourne=0;
                }
            }
        }
        for(int j=0 ; j <= 2 ; j++)
        {
            if (montableau[0][j]==montableau[1][j] && montableau[1][j]==montableau[2][j] && montableau[1][j]!= ' ')
            {
                if (montableau[1][j]=='X')
                {
                    valeurretourne=1;
                }
                else if(montableau[1][j]=='O')
                {
                    valeurretourne=2;
                }
                else
                {
                    valeurretourne=0;
                }
            }
        }
        return valeurretourne;
    }

    public void mouseClicked(MouseEvent e) //Attente d'un clic du joueur//
    {
        int a,b;
        a=e.getX();
        b=e.getY();
       
        //Modification des coordonnées pour que (x,y) prenne la valeur des coordonnées dans le tableau//
        if (a<100)
        {
            x=0;
        }
        else if(a>100 && a<200)
        {
            x=1;
        }
        else if(a>300)
        {
            x=2;
        }
        if (b<175 && b>75)
        {
            y=0;
        }
        else if (b>175 && b<275)
        {
            y=1;
        }
        else if(b>275 && b<375)
        {
            y=2;
        }
       
    }
   
    public void mouseEntered(MouseEvent e) {}

    public void mouseExited(MouseEvent e) {}

    public void mousePressed(MouseEvent e) {}

    public void mouseReleased(MouseEvent e) {}

    public class Dessin extends Canvas
    {
        public void paint(Graphics g)
        {
            //Tracage de la grille et du titre//
            g.setColor(Color.black);
            g.drawRect(0, 75, 302, 302);
            g.drawRect(1, 76, 300, 300);
            g.drawRect(2, 77, 298, 298);
            g.drawLine(99, 75, 99, 377);
            g.drawLine(100, 75, 100, 377);
            g.drawLine(101, 75, 101, 377);
            g.drawLine(199, 75, 199, 377);
            g.drawLine(200, 75, 200, 377);
            g.drawLine(201, 75, 201, 377);
            g.drawLine(0, 174, 302, 174);
            g.drawLine(0, 175, 302, 175);
            g.drawLine(0, 176, 302, 176);
            g.drawLine(0, 274, 302, 274);
            g.drawLine(0, 275, 302, 275);
            g.drawLine(0, 276, 302, 276);
            Font fonte = new Font("ComicsansMS ",Font.BOLD,20);
            g.setFont(fonte);
            g.drawString("Jeu du Morpion",70,25);
            Font fonte2 = new Font("ComicsansMS ",Font.BOLD,10);
            g.setFont(fonte2);
            g.drawString("Par La Greca Raphael",95,40);
            Font fonte3 = new Font("ComicsansMS ",Font.BOLD,14);
            g.setFont(fonte3);
           
            //Tracage des scores//
            g.drawString("Le Joueur Toto a gagné :  " +j1.gagne +" fois.",10,400);
            g.drawString("Le Joueur Titi a gagné :  " +j2.gagne +" fois.",10,420);
            g.drawString("Il y'a eu :    " +nulles +" parties nulles.",10,440);
           
            //Tracage des croix et des cercles : si X dans mon tableau, trace CROIX//
            //Si O dans montableau, trace ROND//
            for (int i=0;i<=2;i++)
            {
                for (int j=0; j<=2;j++)
                {
                    if (montableau[i][j]=='X')
                    {
                        g.drawLine(10+100*i, 85+100*j, 90+100*i, 165+100*j);
                        g.drawLine(10+100*i, 165+100*j, 90+100*i, 85+100*j);
                    }
                    else if(montableau[i][j]=='O')
                    {
                        g.drawOval(50+100*i, 125+100*j, 80, 80);
                    }
                }
            }
        }
    }
}
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
KenZara Messages postés 112 Date d'inscription vendredi 24 décembre 2004 Statut Membre Dernière intervention 20 décembre 2011
16 oct. 2007 à 21:51
Bonsoir,

Eh bien, c'est simple, dans ta méthode jouer, il faut pas faire ça: 
if (montableau[x][y]==' '){
    montableau[x][y]=t;
 }
Je m'explique cette partie de code est préférable de mettre dans ton mouseClicked, ou tu mettras un repaint aprés.
Parce que si tu le mets dans jouer, les modifications de x et de y ne seront pas vraiment prises en compte.
Autre chose que je te suggère de faire est de mettre une même variable, par exemple t, qui prendra à tour de rôle la valeur (X et O). comme ça dans ton mouseClicked il reconnaitra ton t.
Dans ce syle:
char r; <-- déclaré dans ta classe principale.
r='X';
jouer(r);
r='O';
jouer(r);
dans là à noter que ton r sera le tour de rôle de tes joueurs.
Ensuite, tu auras dans ton mouseClicked, tout à la fin.
       if (montableau[x][y]==' ')
        {
          montableau[x][y]=r;
        }
        zone.repaint();
Par contre, je pense qu'il faut revoir un peu la position de tes croix et ronds, enfin bref, essaie d'abord de ne pas reproduire ton anomalie.

Kenza
0
Rejoignez-nous