loic77410
-
Modifié par BunoCS le 4/05/2015 à 09:02
KX
Messages postés16705Date d'inscriptionsamedi 31 mai 2008StatutModérateurDernière intervention 5 juin 2023
-
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 !");
}
}
}
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).
KX
Messages postés16705Date d'inscriptionsamedi 31 mai 2008StatutModérateurDernière intervention 5 juin 2023126 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...
3 mai 2015 à 20:48
Il suffit donc que j'ajoute -1 ?
3 mai 2015 à 20:50
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...