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);