Java(已编辑)-为什么不';我的Tictatcoe游戏的赢家不是被认可的方法吗?

Java(已编辑)-为什么不';我的Tictatcoe游戏的赢家不是被认可的方法吗?,java,arrays,Java,Arrays,我完全改变了我的代码,用于检查行、列和两条对角线中的赢家,但是当我运行程序时,赢家不会被确认 addMove(); if (checkWinner()) { System.out.println(currentMark + "wins!"); } displayBoard(); whoseTurn(); System.exit(0); 这是我检查获奖者、显示棋盘、添加移动、在玩家之间切换和重新启动的方法。我遇到了一个问题,因为当我运行程序时,它无法在玩家

我完全改变了我的代码,用于检查行、列和两条对角线中的赢家,但是当我运行程序时,赢家不会被确认

addMove(); 
if (checkWinner()) {
    System.out.println(currentMark + "wins!");
}
displayBoard();               
whoseTurn();
System.exit(0);
这是我检查获奖者、显示棋盘、添加移动、在玩家之间切换和重新启动的方法。我遇到了一个问题,因为当我运行程序时,它无法在玩家之间正确切换

import java.util.*;
public class TicTacToe {
   private char[][] gameBoard = new char[3][3]; //stores the game as a 2D array in which each element is a character
   private char currentMark;
   private Scanner input;
   public TicTacToe() { //initializes the board
      currentMark = 'X';
      for (int i=0; i<3; i++) { //for every row
         for (int j=0; j<3; j++) { //for every column in that row
            gameBoard[i][j] = ' '; //set the value of each element to an empty string
         }

      }
      input = new Scanner(System.in);
   }


   public void whoseTurn() {
      if (currentMark == 'X') {
         currentMark = 'O';
         System.out.println("It is your turn, player O");
      }
      else {
         currentMark = 'X';
         System.out.println("It is your turn, player X");
      }    
   }

   public boolean checkRows() {
      boolean rowWin=false;
      for (int i=0;i<3;i++){ 
         if ((gameBoard[i][0] == gameBoard[i][1]) && (gameBoard[i][1] == gameBoard[i][2]) && (gameBoard[i][0] == currentMark)) { //check every row to find a match
            rowWin= true;
         }
      }
      return rowWin;
   }

   public boolean checkColumns() {
      boolean columnWin=false;
      for (int i=0;i<3;i++) {
         if ((gameBoard[0][i] == gameBoard[1][i]) && (gameBoard[1][i] == gameBoard[2][i]) && (gameBoard[0][i] == currentMark)) { //checks every column to find a match
            columnWin= true;
         }
      }
      return columnWin;
   }

   public boolean checkDiag1() {
     boolean diag1win=false;
     for (int i=0;i<3;i++) {
         if ((gameBoard[0][0] == gameBoard[1][1]) && (gameBoard[1][1] == gameBoard[2][2]) && (gameBoard[0][0] == currentMark)) { //checks first diagonal
            diag1win= true;
         }
      }
      return diag1win;
   }

   public boolean checkDiag2() {
      boolean diag2win=false;
      for (int i=0;i<3;i++) {
         if ((gameBoard[0][2] == gameBoard[1][1]) && (gameBoard[1][1] == gameBoard[2][0]) && (gameBoard[0][2] == currentMark)) { //checks second diagonal
            diag2win= true;   
         }
      }
      return diag2win;
    }

   public boolean checkWinner() {
     boolean yesWinner = false;
     if (checkRows() || checkColumns() || checkDiag1() || checkDiag2()) {
         yesWinner = true;
     }
     return yesWinner;
   }

   public boolean addMove() { 
      boolean nonacceptable = true;
      int row;
      int column;
      while (nonacceptable) {
         System.out.println("Which row and column would you like to enter your mark? Enter the row and column between 0 and 2 separated by a space.");
         row = input.nextInt();
         column = input.nextInt();
         if ((row >= 0 && row <=2) && (column >= 0 && column <=2)) { //make sure user entered a number between 0 and 2
            if (gameBoard[row][column] != ' ') {
               System.out.println("Sorry, this position is not open!");
            }
            else {
               gameBoard[row][column] = currentMark;
               nonacceptable = false;
            }
         }   
         else 
            System.out.println("That position is not between 0 and 2!");
         }
         return nonacceptable;     
   }
   public void restart() {
      for (int i = 0; i<3; i++) {
         for (int j=0; j<3; j++) {
            gameBoard[i][j] = ' ';
         }
      }
   }
   public boolean boardFull() {
      boolean notFull = true;
      for (int i=0; i<3;i++) {
         for (int j=0; j<3; j++) {
            if (gameBoard[i][j] != ' ') 
               notFull = false;
         } 
      }
      return notFull;
   }

