Programme Java
Résolu
oliver3923
Messages postés
1059
Statut
Membre
-
oliver3923 Messages postés 1059 Statut Membre -
oliver3923 Messages postés 1059 Statut Membre -
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 :
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
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 :
Jeton :
Bombe :
Obstacle :
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é
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:
- Programme Java
- Jeux java itel - Télécharger - Jeux vidéo
- Waptrick java football - Télécharger - Jeux vidéo
- Eclipse java - Télécharger - Langages
- Waptrick java voiture - Télécharger - Jeux vidéo
- Java apk - Télécharger - Langages
3 réponses
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.
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.
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
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
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
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
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
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 :
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
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
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...)
2) Au lieu de faire (int)(Math.random() * NB...); tu peux utiliser un objet Random et utiliser nextInt(NB...)
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
Les seules possibilités de NullPointerException sur cette ligne c'est que matObj==null ou matObj[l]==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.
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.