Java 为什么赢了';循环不能停止迭代吗?
我是一名java初学者,正在为我的班级编写gui tic tac toe程序。(没有播放器,只是电脑生成的) 除了一件事,我的程序中的一切都按预期工作;似乎我对Java 为什么赢了';循环不能停止迭代吗?,java,loops,do-while,tic-tac-toe,Java,Loops,Do While,Tic Tac Toe,我是一名java初学者,正在为我的班级编写gui tic tac toe程序。(没有播放器,只是电脑生成的) 除了一件事,我的程序中的一切都按预期工作;似乎我对checkWinner的方法调用的位置不正确,因为X和O的赋值总是完成的。为什么循环不会在有赢家时结束 它将根据方法调用返回正确的赢家,但是for循环将继续迭代并填充其余的(因此有时它看起来像是x和o赢了或者一个赢了两次)。我一直在发疯,想这可能是我的checkWinner方法调用和if语句的位置。当我设置winner=true时这不应该
checkWinner
的方法调用的位置不正确,因为X和O的赋值总是完成的。为什么循环不会在有赢家时结束
它将根据方法调用返回正确的赢家,但是for循环将继续迭代并填充其余的(因此有时它看起来像是x和o赢了或者一个赢了两次)。我一直在发疯,想这可能是我的checkWinner
方法调用和if语句的位置。当我设置winner=true时代码>这不应该取消循环吗?我试着把它放在每个for循环的内部和外部之间,但没有运气:(
我已经标记了我认为是问题所在的区域。////这里出了什么问题?//在代码的右边。感谢您的任何输入!!:)
public void actionPerformed(ActionEvent e)
{
整数合计=0,i=0;
布尔赢家=假;
//如果找到赢家,停止当前游戏
做{
//为标签生成随机#0-1并分配
//X表示0值,O表示1值
对于(int row=0;row
在两个循环完成之前,您不会检查winner
的值。在设置winner=true
后立即添加一个中断
,然后添加一个
if (winner)
{
break;
}
到外部for
循环的开始或结束。您的问题是do/while语句围绕着for
语句。因此,for
语句在到达while
语句之前就运行了整个循环。解决这个问题的一个方法是在for
语句中检查是否有赢家,并打破:
//stop current game if a winner is found
do {
for (int row = 0; row < gameboard.length; row++) //rows
{
for (int col = 0; col < gameboard[row].length; col++) //columns
{
// ... your other code ...
total = checkWinner(gameboard);
if(total == 30 || total == 300) {
winner = true;
break; // end current for-loop
}
i++; //next label
}
if (winner) break; // we have a winner so we want to kill the for-loop
} //end for
} while(!winner); //end while
//如果找到赢家,停止当前游戏
做{
对于(int row=0;row
因此,你应该能够在这两个语句之间循环,然后找到一个胜利者。您的代码似乎也无法处理绑定的情况,但我猜您已经知道了。我认为您应该更改循环条件并添加一个bool
你有一个“平局”的条件,但目前你只检查赢家。唯一没有checkWinner代码的解释是,你每次都会遇到平局
所以
编辑:我没有意识到您将while循环放在for循环之外,您需要中断for循环才能检查while条件
//stop current game if a winner is found
do{
for (int row = 0; row < gameboard.length; row++) //rows
{
for (int col = 0; col < gameboard[row].length; col++) //columns
{
if(winner || tie)
break;
}//end for
if(winner || tie)
break;
}//end for
}while(!(winner || tie));//end while
//the rest of your stuff here
//如果找到赢家,停止当前游戏
做{
对于(int row=0;row
最简单的方法是一次中断所有循环。(即使有些人不喜欢这样)
outerwhile:while(true){
//为标签生成随机#0-1并分配
//X表示0值,O表示1值
对于(int row=0;row
然而,这不允许“平局”选项,因为如果没有找到赢家,while将基本上重新启动游戏。要允许平局,您根本不需要外线,当找到赢家时,您可以同时离开两个FOR:
Boolean winner = false;
outerfor: for (int row = 0; row < gameboard.length; row++) //rows
{
for (int col = 0; col < gameboard[row].length; col++) //columns
{
total = checkWinner(gameboard);
if(total == 30 || total == 300){
winner = true;
break outerfor; //leave outer for, implicit canceling inner for.
}
i++; //next label
}
}//end for
if (winner){
//winner
}else{
//tie.
}
Boolean-winner=false;
outerfor:for(int行=0;行//stop current game if a winner is found
do{
for (int row = 0; row < gameboard.length; row++) //rows
{
for (int col = 0; col < gameboard[row].length; col++) //columns
{
if(winner || tie)
break;
}//end for
if(winner || tie)
break;
}//end for
}while(!(winner || tie));//end while
//the rest of your stuff here
outerwhile: while(true){
// Generate random # 0-1 for the labels and assign
// X for a 0 value and O for a 1 value
for (int row = 0; row < gameboard.length; row++) //rows
{
for (int col = 0; col < gameboard[row].length; col++) //columns
{
total = checkWinner(gameboard);
if(total == 30 || total == 300)
break outerwhile; //leave outer while, implicit canceling all inner fors.
i++; //next label
}
}//end for
}//end while
Boolean winner = false;
outerfor: for (int row = 0; row < gameboard.length; row++) //rows
{
for (int col = 0; col < gameboard[row].length; col++) //columns
{
total = checkWinner(gameboard);
if(total == 30 || total == 300){
winner = true;
break outerfor; //leave outer for, implicit canceling inner for.
}
i++; //next label
}
}//end for
if (winner){
//winner
}else{
//tie.
}
public int doGame( Labels labels)
{
labels = " ";
int itisXmove = true; // player X or O turn
for( int movesLeft = 9; movesLeft > 0; movesLeft --)
{
int position = // 0 .. movesLeft-1
(int) Math.floor(Math.random() * movesLeft);
for( int pos = 0; pos < 9; pos ++) // find position
if( labels[ pos] == " ") // unused pos?
if( position-- == 0) // countdown
{
if( itisXmove) // use the pos
labels[ pos] = "X"; // for current player
else
labels[ pos] = "O";
break;
}
int result = checkWinner( labels); // who wins (non-zero)?
if( result != 0)
return result;
itisXmove = ! itisXmove; // next turn
}
return 0; // a tie
}
public void actionPerformed(ActionEvent e)
{
Labels labels;
int result = doGame( labels);
if( result == valueForX)
JOptionPane.showMessageDialog(null, "X is the Winner!");
else if( result == valueForO)
JOptionPane.showMessageDialog(null, "O is the Winner!");
else
JOptionPane.showMessageDialog(null, "It's a tie!");
for( int rowpos = 0; rowpos < 9; rowpos += 3)
{
for( int colpos = 0; colpos < 3; colpos ++)
/* output (char)label[ rowpos + colpos] */;
/* output (char)newline */;
}
}