   public void letsPlay() {
      while (true) {
         displayBoard();
         gameOptions();
         int choice = input.nextInt();
         if (choice == 1) {
            if (!addMove()) {
               if (checkWinner()) 
                  System.out.println(currentMark + "wins!");
               else continue;
               displayBoard();               
               whoseTurn();
               //System.exit(0);
             }


          else if (boardFull()) {
               displayBoard();
               System.out.println("Board full!");
               System.exit(0);
            } 
           else {
               whoseTurn();
            } 
         }
         else if (choice == 2) 
            restart();
         else if (choice == 3) 
            System.exit(0);

        /* else 
            System.out.println("Try again!"); */
      }
   }

   public static void main(String[] args) {
      TicTacToe game = new TicTacToe();
      game.letsPlay();
   }

}
addMove(); 
if (checkWinner()) {
    System.out.println(currentMark + "wins!");
}
displayBoard();               
whoseTurn();
System.exit(0);
import java.util.*;
公共类Tictatcoe{
private char[]gameBoard=new char[3][3];//将游戏存储为2D数组,其中每个元素都是一个字符
私有字符标记;
专用扫描仪输入;
public TicTacToe(){//初始化董事会
currentMark='X';

对于(int i=0;i我认为
addMove
中有错误。在while循环中,此代码表示接受移动,然后继续

else {
           gameBoard[row][column] = currentMark;
           nonacceptable = false;
        }
addMove(); 
if (checkWinner()) {
    System.out.println(currentMark + "wins!");
}
displayBoard();               
whoseTurn();
System.exit(0);
然后返回
不可接受的
,这是false。但是,您的播放方法是:

if (addMove()) { 
           if (checkWinner()) 
              System.out.println(currentMark + "wins!");
           displayBoard();               
           whoseTurn();
           System.exit(0);
        }  
addMove(); 
if (checkWinner()) {
    System.out.println(currentMark + "wins!");
}
displayBoard();               
whoseTurn();
System.exit(0);
由于
addMove
返回false,如果
,它将不会进入
。最好更改为:

if (!addMove()) { 
               if (checkWinner()) 
                  System.out.println(currentMark + "wins!");
               displayBoard();               
               whoseTurn();
               System.exit(0);
            } 
addMove(); 
if (checkWinner()) {
    System.out.println(currentMark + "wins!");
}
displayBoard();               
whoseTurn();
System.exit(0);
还有一点,在
复选框中,当您比较单元格时,请注意此处,因为空行将返回true。您应该将每个单元格与
当前标记进行比较

addMove(); 
if (checkWinner()) {
    System.out.println(currentMark + "wins!");
}
displayBoard();               
whoseTurn();
System.exit(0);
好的,假设在第一步之后,您的函数检查什么。我们查看
checkColumns
,它将返回true。因为
gameBoard[0][0]
=
gameBoard[1][0]
=
gameBoard[2][0]
=“。这就是您应该与当前标记进行比较的原因。您有两个选项,将当前标记传递给函数并进行检查,或者将变量
currentMark
设置为全局变量

addMove(); 
if (checkWinner()) {
    System.out.println(currentMark + "wins!");
}
displayBoard();               
whoseTurn();
System.exit(0);
程序不会停止,因为当有赢家时,您没有做任何事情来停止它。这应该可以:

if (!addMove()) { 
           if (checkWinner()) {
              System.out.println(currentMark + "wins!");
              //put the code to stop the program here
              //like return or exit
           }
           displayBoard();               
           whoseTurn();
           System.exit(0);
        }  
public void letsPlay() {
        displayBoard();

        while (true) {
            gameOptions();
            int choice = input.nextInt();
            if (choice == 1) {
                if (!addMove()) {
                    displayBoard();

                    if (checkWinner()){
                        System.out.println(currentMark + "wins!");
                        return;
                    }
                    whoseTurn();
                    // System.exit(0);
                }

                else if (boardFull()) {
                    displayBoard();
                    System.out.println("Board full!");
                    System.exit(0);
                } else {
                    displayBoard();

                    whoseTurn();
                }
            } else if (choice == 2)
                restart();
            else if (choice == 3)
                System.exit(0);

            /*
             * else System.out.println("Try again!");
             */
        }
    }
addMove(); 
if (checkWinner()) {
    System.out.println(currentMark + "wins!");
}
displayBoard();               
whoseTurn();
System.exit(0);

看看你的输出,在我看来,你的
whoseTurn
从未执行过。出于我不知道的原因,你能提供更多的代码吗,特别是你的游戏循环从哪里开始

addMove(); 
if (checkWinner()) {
    System.out.println(currentMark + "wins!");
}
displayBoard();               
whoseTurn();
System.exit(0);
您的代码有很多小问题。在
检查对角线
中,我认为这里的
for
循环是不必要的,因为只有1个第一对角线和1个第二对角线

addMove(); 
if (checkWinner()) {
    System.out.println(currentMark + "wins!");
}
displayBoard();               
whoseTurn();
System.exit(0);

问题是您的方法
whoseTurn
没有按预期运行。因此,我需要查看它在您的代码中是如何调用的。使用此方法,我看不出问题出在哪里。您可以尝试调试,在
whoseTurn
内放置一个断点,或一些输出,以查看是否调用此函数

addMove(); 
if (checkWinner()) {
    System.out.println(currentMark + "wins!");
}
displayBoard();               
whoseTurn();
System.exit(0);

所以我是wright,这是你的游戏循环,方法
letsPlay
是错误的。在检查是否有赢家时的
if
语句中,在else中,
continue
将使代码返回到
,而
立即忽略其余代码。这就是为什么
whoseTurn
被忽略的原因。应该这样做:

if (!addMove()) { 
           if (checkWinner()) {
              System.out.println(currentMark + "wins!");
              //put the code to stop the program here
              //like return or exit
           }
           displayBoard();               
           whoseTurn();
           System.exit(0);
        }  
public void letsPlay() {
        displayBoard();

        while (true) {
            gameOptions();
            int choice = input.nextInt();
            if (choice == 1) {
                if (!addMove()) {
                    displayBoard();

                    if (checkWinner()){
                        System.out.println(currentMark + "wins!");
                        return;
                    }
                    whoseTurn();
                    // System.exit(0);
                }

                else if (boardFull()) {
                    displayBoard();
                    System.out.println("Board full!");
                    System.exit(0);
                } else {
                    displayBoard();

                    whoseTurn();
                }
            } else if (choice == 2)
                restart();
            else if (choice == 3)
                System.exit(0);

            /*
             * else System.out.println("Try again!");
             */
        }
    }
addMove(); 
if (checkWinner()) {
    System.out.println(currentMark + "wins!");
}
displayBoard();               
whoseTurn();
System.exit(0);

我检查并播放好。

您应该考虑在<代码> AddioMeV()/代码>方法中删除<代码>布尔< <代码>返回值,删除<代码> AddioMe()/代码>中的返回语句,将返回值更改为<代码> Value<代码>,并将播放方法代码更新为:

addMove(); 
if (checkWinner()) {
    System.out.println(currentMark + "wins!");
}
displayBoard();               
whoseTurn();
System.exit(0);

只需让
addMove()中的
boolean
循环中充当控制迭代的守卫,我想你会非常接近你想要的。

因为
addMove
总是返回false?@immibis当我将nonacceptable的值更改为true时,程序仍然不能正常运行,直接进入“满板”message您能正确缩进代码吗?因为缩进与代码中的实际大括号/方括号冲突,所以无法读取program@xson这无关紧要。你有
if(addMove()){…这里的东西…}
addMove
总是返回false,因此
…这里的东西…
永远不会执行。你可能需要重新考虑你想要代码做什么。删除相关代码从来都不是一个好主意。我回滚了你上一次的编辑。我只是这样更改了它,但它只打印了两次电路板,并说当前标记获胜。你是说t你只能做两个动作?我可以做我需要的任意多个动作,但是显示板连续打印两次,在每次新的动作之前,显示板上都显示上一个标记赢了。好的,我明白了。因为,你在开始时会有空行、列或对角线,并且
checkWinner
测试同一列中是否有3个单元格,行或对角线相互匹配。因此,您也应该与
currentMark
进行比较。至于为什么它连续两次打印棋盘,您提供的代码无法让我们看到。发布更多代码,我们就知道了。是的,我认为您应该将
currentMark
添加到
checkWin
如果((gameBoard[I][0]==gameBoard[I][1])&&&(gameBoard[i][1]==gameBoard[i][2])&&(gameBoard[i][0]==currentMark))
addMove(); 
if (checkWinner()) {
    System.out.println(currentMark + "wins!");
}
displayBoard();               
whoseTurn();
System.exit(0);