Fehlermeldung "Index 2 out of bounds for length 2"

_so_far_away_

Mitglied
Hallo, ich bin ein Programmieranfänger und habe mich mit dem folgenden Problem begegnet: [Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 2 out of bounds for length 2]. Ich weiß nicht was ich tun muss. Die Fehlermeldungen sind in der 16. 100. 107. und 121. Zeile.
 

Anhänge

Java:
package de.buw;

import java.util.Arrays;
import java.util.Random;
import java.util.Scanner;

public class Ships {
    public static void main(String[] args) {
    int gameBoardLength = 10;
    char water ='-';
    char ship='s';
    char hit='x';
    char miss='0';
    int shipNumber =10;
    
    char[][] gameBoard = createGameBoard(gameBoardLength, water,ship, shipNumber);
    printGameBoard(gameBoard,water,ship);
    int undetectedShipNumber=shipNumber;
    while(undetectedShipNumber>0) {
        int[] guessCoordinates= getUserCoordinates(gameBoardLength);
        char locationViewUpdate = evaluateGuessAndGetTheTarget(guessCoordinates,gameBoard,ship,water,hit,miss);
        if(locationViewUpdate==hit) {
            undetectedShipNumber--;
        }
        gameBoard=updateGameBoard(gameBoard,guessCoordinates,locationViewUpdate);
        printGameBoard(gameBoard,water,ship);
    }
    
    }


    private static char[][] updateGameBoard(char[][] gameBoard, int[] guessCoordinates, char locationViewUpdate) {
        int row=guessCoordinates[0];
        int col=guessCoordinates[1];
        gameBoard[row][col]=locationViewUpdate;
        return gameBoard;
    }


    private static char evaluateGuessAndGetTheTarget(int[] guessCoordinates, char[][] gameBoard, char ship, char water,
            char hit, char miss) {
        String message;
        int col=guessCoordinates[0];
        int row=guessCoordinates[1];
        char target= gameBoard[row][col];
        if(target==ship) {
            message="Hit!";
            target=hit;
        }else if(target==water) {
            message="Miss!";
            target=miss;
        } else {
            message="Already hit!";
        }
        System.out.println(message);
        return target;
    }


    private static int[] getUserCoordinates(int gameBoardLength) {
        int row;
        int col;
        do {
            System.out.print("Row: ");
            row = new Scanner(System.in).nextInt();
        }while(row<1|| row>gameBoardLength + 1);
        do{
            System.out.print("Column: ");
            col = new Scanner(System.in).nextInt();
        }while(col<1||col>gameBoardLength +1);
        return new int[] {row-1, col -1};
    }


    private static void printGameBoard(char[][] gameBoard, char water, char ship) {
        int gameBoardLength= gameBoard.length;
        for(int i=0; i<gameBoardLength; i++) {
            System.out.print(i + 1 + "  ");
        }
        for(int row=0; row<gameBoardLength; row++) {
            System.out.print(row + 1 + " ");
            for(int col=0;col<gameBoardLength;col++) {
                char position=gameBoard[row][col];
                if(position==ship) {
                    System.out.print(water+" ");
                } else {
                    System.out.print(position + " ");
                }
            }
            System.out.println();
        }
        System.out.println();
    }

    private static char[][] createGameBoard(int gameBoardLength, char water, char ship, int shipNumber) {
        char[][] gameBoard = new char[gameBoardLength][gameBoardLength];
        for(char[] row: gameBoard) {
            Arrays.fill(row, water);
        }
        return placedShips(gameBoard,shipNumber,water,ship);
    }

    private static char[][] placedShips(char[][] gameBoard, int shipNumber, char water, char ship) {
        int placedShips =0;
        int gameBoardLength = gameBoard.length;
        while(placedShips<shipNumber) {
            int[] location = generateShipCoordinates(gameBoardLength);
            
            int possiblePlacement=gameBoard.length;
            if (possiblePlacement==water) {
                gameBoard[location[0]][location[1]]=ship;
                placedShips++;
            }
        }
        return gameBoard;
    }

    private static int[] generateShipCoordinates(int gameBoardLength) {
        int[] coordinates= new int[2];
        for (int i = 0; 1< coordinates.length;i++) {
            coordinates[i]= new Random().nextInt(gameBoardLength);
        }
        return coordinates;
    }
}
 
Tippfehler in Zeile 120: i < coordinates.length willst Du prüfen, aber Du hast eine 1 statt i geschrieben.
Das könnte es schon gewesen sein.
 
Bei sowas einfach per Debugger durchgehen. Oder bau viele Ausgaben ein, damit Du siehst, wo es Probleme gibt.

Aber Du kannst Dir die Methode placedShips (ist da nicht das d zu viel? place ships wäre doch das, was die Methode macht?) einmal näher ansehen? Du erzeugst eine Koordinate und dann? Was prüfst Du denn, um zu sehen, ob Du das Schiff plazieren kannst?
 
Java:
while(placedShips<shipNumber) {
    int[] location = generateShipCoordinates(gameBoardLength);

    int possiblePlacement=gameBoard.length; // dies ergibt keinen Sinn
    if (possiblePlacement==water) {
        gameBoard[location[0]][location[1]]=ship;
        placedShips++;
    }
}
produziert wohl eine Endlosschleife... 😉
 

Zurück
Oben