在尝试用Java创建TicTacToe程序时,我不断收到NoSuchElementException错误

时间:2014-03-23 23:19:12

标签: java arrays nosuchelementexception

enter image description here我写了一些方法,当我尝试运行main时,我一直收到NoSuchElementException错误,这让我可以玩Tic Tac Toe游戏。当我尝试使用enterMove()从用户获取行和列值时会发生这种情况,如下所示:

import java.util.Scanner;

public class TicTacToeMethods {

// Create a new board for players to use
public static String[][] createBoard(){

    String[][] board = new String[3][3];
    for(int r = 0; r < 3; r++){
        for(int c = 0; c < 3; c++){
            board[r][c] = " _ ";
        }
    }
    return board;

}

// Display the board each time a move is made
public static String displayBoard(String[][] board){

    String graphicalBoard = "";
    for(int r = 0; r < 3; r++){
        for(int c = 0; c < 3; c++){
            graphicalBoard += board[r][c];
        }
        graphicalBoard += "\n";
    }
    return graphicalBoard;

}

// Check to see if the game has been won
public static String gameWon(String[][] board){

    /*
    Board setup reference
    A B C
    D E F
    G E H

    A = (0,0) B = (0,1) C = (0,2)
    D = (1,0) E = (1,1) F = (1,2)
    G = (2,0) H = (2,1) I = (2,2)
    */
    String winner = "";
    boolean xWon = false;
    boolean oWon = false;

    // Check if X won
    boolean firstRowX = (board[0][0].equals(" X ") && board[0][1].equals(" X ") && board[0][2].equals(" X "));

    boolean secondRowX = (board[1][0].equals(" X ") && board[1][1].equals(" X ") && board[1][2].equals(" X "));

    boolean thirdRowX = (board[2][0].equals(" X ") && board[2][1].equals(" X ") && board[2][2].equals(" X "));

    boolean diagonalOneX = (board[0][0].equals(" X ") && board[1][1].equals(" X ") && board[2][2].equals(" X "));

    boolean diagonalTwoX = (board[0][2].equals(" X ") && board[1][1].equals(" X ") && board[2][0].equals(" X "));

    boolean[] resultsForX = {firstRowX,secondRowX,thirdRowX,diagonalOneX,diagonalTwoX};

    // Check if O won
    boolean firstRowO = (board[0][0].equals(" O ") && board[0][1].equals(" O ") && board[0][2].equals(" O "));

    boolean secondRowO = (board[1][0].equals(" O ") && board[1][1].equals(" O ") && board[1][2].equals(" O "));

    boolean thirdRowO = (board[2][0].equals(" O ") && board[2][1].equals(" O ") && board[2][2].equals(" O "));

    boolean diagonalOneO = (board[0][0].equals(" O ") && board[1][1].equals(" O ") && board[2][2].equals(" O "));

    boolean diagonalTwoO = (board[0][2].equals(" O ") && board[1][1].equals(" O ") && board[2][0].equals(" O "));

    boolean[] resultsForO = {firstRowO,secondRowO,thirdRowO,diagonalOneO,diagonalTwoO};

    for(boolean each : resultsForX){
        if(each == true){
            xWon = true;
            break;
        }
    }

    for(boolean each : resultsForO){
        if(each == true){
            oWon = true;
            break;
        }
    }

    // Return a winner, or a blank if no one has won
    if(xWon){
        winner = "X";
    }
    if(oWon){
        winner = "O";
    }
    return winner;

}

// Validate a player's move
public static boolean validMove(int row, int column, String[][] board){
    return ((board[row][column] != " X ") && (board[row][column] != " O "));
}

// Enter a move for the turn player
public static void enterMove(String turnPlayer,String[][] board){

    Scanner keyboard = new Scanner(System.in);
    //int row, column;
    boolean valid;

    System.out.print("Enter a row value for your move (1 - 3): ");
    **int row = keyboard.nextInt();**

    System.out.print("Enter a column value for your move (1 - 3): ");
    int column = keyboard.nextInt();

    valid = validMove(row - 1,column - 1,board);

    while(!valid){
        System.out.print("Enter a row value for your move (1 - 3): ");
        row = keyboard.nextInt();

        System.out.print("Enter a column value for your move (1 - 3): ");
        column = keyboard.nextInt();

        valid = validMove(row - 1,column - 1,board);
    }

    switch(turnPlayer){
        case "X":
            board[row - 1][column - 1] = " X ";
            break;
        case "O":
            board[row - 1][column - 1] = " O ";
            break;
        default:
            break;
    }

    keyboard.close();

}

}

我是否有问题允许用户从阵列中选择1 - 3而不是0 - 2吗?或者我应该改变其他什么?提前谢谢!

注意 - 在enterMove()

中,有问题的行已用星号包围

编辑:按要求进行Stacktrace

1 个答案:

答案 0 :(得分:0)

您正在关闭Scanner元素, 所以你要关闭基础InputStreamSystem.in

因此,没有其他扫描仪可以再次读取,并且会抛出java.util.NoSuchElementException