Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在尝试用Java编写TictaToe程序时,我不断遇到一个NoTouchElementException错误_Java_Arrays_Nosuchelementexception - Fatal编程技术网

在尝试用Java编写TictaToe程序时,我不断遇到一个NoTouchElementException错误

在尝试用Java编写TictaToe程序时,我不断遇到一个NoTouchElementException错误,java,arrays,nosuchelementexception,Java,Arrays,Nosuchelementexception,我已经写了一些方法,当我试着运行main时,我不断得到一个NoSuchElementException错误,这允许我玩一个Tic-Tac-Toe游戏。当我尝试使用enterMove()从用户处获取行和列值时,会发生这种情况,如下所示: import java.util.Scanner; public class TicTacToeMethods { // Create a new board for players to use public static String[][] create

我已经写了一些方法,当我试着运行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();

}
import java.util.Scanner;
公共类方法{
//创建一个新的棋盘供玩家使用
公共静态字符串[][]createBoard(){
字符串[][]板=新字符串[3][3];
对于(int r=0;r<3;r++){
对于(int c=0;c<3;c++){
董事会[r][c]=“200;”;
}
}
返回板;
}
//每次移动时显示板
公共静态字符串显示板(字符串[][]板){
字符串graphicalBoard=“”;
对于(int r=0;r<3;r++){
对于(int c=0;c<3;c++){
图形板+=板[r][c];
}
graphicalBoard+=“\n”;
}
返回图形板;
}
//看看比赛是否赢了
公共静态字符串gameWon(字符串[][]板){
/*
电路板设置参考
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)
*/
字符串赢家=”;
布尔值xWon=false;
布尔oWon=false;
//检查X是否赢了
布尔值firstRowX=(板[0][0]。等于(“X”)和&board[0][1]。等于(“X”)和&board[0][2]。等于(“X”);
布尔值secondRowX=(板[1][0]。等于(“X”)和&board[1][1]。等于(“X”)和&board[1][2]。等于(“X”);
布尔thirdRowX=(board[2][0]。等于(“X”)和&board[2][1]。等于(“X”)和&board[2][2]。等于(“X”);
布尔对角线X=(board[0][0]。等于(“X”)和&board[1][1]。等于(“X”)和&board[2][2]。等于(“X”);
布尔对角Twox=(board[0][2]。等于(“X”)和&board[1][1]。等于(“X”)和&board[2][0]。等于(“X”);
boolean[]resultsForX={firstRowX,secondRowX,thirdRowX,diagonalOneX,diagonalTwoX};
//检查O是否赢了
布尔值firstRowO=(板[0][0]。等于(“O”)和板[0][1]。等于(“O”)和板[0][2]。等于(“O”);
布尔secondRowO=(板[1][0]。等于(“O”)和板[1][1]。等于(“O”)和板[1][2]。等于(“O”);
布尔thirdRowO=(board[2][0]。等于(“O”)和&board[2][1]。等于(“O”)和&board[2][2]。等于(“O”);
布尔对角线O=(board[0][0]。等于(“O”)和&board[1][1]。等于(“O”)和&board[2][2]。等于(“O”);
布尔对角线O=(board[0][2]。等于(“O”)和&board[1][1]。等于(“O”)和&board[2][0]。等于(“O”);
boolean[]resultsForO={firstRowO,secondRowO,thirdRowO,diagonalOneO,diagonalTwoO};
for(布尔值:每个:resultsForX){
如果(每个==真){
xWon=真;
打破
}
}
for(布尔值各:结果FORO){
如果(每个==真){
oWon=真;
打破
}
}
//返回一个赢家,如果没有赢家,则返回空白
如果(xWon){
winner=“X”;
}
如果(oWon){
winner=“O”;
}
返回赢家;
}
//验证玩家的移动
公共静态布尔validMove(int行、int列、字符串[][]板){
返回((板[行][列]!=“X”)和&(板[行][列]!=“O”);
}
//为回合玩家输入一个移动
公共静态void enterMove(String-turnPlayer,String[][]板){
扫描仪键盘=新扫描仪(System.in);
//int行,列;
布尔有效;
System.out.print(“为移动输入行值(1-3):”;
**int row=keyboard.nextInt()**
System.out.print(“为您的移动输入列值(1-3):”;
int column=keyboard.nextInt();
有效=有效移动(第1行,第1列,电路板);
while(!valid){
System.out.print(“为移动输入行值(1-3):”;
行=键盘.nextInt();
System.out.print(“为您的移动输入列值(1-3):”;
column=keyboard.nextInt();
有效=有效移动(第1行,第1列,电路板);
}
开关(旋转播放器){
案例“X”:
线路板[第1行][第1列]=“X”;
打破
案例“O”:
线路板[第1行][第1列]=“O”;
打破
违约:
打破
}
键盘关闭();
}
}

我允许用户从1-3而不是0-2中选择阵列是否有问题?还是我应该换点别的?提前谢谢你

注意-在enterMove()中,有问题的行被星号包围


编辑:按要求堆叠跟踪

您正在关闭
扫描仪
元素, 因此,您正在关闭底层的
InputStream
系统


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

不,要求用户选择1-3没有错,而且通常是最好的(从UI设计的角度来看),因为人们仍然习惯于从1开始编号,而不是从0开始编号。在为数组编制索引时,只需小心地减去1。注意:在
validMove
中,您使用的是
==
=比较
字符串
s。不要那样做。使用<代码>等于<代码>。你试过我在答案中所说的吗?@ USSR8080461考虑+ 1。