Java.lang.ArrayIndexOutOfBoundsException

Résolu
loic77410 - Modifié par BunoCS le 4/05/2015 à 09:02
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 - 3 mai 2015 à 20:50
Bonjour, un message d'erreur apparaît lorsque j'éxécute mon programme :
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 6
 at Program.principale.compte(principale.java:124)
 at Program.principale.estCeGagné(principale.java:155)
 at Program.principale.main(principale.java:188)

je ne sais pas à quoi cela est du
merci de m'aider rapidement, c'est urgent voici mon code source :
package Program;

import java.util.Scanner;

public class principale {
 private static Scanner clavier = new Scanner(System.in);
 private final static int VIDE = 0;
 private final static int JAUNE = 1;
 private final static int ROUGE = 2;
 
 //initialisation de la grille
 static void initialise(int[][] grille)      
 {
  //attribution de la valeur VIDE à toutes les cases du tableau
  for(int i = 0; i < grille.length; i++){      
  
   for(int j = 0; j < grille[i].length; j++) {   
   grille[0][j] = VIDE;
       
   }
  }
 }
 
 //affichage de la grille : O pour une case rouge, X pour une case jaune
 static void affiche(int[][] grille)        
 {
  System.out.println();
  //ensemble des cellules sur chaque lignes
  for(int[] ligne : grille){         
   System.out.print(" |");         
   
   for(int cellule : ligne){
    
    if(cellule == VIDE){
     System.out.print(" ");
    } 
     else if (cellule == ROUGE){
     System.out.print("O");
    } else {
     System.out.print("X");
    }
    System.out.print("|");
   }
   System.out.println();
  }

 }
 
 static boolean joue(int[][] grille, int colonne, int couleur)  
 {
  //si le numéro de colonne n'est pas valide alors le coup ne l'est pas :
  if(colonne >= grille[0].length){
   return false;
  }
  /*on parcourt la colonne en partant du bas jusqu'à trouver une case vide
    ou jusqu'en haut si la colonne est pleine 


*/
  int ligne = grille.length -1;       
  
  //on arrête la boucle lorqu'elle sort de la grille avec if
  boolean pleine = false;
  while ((!pleine) && grille[ligne][colonne] != VIDE){
   if (ligne == 0){
    pleine = true;
   } else {
    --ligne;
   }
  }
  
  //on remplit la case vide trouvée si la colonne n'est pas pleine sinon le coup est refusé
  if(!pleine){
   grille [ligne][colonne] = couleur;
   return true;
  } else {
   return false;
  }
        
 }
 
 static void demandeEtJoue(int[][] grille, int couleurJoueur)
 {
  boolean valide;
  do {
  if(couleurJoueur == JAUNE){
   System.out.println("Joueur X : entrer un numéro de colonne");
  } else {
   System.out.println("Joueur O : entrer un numéro de colonne");
  }
 
  int colonne = clavier.nextInt();
  //les indices des tableaux commencent à 0
  --colonne;
  
  valide = joue(grille, colonne, couleurJoueur);
  if(!valide){
   System.out.println("Ce coup n'est pas valide");
  }
      } while(!valide);
  
 }

 static boolean plein(int[][] grille)
 {
  //Si on trouve une case vide sur la première ligne, alors la grille n'est pas pleine
  for(int cellule : grille[0]) {
   if(cellule == VIDE) {
    return false;
   }
  }
  //Sinon la grille est pleine
  return true;
 }
 
 static int compte(int[][] grille, int ligneDepart, int colonneDepart, int dirLigne, int dirColonne )
 {
  int compteur = 0;
  
  int ligne   = ligneDepart;
  int colonne = colonneDepart;
  
  /* on part de la case de depart(ligneDepart, colonneDepart) et on parcout la grille dans la direction


*  donnée par (dirLigne, dirColonne) tant que l'on trouve des pions de la même couleur

*/
  while(grille[ligne][colonne] == grille[ligneDepart][colonneDepart]){
   
   ++compteur;
   ligne   = ligne   + dirLigne;
   colonne = colonne + dirColonne;
  }
  
  return compteur;
 }
 
 
 static boolean estCeGagné(int[][] grille, int couleurJoueur) 
 {
  //on compte le nombre de pions alignés avec celui qui vient d'être joué dans 4 directions
  for (int ligne = 0; ligne < grille.length; ligne++) {
   for (int colonne = 0; colonne < grille[ligne].length; colonne++) {
    int couleurCase = grille[ligne][colonne];
    
    if (couleurCase == couleurJoueur){
     if(
      //diagonale en haut à droite
      (ligne >= 3 && colonne <= grille[ligne].length - 4 &&
      compte(grille, ligne, colonne, -1, +1) >=4)  ||
      //horizontalement vers la droite
      (colonne <= grille[ligne].length - 4 &&
      compte(grille, ligne, colonne, 0, +1) >=4)  ||
      //diagonale en bas à droite
      (ligne <= grille.length - 4 && colonne <= grille[ligne].length - 4 &&
      compte(grille, ligne, colonne, +1, +1) >=4)  ||
      //verticalement vers le bas
      (ligne <= grille.length - 4 &&
      compte(grille, ligne, colonne, +1, 0) >=4)
      
      ) {
      
      //si le nombre de pions de la même couleur est >= à 4 alors le joueur gagne
      return true;
     } 
    }
   }
   
  } // si on a parcouru toute la grille sans trouver 4 pions de la même couleur alors la partie continue 
   return false;
   
  }
 
 
 
 
 
 public static void main(String[] args)
 {
 int [][] grille = new int[6][7];
 
 initialise(grille);
 affiche(grille);
 
 int couleurJoueur = JAUNE;
 boolean gagne;
 do {
  demandeEtJoue(grille, couleurJoueur);
  
  affiche(grille);
  
  gagne = estCeGagné(grille, couleurJoueur);
  
  //on change la couleur pour celle de l'autre joueur
  if(couleurJoueur == JAUNE){
   couleurJoueur = ROUGE;
  } else {
   couleurJoueur = JAUNE;
   } 
  } while (!gagne && !plein(grille));
  if(gagne) {
   if(couleurJoueur == JAUNE){
    System.out.println("Le joueu O a gagné");
   } else {
    System.out.println("Le joueu X a gagné");
   }
  } else {
    System.out.println("Match nul !");
  }
 }
}

1 réponse

KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 127
3 mai 2015 à 20:44
Bonjour,

"je ne sais pas à quoi cela est du"
C'est pourtant marquer dans le message d'erreur...

at Program.principale.compte(principale.java:124)

C'est à dire sur cette ligne :
while(grille[ligne][colonne] == grille[ligneDepart][colonneDepart]){

Tu as un
ArrayIndexOutOfBoundsException: 6
ce qui signifie que tu accèdes à la case 6 d'un tableau dans lequel la case 6 n'existe pas (remarque : un tableau de taille 6 autorisent un accès aux cases de 0 à 5... pas 6).
0
Merci !
Il suffit donc que j'ajoute -1 ?
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 127
3 mai 2015 à 20:50
Pas forcément, il faut regarder en détail ce qui se passe. Faire -1 risque de transformer les 0 en -1 et tu auras la même erreur.
Tu as peut-être mélangé tes deux tableaux aussi, il y en a de taille 6, l'autre de 7, tu as peut-être interverti les deux indices...
0
Rejoignez-nous