Erreur java.lang.ArrayIndexOutOfBoundsException: 5

Fermé
arthur - Modifié le 2 juin 2020 à 11:57
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 - 4 juin 2020 à 09:20
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 :

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

1 réponse

KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
2 juin 2020 à 13:39
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.

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;
    }
}
0
Merci, mais quand j'effectue cela, mon code est casser et lorsque je fais 3 pour aller a l'est ça change totalement de case, et pire le 4 lui ne fonctionne pas il me demande de entrer de nouveau un nombre mais cela ne marche pas je ne comprend pas.
0
Peut être que ma façon de faire n'est pas bonne mais je n'arrive pas a résoudre ce problème
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
2 juin 2020 à 17:40
Je pense que c'est tes boucles for (int i = 0; i < 5; i++) et for (int j = 0; j < 5; j++) qui posent problème.

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.
int playerPlacementX = 0;
int playerPlacementY = 0;

// Player moving following his choice

if (choice == 1 && playerPlacementX > 0) {
    playerPlacementX--;
} else if (choice == 2 && playerPlacementY > 0) {
    playerPlacementY--;
} else if (choice == 3 && playerPlacementX < 4) {
    playerPlacementX++;
} else if (choice == 4 && playerPlacementY < 4) {
    playerPlacementY++;
}

Remarque : au final, je pense que la grille playerPlacement ne servira plus à rien.
0
arthur > KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024
3 juin 2020 à 18:17
Merci de votre réponse j'ai essayer de faire avec cette technique mais malheureusement le problème est que en chaque début de parti la détection des portes se fait sur la salle [0][0] et le déplacement ne fonctionne pas je ne vois pas pourquoi j'ai essayer differentes choses toujours rien.

Main :
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 (i == playerPlacementY && j == playerPlacementY) {

                                    if (playerPlacementX == 0 && playerPlacementY == 0) player.smallTreasure = true;
                                    else if (playerPlacementX == 2 && playerPlacementY == 0) player.smallTreasure = true;
                                    else {
                                        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;

            }


        }  




Méthode move :

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;

        playerPlacementY = 4;
        playerPlacementX = 2;

        for (int i = 0; i < 5; i++) {
            for (int j = 0; j < 5; j++) {

                if (i == playerPlacementY && j == playerPlacementY) {
                    /**
                     *  Player moving following his choice
                     */
                    if (choice == 1 && playerPlacementX > 0) {
                        playerPlacementY--;
                    } else if (choice == 2 && playerPlacementY > 0) {
                        playerPlacementX--;
                    } else if (choice == 3 && playerPlacementX < 4) {
                        playerPlacementX++;
                    } else if (choice == 4 && playerPlacementY < 4) {
                        playerPlacementY++;
                    }
                }
            }
        }
    }
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015 > arthur
4 juin 2020 à 09:20
Bonjour,

if (i == playerPlacementY && j == playerPlacementY)
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.
0