Programme Java

[Résolu/Fermé]
Signaler
Messages postés
971
Date d'inscription
vendredi 14 mai 2010
Statut
Membre
Dernière intervention
15 novembre 2014
-
Messages postés
971
Date d'inscription
vendredi 14 mai 2010
Statut
Membre
Dernière intervention
15 novembre 2014
-
Bonjour,

j'ai un problème avec un programme que je dois faire comme projet a la fac

le but est qu'on créer un damier possèdant des jetons, des obstacles et des bords

lorsque 2 jetons entrent en collisions, un perd un points de vie et l'autre en gagne un
0PV = on supprime le jeton
5PV = on dupplique le jeton

si un jeton touche une bombe elle explose et supprime tout les jetons situées sur les cases autour (de 1 ligne avant a 1 ligne après pareil pour les colonnes)

si un jeton arrive sur un obstacle on change sa direction (pareil pour les bords du damier)


pour ces trois objets j'ai créé une classe ObjetDamier qui possède juste un attribut typeObjet (de type int) et 3 classes qui hérite de ObjetDamier


j'ai aussi une classe Damier pour gérer les objets (déplacement suppression...) et une classe GoJeton qui instancie Damier et appelle certaine fonction de Damier dans le bon ordre (toString, deplaceJeton...)


mais j'ai pas mal de problèmes à la compilation

au début avec juste mon attribut et une fonction getTypeObj() dans ObjetDamier mon compilateur ne trouvait aucune des fonctions que j'appelle depuis Damier (j'ai placé mes objets dans une matrice et j'appelle les fonctions en faisant matObj[i][j].getDirX par exemple)

j'ai donc déclaré ma classe ObjetDamier en abstraite et j'ai rajouté le prototype des méthodes en me disant que le compilateur essayait peut être de les trouver ici avant d'aller dans la bonne classe

j'obtient une erreur :

Obstable.java:1: class Obstacle is public, should be declared in a file named Obstacle.java 
public class Obstacle extends ObjetDamier{


sauf que j'ai bien déclaré Obstacle dans un fichier Obstacle.java

j'ai vérifié mon cours et normalement il faut mettre la signature des méthodes et pas le prototype mais si je fais ca il me dit ; expected pour chaque méthode


si j'essaye de mettre le corps de la méthode (juste { }) il me dit que les méthodes ne doivent pas avoir de corps dans une classe abstraite

et si j'essaie de ne pas la mettre en abstraite j'obtient le même résultat avec une erreur de plus

Obstable.java:1: class Obstacle is public, should be declared in a file named Obstacle.java 
public class Obstacle extends ObjetDamier{ 
       ^ 
ObjetDamier.java:1: ObjetDamier is not abstract and does not override abstract method getExplosion() in ObjetDamier 
public /*abstract*/ class ObjetDamier {


la seconde c'est la première fois que je la vois et je ne sais pas ce qu'elle veut dire


je vous met ici le code de ces 4 classes :

ObjetDamier :

public /*abstract*/ class ObjetDamier { 

    // Attribut                                                                                                   
    protected int obj; 

    /* L'attribut "obj" sert a détérminer de quel type exact de l'objet                                           
       1 = Jeton                                                                                                  
       2 = Bombe                                                                                                  
       3 = Obstacle                                                                                               
    */ 


    // Constructeur                                                                                               

    ObjetDamier(int typeObj) { 

        this.obj = typeObj; 
    } 

    // Méthode                                                                                                    
    public abstract int getTypeObj();/*{                                                                          
                                                                                                                  
        return obj;                                                                                               
        }//*/ 

    //*                                                                                                           
    abstract void setEstDejaDeplace(int dejaDeplace);//{}                                                         
    abstract void modifPV(int pv);//{}                                                                            
    abstract void newDir();//{}                                                                                   
    abstract void setPV(int ptsVie);//{}                                                                          
    abstract int getDirX();//{}                                                                                   
    abstract int getDirY();//{}                                                                                   
    abstract int getPV();//{}                                                                                     
    abstract boolean getEstDejaDeplace();//{}                                                                     
    abstract int getExplosion();//{}                                                                              
    // */                                                                                                         
} // Fin de la classe



Jeton :
public class Jeton extends ObjetDamier{ 

    // Attributs                                                                                                  

    private Direction dir = new Direction(); 
    private int ptsVie = 1; 
    private boolean estDejaDeplace = false, collisionDejaGeree = false; 


    // Constructeur                                                                                               

    Jeton() { 

        super(1); 
    } 

    public int getTypeObj() { 

        return super.obj; 
    } 


    public int getExplosion() { 
    } 


    // Methodes                                                                                                   

    // Getter                                                                                                     

    public int getDirX() { 

        return dir.getX(); 
    } 

   public int getDirY() { 

        return dir.getY(); 
    } 

    public int getPV() { 

        return ptsVie; 
    } 

     public boolean getEstDejaDeplace() { 

         return estDejaDeplace; 
     } 

    // Setter                                                                                                     

    public void setPV(int ptsVie) { 

        this.ptsVie = ptsVie; 
    } 

public void setEstDejaDeplace(int dejaDeplace) { 

        estDejaDeplace = (dejaDeplace == 1) ? true : false; // condition ternaire                                 
    } 

    // Autres méthodes                                                                                            

    public void newDir() { 

 dir.hasardDir(); 
    } 

    public void modifPV(int pv) { 

 ptsVie += pv; 
    } 

}



Bombe :

public class Bombe extends ObjetDamier { 

    // Attribut                                                                                                   

    int tourExplosion; 

    // Constructeur                                                                                               

    Bombe(){ 

        super(2); 
        this.tourExplosion = (int)(Math.random() *20); 
    } 

    // Methodes                                                                                                   

    public int getTypeObj() { 

 return obj; 
    } 


    public int getExplosion() { 

 return this.tourExplosion; 
    } 

    public void setEstDejaDeplace(int dejaDeplace){ 
    } 

    public void modifPV(int pv) { 
    } 

    public void newDir(){ 
    } 

public void setPV(int ptsVie) { 
    } 

    public int getDirX() { 
    } 

    public int getDirY() { 
    } 

    public int getPV() { 
    } 

    public boolean getEstDejaDeplace() { 
    } 
} 



Obstacle :

public class Obstacle extends ObjetDamier{ 

    // Constructeur                                                                                               

    Obstacle() { 

        super(3); 
    } 

    public int getTypeObj() { 

        return super.obj; 
    } 

} 





pour les classes Jeton et Bombe elles possèdent l'esemble des fonctions (même si elles ne les utilisent pas) pour éviter qu'elles soient en abstract aussi

Obstacle les possédait aussi je les ai enlevé pour voir si ca changeait quelque chose


pour ObjetDamier faites pas attention au com qui se baladent un peu partout et qui sont inutiles c'était juste pour cherche en enlevant rapidement les fonctions, le corps des fonction le abstract...
pour les retours a la ligne au milieu des signatures de fonctions... ca vient juste du copier collé je ne les ai pas dans mon code

voila merci d'avance pour votre aide en espérant que quelqu'un trouve pourquoi ca ne marche pas pcq moi je suis bloqué

3 réponses

Messages postés
16373
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
4 août 2021
2 861
Je reprends ton code dans l'ordre où je l'ai sous les yeux :

1) Vu ce que tu cherches à faire, je te conseilles de conserver ObjetDamier abstract, mais cela ne t'empêche pas d'implémenter tout ou partie des méthodes qu'elle contient (une classe abstract ne contient pas forcément que des méthodes abstract)
2) Dans Jeton, getExplosion() doit renvoyer une valeur (un int) pour que cela compile.
3) Dans Bombe pareil avec getDirX, getDirY, getPV, et getDejaDePlace.
Remarque : typiquement des méthodes comme getDirX, et getDirY pourraient être implémenté par ta superclasse ObjetDamier.
4) Dans Obstacle, tu dois implémenter toutes les méthodes laissées abstract dans ObjetDamier, remarque : je te conseilles d'ajouter l'annotation @Override lorsque tu modifies une méthode héritée, cela te permet de mieux les distinguer des méthodes créées spécifiquement pour ta classe.
5) Pour ton erreur "should be declared in a file named Obstacle.java", je revérifierai encore une fois le nom de ton fichier (peut-être un espace qui se promène ou alors un Obstacle.java.java), éventuellement supprimes le et crées en un nouveau avec le bon nom.
6) Au vue de toutes tes erreurs j'imagine que tu n'utilises pas d'IDE (Eclipse, NetBeans...) c'est regrettable parce que toutes ses erreurs là tu les verrais immédiatement.
Messages postés
971
Date d'inscription
vendredi 14 mai 2010
Statut
Membre
Dernière intervention
15 novembre 2014
143
bonjour

