突破for循环的问题

时间:2012-01-22 20:37:16

标签: c# for-loop nested-loops

基本上,当按下一个按钮时,调用randomMove()方法,这意味着要在TicTacToe中找到一个空方块,然后给它分配一个“O”,问题是它不会破坏离开循环,因为至少两个方格变成“O”。

我不确定我哪里出错了,但我不怀疑这是一个简单的解决方案。

 private void randomMove()
    {
        for (int i = 0; i < 3; i++)
        {
            for (int a = 0; a < 3; a++)
            {
                if (Board[a,i] == "")
                {
                    Board[a,i] = "O";
                    Temp = i + a;
                    compMove(Temp);
                    break;
                }  
            }
        }
    }

    private void compMove(int Temp)
    {
        switch (Temp)
        {
            case 0:
                btn1.Text = "O";
                break;
            case 1:
                btn2.Text = "O";
                break;
            case 2:
                btn3.Text = "O";
                break;
            case 3:
                btn4.Text = "O";
                break;
            case 4:
                btn5.Text = "O";
                break;
            case 5:
                btn6.Text = "O";
                break;
            case 6:
                btn7.Text = "O";
                break;
            case 7:
                btn8.Text = "O";
                break;
            case 8:
                btn9.Text = "O";
                break;
        }
        hasWon();
    }

6 个答案:

答案 0 :(得分:2)

您可以使用局部变量来突破第二个循环(使用布尔值)。或者您使用goto MyLabel;并使用MyLabel:;定义标签。当只有一个简单的方法时,你也可以使用return。

    Boolean finish = false;
    for (int i = 0; i < 3; i++)
    {
        for (int a = 0; a < 3; a++)
        {
            if (Board[a,i] == "")
            {
                Board[a,i] = "O";
                Temp = i + a;
                compMove(Temp);
                finish = true;
                break;
            }  
        }
        if (finish) break;
    }


    for (int i = 0; i < 3; i++)
    {
        for (int a = 0; a < 3; a++)
        {
            if (Board[a,i] == "")
            {
                Board[a,i] = "O";
                Temp = i + a;
                compMove(Temp);
                goto Finish;
            }  
        }
    }
    Finish: ...

答案 1 :(得分:1)

当找到空白点时,您需要突破两个循环。您的代码只会突破嵌套代码。

这是一种方法:

private void randomMove()
{
    bool foundEmpty = false;
    for (int i = 0; i < 3; i++)
    {
        for (int a = 0; a < 3; a++)
        {
            if (Board[a,i] == "")
            {
                Board[a,i] = "O";
                Temp = i + a;
                compMove(Temp);
                foundEmpty = true;
                break;
            }  
        }

        if (foundEmpty)
           break;
    }
}

答案 2 :(得分:1)

你的break语句只会转义第一个for循环,你需要使用另一个break或其他一些机制。

答案 3 :(得分:1)

你忘了从更大的循环中脱离出来..改变代码一点看起来像这样:

private void randomMove()
{
    bool flag = false;
    for (int i = 0; i < 3; i++)
    {
        for (int a = 0; a < 3; a++)
        {
            if (Board[a,i] == "")
            {
                Board[a,i] = "O";
                Temp = i + a;
                compMove(Temp);
                flag = true;
                break;
            }  
        }
        if (flag)
             break;
    }
}

答案 4 :(得分:1)

好吧,如果我查看提供的代码,如果我正确理解了你想要的内容,那么你需要的唯一的return,就像这样:

private void randomMove()
{
        for (int i = 0; i < 3; i++)
        {
            for (int a = 0; a < 3; a++)
            {
                if (Board[a,i] == "")
                {
                    Board[a,i] = "O";
                    Temp = i + a;
                    compMove(Temp);
                    return;
                }  
            }
        }
 }

最好将compMove方法改为这样的方式,imo(伪代码

   private void compMove(int Temp)
   {
      int buttonIndex = Temp + 1;
      Button btn = FindControl("btn" + buttonIndex) as Button;

      if(btn == null) return;

      btn.Text = "O"; 
      hasWon();
   }

答案 5 :(得分:1)

除了其他答案之外,我认为您的按钮文字不会像您希望的那样使用compMove()功能进行更新。

根据您的循环定义,

ia永远不会有超过2的值。

因此,compMove()函数获得的最高值为4。

尝试更改:

Temp = i + a;
compMove(Temp);

对此:

Temp = (i*3) + a;
compMove(Temp);