Programme Java

Résolu/Fermé
oliver3923 Messages postés 971 Date d'inscription vendredi 14 mai 2010 Statut Membre Dernière intervention 15 novembre 2014 - Modifié par oliver3923 le 10/12/2011 à 11:35
oliver3923 Messages postés 971 Date d'inscription vendredi 14 mai 2010 Statut Membre Dernière intervention 15 novembre 2014 - 10 déc. 2011 à 16:37
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é

A voir également:

3 réponses

KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
10 déc. 2011 à 13:31
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.
0
oliver3923 Messages postés 971 Date d'inscription vendredi 14 mai 2010 Statut Membre Dernière intervention 15 novembre 2014 143
10 déc. 2011 à 14:07
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
0
oliver3923 Messages postés 971 Date d'inscription vendredi 14 mai 2010 Statut Membre Dernière intervention 15 novembre 2014 143
10 déc. 2011 à 14:45
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
0
oliver3923 Messages postés 971 Date d'inscription vendredi 14 mai 2010 Statut Membre Dernière intervention 15 novembre 2014 143
10 déc. 2011 à 15:04
j'ai encore une question sur la suite

j'ai codé toutes mes classes et j'ai un problème avec mon nullPointerException

j'initialise deux variables aléatoirement pour avoir des coordonnées de ma matrice pour placer un jeton une bombe ou un obstacle et je vérifie si la matrice possède déja un objet sur cette case et le compilateur me renvoie nullPointerException

    l = (int)(Math.random() * NB_CASES_HAUT);
            c = (int)(Math.random() * NB_CASES_LARG);

            if (caseLibre(l, c)) {


dans le if je compare un compteur de jeton au nombre de jeton demandé si tout les jetons sont la je fais pareil avec les obstacles pour avec les bombes

la fonction caseLibre :

 public boolean caseLibre(int l, int c) {

	return (matObj[l][c] == null);

    }


je ne vois pas d'ou vient mon erreur
si la matrice est a null on renvoie vrai sinon on renvoie faux donc je ne vois pas pourquoi j'ai ce problème
cette fonction est quasiment identique a celle de la version précédente (la seule différence est qu'avant elle renvoyait vrai si la case était déja occupée) et elle marchait avant
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
10 déc. 2011 à 15:28
1) Il n'y a apriori pas d'erreur dans ces deux morceaux de code, il faudrait lire précisément l'exception pour savoir d'où cela vient, si tu m'avais dit IndexOutOfBoundsException encore j'aurais su, mais NullPointerException je ne vois aucune raison ici...
2) Au lieu de faire (int)(Math.random() * NB...); tu peux utiliser un objet Random et utiliser nextInt(NB...)
0
oliver3923 Messages postés 971 Date d'inscription vendredi 14 mai 2010 Statut Membre Dernière intervention 15 novembre 2014 143
10 déc. 2011 à 15:58
Exception in thread "main" java.lang.NullPointerException
	at Damier.caseLibre(Damier.java:87)
	at Damier.initMat(Damier.java:56)
	at GoJeton.jeux(GoJeton.java:29)
	at JetonFou.main(JetonFou.java:32)



voici l'erreur complète
la ligne 87 correspond au retour de caseLibre dans mon poste d'avant
la ligne 56 correspond a son appel dans la condition

GoJeton ligne 29 correspond a l'appel de initMat() dans la fonction jeux() de GoJeton
et dans JetonFou c'est l'appel de la fonction jeux()


initMat() et la fonction que j'ai expliqué plus haut si tu veux le code complet je peux te le mettre ici mais il n'y a rien avant a part la déclaration des attributs et l'initialisation pour certains (les compteurs de jetons bombes et obstacles)

c'est pour ca que je ne vois pas ou est le problème
j'avais déja eu ce genre d'erreur dans la version précédente mais a chaque fois c'était une erreur d'indice j'essayais d'appeler une fonction de Jeton alors que j'étais sur une case qui n'en possédait pas

pour l'objet Random j'aurais pu effectivement mais je ne savais pas trop ce qui était le plus propre donc j'ai mis le plus simple
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
Modifié par KX le 10/12/2011 à 16:10
Les seules possibilités de NullPointerException sur cette ligne c'est que matObj==null ou matObj[l]==null

public boolean caseLibre(int l, int c) 
{ 
    if (matObj==null) 
        System.err.printf("matObj est null"); 
    else if (matObj[l]==null) 
        System.err.printf("matObj[%d] est null",l); 

    return (matObj[l][c] == null); 
}

Utiliser nextInt c'est plus propre, ça évite de faire une conversion d'un double en int puisque cela te donne directement un nombre entier. En plus cela t'évite de faire la multiplication puisque l'entier sera choisi entre 0 et n-1 lorsque n est le paramètre que tu lui passes.
0
oliver3923 Messages postés 971 Date d'inscription vendredi 14 mai 2010 Statut Membre Dernière intervention 15 novembre 2014 143
10 déc. 2011 à 16:15
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
0