d'abord merci pour tes réponses

je vais regarder pour les 4 premières remarques (je ne connaissais pas @override mais je vais le rajouter)

pour Obstacle.java j'ai verifié une dizaine de fois et j'ai déja essayé de supprimer la classe et de la recoder

est-il possible que cela vienne d'un autre bug comme ca arrive parfois


effectivement je n'utilise pas d'IDE je suis sur emacs

je te redis si j'arrive a améliorer tout ca

merci encore
Messages postés
971
Date d'inscription
vendredi 14 mai 2010
Statut
Membre
Dernière intervention
15 novembre 2014
143
ca y est j'ai finit de rajouter tout ca est ca marche

l'erreur pour le nom du fichier a disparue (je ne sais pas pourquoi mais je ne vais pas me plaindre^^)

les dernières erreurs sont du a l'exécution (nullPointerException ou des trucs dans le genre)


merci beaucoup pour ton aide
Messages postés
971
Date d'inscription
vendredi 14 mai 2010
Statut
Membre
Dernière intervention
15 novembre 2014
143
alors la j'avoue que je comprend pas ton code

comment fait tu pour comparer la matrice a null avec 0 ou 1 indice?

pour le random compris je changerai merci pour le conseil
Messages postés
16373
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
4 août 2021
2 861
Est-ce que l'un des deux affichages apparaît juste avant le message d'exception ?
Messages postés
971
Date d'inscription
vendredi 14 mai 2010
Statut
Membre
Dernière intervention
15 novembre 2014
143
oui ca me donne matObj est null suivit de l'erreur
Messages postés
16373
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
4 août 2021
2 861
C'est que tu as donc oublié d'initialiser matObj. Je ne sais pas de quel type elle est, mais à un moment tu dois faire : matObj = new LeType[unEntier][unEntier];

Par exemple int[][] matObj = new int[3][4];

Si tu ne fais pas ça, matObj (qui est un objet tableau) n'est pas initialisé et vaut donc null, c'est pour ça que je testait si matObj==null, après tu aurais pu faire int[][] matObj = new int[3];
Dans ce cas matObj est bien initialisé, et matObj[l] existe, c'est un objet tableau mais il n'est pas initialisé et il vaut donc null, c'est pour ça que je testait matObj[l]==null.

Et enfin, mais tu l'as compris, matObj[l][c] peut exister et être null malgré tout, c'est d'ailleurs le but de ta méthode caseLibre.
Messages postés
971
Date d'inscription
vendredi 14 mai 2010
Statut
Membre
Dernière intervention
15 novembre 2014
143
oups... effectivement je l'ai déclaré mais pas initialisé

merci pour ton aide
je met en résolu