Erreur java.lang.ArrayIndexOutOfBoundsException: 5
arthur
-
KX Messages postés 16761 Date d'inscription Statut Modérateur Dernière intervention -
KX Messages postés 16761 Date d'inscription Statut Modérateur Dernière intervention -
Bonjour,
Dans le cadre de mes cours je dois réaliser un jeux Donjon RPG et je bute sur un problème de déplacement du joueur.
Voici mon main principale ou mon erreur se produit :
Ligne player.move(room.doorsList); C'est ici mon problème</code>
Voici le code de la méthode en question :
public void
Le problème est que le playerPlacement[i+1][j] sort du tableau lorsque la valeur de i est de 4
De même pour le j
Je n'arrive pas à palier ce problème sans casser le déplacement du joueur.
Si quelqu'un avait des idées et pouvait m'aider ce serait cool.
Merci.
Dans le cadre de mes cours je dois réaliser un jeux Donjon RPG et je bute sur un problème de déplacement du joueur.
Voici mon main principale ou mon erreur se produit :
while(enJeu == false) { int menu; // INTRODUCE System.out.println("Welcome to Dungeonquest" + "\n"); System.out.println("To see rules, type 1"); System.out.println("To play game, type 2"); System.out.println("To leave, type 3"); Set<Integer> valuesPossibles = new HashSet<>(); valuesPossibles.add(1); valuesPossibles.add(2); valuesPossibles.add(3); menu = Interaction.lireEntierParmi(valuesPossibles); switch (menu) { case 1: System.out.println("bite"+"\n"); System.out.println("\n"); break; case 2: //BEGIN OF THE GAME playerPlacement[4][2] = 1; System.out.println("You enter by the big door of dungeon"); System.out.print("\n" + "\n" + "Your placement in the dungeon :" + "\n"); for (int i = 0; i < 5; i++) { for (int j = 0; j < 5; j++) { System.out.print(playerPlacement[i][j] + "\t"); } System.out.println(); } System.out.println(); while (player.bigTreasure == false || player.smallTreasure == false) { /** * Research of placement player */ for (int i = 0; i < 5; i++) { for (int j = 0; j < 5; j++) { if (playerPlacement[i][j] == 1) { Room room = dungeonGrid[i][j]; /** * Detection of doors in room where is the player */ player.doorDetection(room.doorsList); player.move(room.doorsList); } } } /** * Choice of direction, player move in another room */ System.out.print("\n" + "\n" + "Your placement in the dungeon :" + "\n"); for (int i = 0; i < 5; i++) { for (int j = 0; j < 5; j++) { System.out.print(playerPlacement[i][j] + "\t"); } System.out.println(); } System.out.println(); } if (player.bigTreasure) System.out.println("Congratulations, you have found the Big Treasure, you are now so rich"); else if (player.smallTreasure) System.out.println("Congratulations, you have found a Treasure, unfortunately is not the Big Treasure"+"\n"+"You can retry to find the Big Treasure"+"\n"); break; case 3: enJeu = true; break; default: break; } <code java>
Ligne player.move(room.doorsList); C'est ici mon problème</code>
Voici le code de la méthode en question :
public void
move(ArrayList<Door> doorsList) { int size = 0, north = 0, west = 0, east = 0, south = 0; size = doorsList.size(); Door door = null; System.out.println("\n" + "Enter a direction where you want to go" + "\n"); /** * Detection of possible direction to propose only available direction */ for (int i = 0; i < size; i++) { door = doorsList.get(i); switch (door.getPosition()) { case NORTH: System.out.println("Enter 1 for the north direction"); north = 1; break; case WEST: System.out.println("Enter 2 for the west direction"); west = 1; break; case EAST: System.out.println("Enter 3 for the east direction"); east = 1; break; case SOUTH: System.out.println("Enter 4 for the south direction"); south = 1; break; default: break; } } Integer choice; if (north == 1 && west == 1 && east == 1) { Set<Integer> valuesPossibles = new HashSet<>(); valuesPossibles.add(1); valuesPossibles.add(2); valuesPossibles.add(3); choice = Interaction.lireEntierParmi(valuesPossibles); } else if (north == 1 && west == 1 && south == 1) { Set<Integer> valuesPossibles = new HashSet<>(); valuesPossibles.add(1); valuesPossibles.add(2); valuesPossibles.add(4); choice = Interaction.lireEntierParmi(valuesPossibles); } else if (west == 1 && east == 1 && south == 1) { Set<Integer> valuesPossibles = new HashSet<>(); valuesPossibles.add(2); valuesPossibles.add(3); valuesPossibles.add(4); choice = Interaction.lireEntierParmi(valuesPossibles); } else if (north == 1 && east == 1 && south == 1) { Set<Integer> valuesPossibles = new HashSet<>(); valuesPossibles.add(1); valuesPossibles.add(3); valuesPossibles.add(4); choice = Interaction.lireEntierParmi(valuesPossibles); } else if (north == 1 && west == 1) { Set<Integer> valuesPossibles = new HashSet<>(); valuesPossibles.add(1); valuesPossibles.add(2); choice = Interaction.lireEntierParmi(valuesPossibles); } else if (north == 1 && east == 1) { Set<Integer> valuesPossibles = new HashSet<>(); valuesPossibles.add(1); valuesPossibles.add(3); choice = Interaction.lireEntierParmi(valuesPossibles); } else if (north == 1 && south == 1) { Set<Integer> valuesPossibles = new HashSet<>(); valuesPossibles.add(1); valuesPossibles.add(4); choice = Interaction.lireEntierParmi(valuesPossibles); } else if (west == 1 && east == 1) { Set<Integer> valuesPossibles = new HashSet<>(); valuesPossibles.add(2); valuesPossibles.add(3); choice = Interaction.lireEntierParmi(valuesPossibles); } else if (west == 1 && south == 1) { Set<Integer> valuesPossibles = new HashSet<>(); valuesPossibles.add(2); valuesPossibles.add(4); choice = Interaction.lireEntierParmi(valuesPossibles); } else if (east == 1 && south == 1) { Set<Integer> valuesPossibles = new HashSet<>(); valuesPossibles.add(3); valuesPossibles.add(4); choice = Interaction.lireEntierParmi(valuesPossibles); } else if (north == 1) { Set<Integer> valuesPossibles = new HashSet<>(); valuesPossibles.add(1); choice = Interaction.lireEntierParmi(valuesPossibles); } else if (west == 1) { Set<Integer> valuesPossibles = new HashSet<>(); valuesPossibles.add(2); choice = Interaction.lireEntierParmi(valuesPossibles); } else if (east == 1) { Set<Integer> valuesPossibles = new HashSet<>(); valuesPossibles.add(3); choice = Interaction.lireEntierParmi(valuesPossibles); } else if (south == 1) { Set<Integer> valuesPossibles = new HashSet<>(); valuesPossibles.add(4); choice = Interaction.lireEntierParmi(valuesPossibles); } else { Set<Integer> valuesPossibles = new HashSet<>(); valuesPossibles.add(1); valuesPossibles.add(2); valuesPossibles.add(3); valuesPossibles.add(4); choice = Interaction.lireEntierParmi(valuesPossibles); } /** * Player moving following his choice */ //boolean foundPlacement = false; for (int i = 0; i < 5; i++) { for (int j = 0; j < 5; j++) { if (playerPlacement[i][j] == 1) { switch (choice) { case 1: playerPlacement[i - 1][j] = 1; playerPlacement[i][j] = 0; break; case 2: playerPlacement[i][j - 1] = 1; playerPlacement[i][j] = 0; break; case 3: playerPlacement[i][j + 1] = 1; playerPlacement[i][j] = 0; break; case 4: playerPlacement[i + 1][j] = 1; playerPlacement[i][j] = 0; break; default: break; } } // } } } }
Le problème est que le playerPlacement[i+1][j] sort du tableau lorsque la valeur de i est de 4
De même pour le j
Je n'arrive pas à palier ce problème sans casser le déplacement du joueur.
Si quelqu'un avait des idées et pouvait m'aider ce serait cool.
Merci.
Configuration: Windows / Chrome 83.0.4103.61
A voir également:
- Erreur java.lang.ArrayIndexOutOfBoundsException: 5
- Erreur 0x80070643 - Accueil - Windows
- Erreur 0x80070643 Windows 10 : comment résoudre le problème de la mise à jour KB5001716 - Accueil - Windows
- J'aime par erreur facebook notification - Forum Facebook
- Code erreur f3500-31 ✓ - Forum Bbox Bouygues
- Java code erreur 1603 ✓ - Forum Windows
1 réponse
Bonjour,
Il faut empêcher d'appeler [i+1] si i vaut 4. Par exemple avec if (i < 4).
De même pour [j+1] avec j < 4, [i-1] avec i > 0 et [j-1] avec j > 0.
Il faut empêcher d'appeler [i+1] si i vaut 4. Par exemple avec if (i < 4).
De même pour [j+1] avec j < 4, [i-1] avec i > 0 et [j-1] avec j > 0.
if (playerPlacement[i][j] == 1) { switch (choice) { case 1: if (i > 0) { playerPlacement[i - 1][j] = 1; playerPlacement[i][j] = 0; } break; case 2: if (j > 0) { playerPlacement[i][j - 1] = 1; playerPlacement[i][j] = 0; } break; case 3: if (j < 4) { playerPlacement[i][j + 1] = 1; playerPlacement[i][j] = 0; } break; case 4: if (i < 4) { playerPlacement[i + 1][j] = 1; playerPlacement[i][j] = 0; } break; } }
Exemple : tu as playerPlacement[0][0] == 1 et choice == 4.
Pour i = 0 tu vas faire playerPlacement[0][0] == 0 et playerPlacement[1][0] == 1
Puis tu auras i = 1 et tu vas faire playerPlacement[1][0] == 0 et playerPlacement[2][0] == 1
Et encore pareil avec i=2, i=3, et i=4 pour finalement avoir playerPlacement[4][0] == 1
Le mieux serait d'enregistrer la position du joueur et ne pas avoir à parcourir toute une grille pour savoir où il est.
Remarque : au final, je pense que la grille playerPlacement ne servira plus à rien.
Main :
Méthode move :
est faux, il faudrait mettre playerPlacementX, pas deux fois playerPlacementY. De plus, les deux boucles ne servent à rien si c'est pour faire ça.
Si les instructions ne sont faites que dans le cas où (i == playerPlacementX && j == playerPlacementY) alors enlèves tes boucles et remplaces i par playerPlacementX et j par playerPlacementY.