Bonjour,
Maintenant je vois le bout de ma bataille navale (avant d'attaque l'interface graphique ... ) et je suis dans les tests.
J'ai donc créé une grille de dimension 10x10x2 (GrilleJeu(10)), le x2 sert à l'identifiant du joueur, plutôt que de faire 2 grilles, on ne fait qu'une grille a 3 coordonnées, l'identifiant du joueur 1 est donc 0 et l'identifiant du joueur 2 est 1. Puis je lance mes tirs entre 0 et 9.
Ma bataille navale comporte des Malus et des Bonus, ici premier tir, un Malus et la BIM ArrayIndexOutOfBoundException : 9. Je ne comprend pas, je suis les erreurs et ça me ramène à la méthode valeurGrille (int i, int j, in k) où ils me disent ça !!! Le choque !! Je ne sais pas pourquoi car le premier tir était aux coordonnées (3,5)
Je vous mets le code progressivement :
On lance le tour :
Cela nous envoi au Malus tirSursaCarte() : (problème à la ligne 32 sur la méthode enregistrePosTouche())
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 if(joueur1.getListeCo().vide() == false){ System.out.println(joueur1.getPseudo()+" en place"); untour1 = new UnTour(joueur1,joueur2,grille); untour1.tour();
On suit les erreur, on arrive à la classe Navires dans la méthode : (erreur ligne 12 qui nous renvoi à la méthode valeurGrille(i,j,k)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55 // Méthode qui renvoi le tir du joueur sur sa propre carte public void tirSurSaCarte(){ // Déclaration des variables utiles int k = 0; int abs = 0; int ord = 0; String nomNavire = null; int coorddetir[] = new int[2]; boolean verif[] = new boolean[17]; boolean coule; //Début du programme //phase de tir coorddetir = super.tirGrille(super.joueur); System.out.println("Mince! Le missile est parti sur ta carte"); //Vérifie si un navire est touché et/ou coulé k = 0; coule = false; for (int i=0;i<super.joueur.getListeBat().getTailleLisNav();i++){ for(int j=0;j<super.joueur.getListeBat().donneElement(i).getTaille();j++){ verif[k]=super.joueur.getListeBat().donneElement(i).getPositionTouche()[j]; k=k+1; } } k = 0; nomNavire = null; for (int i=0;i<super.joueur.getListeBat().getTailleLisNav();i++){ super.joueur.getListeBat().donneElement(i).enregistrePosTouché(super.grille, super.joueur.getIdGrille()); for(int j=0;j<super.joueur.getListeBat().donneElement(i).getTaille();j++){ if(verif[k]!=super.joueur.getListeBat().donneElement(i).getPositionTouche()[j]){ nomNavire = super.joueur.getListeBat().donneElement(i).getNomNavire(); abs = coorddetir[0]; ord = coorddetir[1]; } k=k+1; if(super.joueur.getListeBat().donneElement(i).estIlCoule() == true){ coule = true; super.joueur.getListeCo().suprCoord(super.joueur.getListeCo().donneElement(i)); } } } if(nomNavire != null && coule == false){ System.out.println("Aïe.. tu as touché ton "+nomNavire+" aux coordonnées ("+abs+","+ord+")"); } else if(nomNavire != null && coule == true){ System.out.println("C'est dommage mais tu as coulé ton "+nomNavire); } else{ System.out.println("Attention ... Ouf ! Tu n'as rien touché ! C'est pas passé loin pourtant !"); } }
Et enfin méthode valeurGrille qui me dit que je suis en dehors de mes limites :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35 // Méthode qui enregistre la boolean de la grille où le joueur à tiré dans le tableau des positions touchées public void enregistrePosTouche(GrilleJeu grille,int id){ int abs=0; int ord=0; // Si les abscisses sont égales if (this.joueur.getListeCo().donneElement(this.joueur.getListeBat().positionBat(this))[0][0]==this.joueur.getListeCo().donneElement(this.joueur.getListeBat().positionBat(this))[1][0]){ abs=this.joueur.getListeCo().donneElement(this.joueur.getListeBat().positionBat(this))[0][0]; for(int i=0; i<this.taille; i++){ if(this.joueur.getListeCo().donneElement(this.joueur.getListeBat().positionBat(this))[0][1]<this.joueur.getListeCo().donneElement(this.joueur.getListeBat().positionBat(this))[1][1]){ ord=this.joueur.getListeCo().donneElement(this.joueur.getListeBat().positionBat(this))[0][1]+i; this.positionTouche[i]=grille.valeurGrille(abs, ord,id); } else{ ord=this.joueur.getListeCo().donneElement(this.joueur.getListeBat().positionBat(this))[0][1]-i; this.positionTouche[i]=grille.valeurGrille(abs, ord,id); } } } // Si les ordonnées sont égales if (this.joueur.getListeCo().donneElement(this.joueur.getListeBat().positionBat(this))[0][1]==this.joueur.getListeCo().donneElement(this.joueur.getListeBat().positionBat(this))[1][1]){ ord=this.joueur.getListeCo().donneElement(this.joueur.getListeBat().positionBat(this))[0][1]; for(int i=0; i<this.taille; i++){ if(this.joueur.getListeCo().donneElement(this.joueur.getListeBat().positionBat(this))[0][0]<this.joueur.getListeCo().donneElement(this.joueur.getListeBat().positionBat(this))[1][0]){ abs=this.joueur.getListeCo().donneElement(this.joueur.getListeBat().positionBat(this))[0][0]+i; this.positionTouche[i]=grille.valeurGrille(abs, ord,id); } else{ abs=this.joueur.getListeCo().donneElement(this.joueur.getListeBat().positionBat(this))[0][0]-i; this.positionTouche[i]=grille.valeurGrille(abs, ord,id); } } } }
Voila.. Donc j'ai cherché une erreur dans le positionnement, pour ça j'ai fais afficher les coordonnées avant d'utiliser valeurGrille et ça plante aux coordonnées (7,9,1) qui existent normalement dans ma grille...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 //Renvoie la valeur de la grille aux coordornées voulues public boolean valeurGrille(int i, int j, int k){ return grille[i][j][k];
Je ne comprend pas ! Une solution serait vraiment la bienvenue !
Laure
Partager