Hej, tworzę grę TicTacToe, w której sprawdza każdy indeks pod kątem wartości „x” lub „o” i wyświetla mi błąd java.lang.ArrayIndexOutOfBoundsException: 3 dla pierwszej instrukcji if. Jakieś wskazówki, jak zasugerować, dlaczego tak się dzieje?

public boolean checkRowsForWin(int usrBrd, int WinSeq) {
    int countX = 0;
    int countO = 0;

    for(int i = 0; i < usrBrd; i++) {
        for(int j = 0; i< usrBrd; j++) {
            if(board[i][j] == 'x') {
                countX++;
            }
            else if(board[i][j] == 'o') {
                countO++;
            }
            else {
                countX = 0;
                countO = 0;
            }
            if (countX >= WinSeq) {
                return true;
            }
            else if (countO >= WinSeq) {
                return true;
            }
        }
    }
    return false;
}

Oto gdzie inicjalizuję płytkę

    Scanner scnr = new Scanner (System.in);

    System.out.println("Tic-Tac-Toe!");
    System.out.println("How large would you like the board?(Must be greater 
    than 3)");
    int usrBrd = scnr.nextInt();
    if(usrBrd < 3) {
        System.out.println("Not a valid number, please try again");
        usrBrd = scnr.nextInt();
    }
    TicTacToe game = new TicTacToe(usrBrd);
    game.initializeBoard(usrBrd);
    System.out.println("What should the win sequence be? Write in form of 
    amount i.e \"3\"  ");
    int winSeq = scnr.nextInt();

Oto metoda inicjalizacji płytki

public TicTacToe(int usrBrd) {
    board = new char[usrBrd][usrBrd];
    currentPlayerMark = 'x';
    initializeBoard(usrBrd);
}
public void initializeBoard(int usrBrd) {
    //loop rows
    for (int i = 0; i < usrBrd; i++) {
        //loop columns
        for(int j = 0; j < usrBrd; j++) {
            board[i][j] = '-';
        }
    }
}
0
Jason Palan 19 grudzień 2019, 20:45
Jaka jest wartość usrBrd?
 – 
B. Go
19 grudzień 2019, 20:46
1
Czy możesz pokazać część kodu, w której inicjujesz swoją tablicę 2d board[i][j]?
 – 
OH GOD SPIDERS
19 grudzień 2019, 20:50
Gdzie jest twoja inicjalizacja tablicy?
 – 
Ashutosh Sharma
19 grudzień 2019, 20:52
Ponadto, ponieważ tablice java są oparte na zerach, zakładam, że 3 byłoby poza granicami, ponieważ powinieneś mieć 0,1,2 jako swoje wartości, ponieważ tablice w kółko i krzyżyk mają rozmiar 3x3. 0,0 | 0,1 | 0,2 1,0 | 1,1 | 1,2 2,0 | 2,1 | 2,2
 – 
Reger05
19 grudzień 2019, 20:52
UsrBrd to ilość, jak duża ma być tablica
 – 
Jason Palan
19 grudzień 2019, 20:54

1 odpowiedź

Twój błąd jest w Twojej drugiej pętli for

for(int j = 0; i< usrBrd; j++)

Zawsze sprawdzasz, czy i

2
Reger05 19 grudzień 2019, 20:57
Naprawiłem to, ale teraz mam problem, w którym pozwala użytkownikowi wygrać, nawet jeśli nie ma prostego wiersza lub kolumny?
 – 
Jason Palan
19 grudzień 2019, 21:08
Resetujesz tylko, jeśli wartość NIE jest x lub o if(board[i][j] == 'x') { countX++; } else if(tablica[i][j] == 'o') { licznikO++; } else { liczbaX = 0; liczba O = 0; } Będziesz musiał zagłębić się w swoją logikę, ale musisz zresetować liczbę 'x', jeśli znajdziesz 'o' i na odwrót. W przeciwnym razie resetują się tylko na pustych polach
 – 
Reger05
19 grudzień 2019, 21:11
Dzięki, zmieniłem treść instrukcji if, w której jeśli wykryto x, licznik countO zostanie zresetowany i na odwrót dla instrukcji else if.
 – 
Jason Palan
19 grudzień 2019, 21:14