Элементы 2d-промежуточных массивов не сравниваются. не пытаюсь сравнить весь массив

#java #arrays #for-loop #multidimensional-array

#java #массивы #for-цикл #многомерный массив

Вопрос:

Я просто освежаю свои навыки Java, потому что прошло некоторое время с тех пор, как я кодировал. Я просмотрел многие сообщения моего вопроса и обнаружил, что, насколько я могу судить, я, кажется, сравниваю все правильно. Я сравниваю два элемента 2d-массива друг с другом, и если они совпадают, я заменяю символ в элементе, однако, похоже, он просто выходит за рамки при попытке их сравнения. Не вижу ошибки out of bounds (строка 48).

 char[][] board = new char[3][3];
char[][] player1 = new char[1][1];
char[][] player2 = new char[1][1];
int playerRow = 0;
int playerCol = 0;
Scanner kbd = new Scanner(System.in); 

System.out.println("Lets play a simple game of tic-tac-toe");
        System.out.println("Player 1 (X's) : Please enter a row number and column number ");
        System.out.println(" in order to plot the cordinates of your desired move");
        playerRow = kbd.next().charAt(0);
        playerCol = kbd.next().charAt(0);
        for(int row = 0; row < board.length; row  )
        {
            for(int col = 0; col < board[row].length;col  )
            {
                if (board[row][col] == player1[playerRow][playerCol])
                {
                    board[row][col] = 'X';
                    System.out.print(board[row][col] " ");
                }
                else
                {
                    board[row][col]= '-';
                    System.out.print(board[row][col] " ");

                }
            }
            System.out.println();
        }  

Комментарии:

1. Вы сравниваете a char с an int . Это допустимое сравнение, но, вероятно, оно не делает того, что вы хотите. Например, '1' (char) — это не то же самое, что 1 (int) .

2. упс. о боже, я просматриваю это примерно 45 минут.

3. Я изменил это, однако он продолжает выдавать мне ошибку с индексом массива вне границ, я сделал массивы игровых массивов символьными массивами. это нормально? @resueman

4. кроме того, вы объявляете массивы символов и инициализируете массивы int

5. У вас есть трассировка стека ошибки, которую вы могли бы опубликовать?

Ответ №1:

Похоже, что ваш код использует неправильный подход к решению этой проблемы. Если я не понимаю вашу цель, я не думаю player1 , player2 что это необходимо. Все должно храниться только внутри board . Вот пример того, как это может выглядеть:

 //initialize variables
char[][] board = new char[3][3];
int playerRow = 0;
int playerCol = 0;

//clear the board
for(int row = 0; row < board.length; row  ){
    for (int col = 0; col < board[row].length; col  ){
        board[row][col] = '-';
    }
}

Scanner kbd = new Scanner(System.in);

System.out.println("Lets play a simple game of tic-tac-toe");
System.out.println("Player 1 (X's) : Please enter a row number and column number ");
System.out.println(" in order to plot the cordinates of your desired move");

//get player's row and column
playerRow = kbd.nextInt();
playerCol = kbd.nextInt();

//Change the chosen spot to be the player's character.
board[playerRow][playerCol] = 'X';

//Display the board
for(int row = 0; row < board.length; row  ){
    for(int col = 0; col < board[row].length;col  ){
        System.out.print(board[row][col]   " ");
    }
    System.out.println();
}
  

Это пример одного хода, который позволяет игроку выбрать место, а затем отображает доску.

Причина ошибки, которую вы сейчас получаете, заключается в том, что вы читаете символ '0' , а затем пытаетесь использовать его в качестве индекса в массиве. Но '0' это не то же самое, что 0 ; на самом деле это значение unicode, представляющее символ 0 , который, оказывается, имеет значение 48 , которое не является допустимым индексом в вашем массиве. Вы должны принять этот ввод как целое число, а затем просто установить это значение в массиве (без циклов для поиска правильного места).

Комментарии:

1. Спасибо всем, особенно resueman и @vergeA. Я всегда склонен сворачивать свои программы, преследуя кроличью нору исправлений, наложенных друг на друга. Я был буквально там, где мне нужно было быть, но не мог этого видеть. Спасибо, ребята. очень люблю всех.

Ответ №2:

Ваши 2-мерные массивы player (i) предполагают присвоение 2-мерного массива символов целочисленному 2-мерному массиву.

char[][] player1 = новый int[board.length][board.length]; char[][] player2 = новый int[board.length][board.length];

Я не думаю, что это выполнимая инициализация.

Также, как упоминалось в приведенных выше комментариях, вы сравниваете char с int . Следовательно, он пытается сравнить целочисленное значение ваших символов со значениями сравниваемых переменных.

Комментарии:

1. Извините, это ошибка в коде. исправлены, ошибка все еще возникает.

2. Ваша плата — это 3*3 2- D массив, в то время как игроков всего 1 * 1, и, следовательно, это выходит за рамки.

3. Да, для меня это имеет смысл, в чем моя логическая ошибка здесь?

4. Я попытался сделать их 3 на 3, и это все равно выйдет за рамки.

5. Он не обращается к массивам плееров row , и col это не проблема