Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.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 我看不出我的逻辑错误_Java_Arrays_Methods - Fatal编程技术网

Java 我看不出我的逻辑错误

Java 我看不出我的逻辑错误,java,arrays,methods,Java,Arrays,Methods,当游戏执行时,玩家可以输入一个移动,但是它会陷入一个循环中,逻辑错误出现在isWinner方法中,但是如果不使用一堆长if语句,我想不出怎么做?请帮忙 public class TicTacToe { public static char board[] = new char[10]; public static void resetgame(){ for (int x = 0; x < board.length; x++) b

当游戏执行时,玩家可以输入一个移动,但是它会陷入一个循环中,逻辑错误出现在isWinner方法中,但是如果不使用一堆长if语句,我想不出怎么做?请帮忙

public class TicTacToe {

    public static char board[] = new char[10];

    public static void resetgame(){
        for (int x = 0; x < board.length; x++) 
            board[x] = '-';    // resets board to all -
    }

    public static void displayBoard(){
        for (int x = 1; x < board.length; x++){
            if (board[x] == '-')
                System.out.print(x + " ");
            else
                System.out.print(board[x] + " ");
            if (x % 3 == 0)
                System.out.println();
        }
    }

    public static boolean isSpotEmpty(int m){
        return (board[m] == '-');           
    }

    public static void getPlayerMove(){
        Scanner input = new Scanner(System.in);
        System.out.print("Enter your move (1-9): ");
        int move = input.nextInt();
        while (move < 1 || move > 9 || !isSpotEmpty(move)){  //validate move
            System.out.print("Move is not valid. Reenter move (1-9): ");
            move = input.nextInt();
        }
        board[move] = 'X';
    }

    public static void computerMove(){
        int move = ((int)(Math.random() * 9)+1);               
        while (isSpotEmpty(move)==false)
            move = ((int)(Math.random() * 9)+1);
        board[move] = 'O';        
    }

    public static boolean isWinner(char ch){

        for(int x = 1; x < 4; x++){
            while (board[x] != ch)
                return false;}
        for(int x = 4; x < 7; x++){
            while (board[x] != ch)
                return false;}
        for (int x = 7; x < board.length; x++){
            while (board[x] != ch)
                return false;}
        for (int x = 1; x < 8; x += 3){
            while (board[x] != ch)
                return false;}
        for (int x = 2; x < 9; x += 3){
            while (board[x] != ch)
                return false;}
        for (int x = 3; x < board.length; x += 3){
            while (board[x] != ch)
                return false;}
        for (int x = 1; x < board.length; x += 4){
            while (board[x] != ch)
                return false;}
        for (int x = 3; x < 8; x += 2){
            while (board[x] != ch)
                return false;}
        return true;
    }

    public static boolean isFull(){
        boolean draw = false;
        for (int x = 0; x < board.length; x++){
            while (board[x] != '-')
                draw = true;
        }
        return draw;
    }

    public static boolean isGameDone(){
        if (isWinner('X')){
            System.out.println("Player wins!"); 
            return true;
        }
        if (isWinner('O')){ 
            System.out.println("You suck! Computer wins!"); 
            return true;
        }
        if (isFull()){ 
            System.out.println("Draw!"); 
            return true;
        }
        return false;        
    }

    public static void tictactoe(){
        resetgame();
        displayBoard();
        while (true){ 
            getPlayerMove();           
            displayBoard();
            if (isGameDone()==true) return;           
            System.out.println("Computer's move!");                       
            computerMove();                       
            displayBoard();
            if (isGameDone()==true) return;
            System.out.println("Your move!");
        }
    }

    public static void main(String[] args) {

        tictactoe();       
    }
}
公共类TicTacToe{
公共静态字符板[]=新字符[10];
公共静态游戏(){
用于(int x=0;x9 | |!isSpotEmpty(移动)){//验证移动
系统输出打印(“移动无效。重新输入移动(1-9):”;
move=input.nextInt();
}
板[移动]=“X”;
}
公共静态无效计算机移动(){
int move=((int)(Math.random()*9)+1);
while(isSpotEmpty(move)=false)
move=((int)(Math.random()*9)+1);
板[移动]=“O”;
}
公共静态布尔值(char-ch){
对于(int x=1;x<4;x++){
while(板[x]!=ch)
返回false;}
对于(int x=4;x<7;x++){
while(板[x]!=ch)
返回false;}
对于(int x=7;x
更新代码: 下面的代码经过测试并正常工作

isWinner
方法

public static boolean isWinner(char ch){
    boolean finishFlag = true;
    for(int x = 1; x < 4; x++){
        if (board[x] != ch) {
            finishFlag = false;
            break;
        }
    }
    if (finishFlag)
        return finishFlag;
    finishFlag = true;
    for(int x = 4; x < 7; x++){
        if (board[x] != ch) {
            finishFlag = false;
            break;
        }
    }
    if (finishFlag)
        return finishFlag;
    finishFlag = true;
    for (int x = 7; x < board.length; x++){
        if (board[x] != ch) {
            finishFlag = false;
            break;
        }
    }
    if (finishFlag)
        return finishFlag;
    finishFlag = true;
    for (int x = 1; x < 8; x += 3){
        if (board[x] != ch) {
            finishFlag = false;
            break;
        }
    }
    if (finishFlag)
        return finishFlag;
    finishFlag = true;
    for (int x = 2; x < 9; x += 3){
        if (board[x] != ch) {
            finishFlag = false;
            break;
        }
    }
    if (finishFlag)
        return finishFlag;
    finishFlag = true;
    for (int x = 3; x < board.length; x += 3){
        if (board[x] != ch) {
            finishFlag = false;
            break;
        }
    }
    if (finishFlag)
        return finishFlag;
    finishFlag = true;
    for (int x = 1; x < board.length; x += 4){
        if (board[x] != ch) {
            finishFlag = false;
            break;
        }
    }
    if (finishFlag)
        return finishFlag;
    finishFlag = true;
    for (int x = 3; x < 8; x += 2){
        if (board[x] != ch) {
            finishFlag = false;
            break;
        }
    }
    return finishFlag;
}
public static boolean isFull(){
    boolean draw = false;
    for (int x = 1; x < board.length; x++){
        if (board[x] == '-') {
            draw = false;
            break;
        } else {
            draw = true;
        }
    }
    return draw;
}

编辑:在isFull()中将x初始化为1而不是0

您需要重构
isWinner()
isFull()方法。您被困在无限循环中,因为您在检查第一个水平行后立即返回。如果这恰好是错误的,那么其他循环都无法执行

我还没有做完整的代码检查,但是上面提到的错误可以通过下面的代码修复

boolean finishedFlag = true;
for(int x = 1; x < 4; x++){
    if (board[x] != ch){
        finishedFlag = false;
        break;
    }   
}
if(finishedFlag) return finishedFlag;

/*

...
Check similarly for all horizontal,vertical and diagonal
...

*/

return finishedFlag;

我在这里会有点迟钝。您的问题是由于误用
while
操作员造成的。让我们来看看其中的一个问题:

while (board[x] != '-')
    draw = true;
当我们看循环时,我们想问:

  • 循环开始时我的条件为真吗
  • 在循环过程中有什么变化
  • 循环结束时我的条件是真的吗
  • 条件是板[x]!='-'。在循环开始时,
    board[x]
    必须不等于
    '-'

    while
    循环结束时,
    '-'
    肯定不会更改,因为它是一个常量字符串

    board[x]
    是否会更改?让我们看看
    while
    循环的主体。唯一要做的就是将
    true
    赋值给
    draw
    x
    不会更改,而且板[x]
    也不会更改


    那么,这个
    循环需要多长时间?查看您使用
    while
    的其余代码,并检查它们的运行方式。

    您可以使用
    switch
    语句。将所有
    while
    替换为
    if
    ,看看它是否解决了问题。尝试过了……没有试过使用调试器跟踪吗?我知道无限循环在哪里,因为如果我在程序中注释isWinner方法,它运行得很好,只是无法确定winnerresult是否是相同的无限循环。我打算使用for循环来检查电路板上的每一行、每一列和每一对角线是否有3个X或O的组合……它不喜欢我这样做,你需要重构isWinner(),这个函数需要很长时间。我应该如何重构它?你只有一个条件
    board[X]
    
    while (board[x] != '-')
        draw = true;