Java.lang.ArrayIndexOutOfBoundsException [Résolu]

loic77410 - 3 mai 2015 à 20:35 - Dernière réponse : KX 15776 Messages postés samedi 31 mai 2008Date d'inscriptionModérateurStatut 17 octobre 2018 Dernière intervention
- 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 !");
  }
 }
}
Afficher la suite 

Votre réponse

3 réponses

KX 15776 Messages postés samedi 31 mai 2008Date d'inscriptionModérateurStatut 17 octobre 2018 Dernière intervention - 3 mai 2015 à 20:44
0
Merci
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).
Merci !
Il suffit donc que j'ajoute -1 ?
KX 15776 Messages postés samedi 31 mai 2008Date d'inscriptionModérateurStatut 17 octobre 2018 Dernière intervention - 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...
Commenter la réponse de KX

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.