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 :
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();
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
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 !");
			}
		}
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
// 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);
				}
			}
		}
	}
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
	//Renvoie la valeur de la grille aux coordornées voulues
		public boolean valeurGrille(int i, int j, int k){
			return grille[i][j][k];
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...

Je ne comprend pas ! Une solution serait vraiment la bienvenue !

Laure