Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.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_Loops_Do While_Tic Tac Toe - Fatal编程技术网

Java 为什么赢了';循环不能停止迭代吗?

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时这不应该

我是一名java初学者,正在为我的班级编写gui tic tac toe程序。(没有播放器,只是电脑生成的)

除了一件事,我的程序中的一切都按预期工作;似乎我对
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 */;
    }
}