【问题标题】:Issues with breaking out of a for loop跳出 for 循环的问题
【发布时间】:2012-02-16 09:07:26
【问题描述】:

本质上,当按下按钮时,会调用 randomMove() 方法,这意味着不是在井字游戏中找到一个空方格然后为其分配一个“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();
    }

【问题讨论】:

  • 你有嵌套循环。你的意思是只打破嵌套的吗?

标签: c# for-loop nested-loops


【解决方案1】:

您可以使用局部变量来跳出第二个循环(使用布尔值)。或者您使用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: ...

【讨论】:

  • goto 是邪恶的......你可以,但你不应该
  • @Muad'Dib 但应该比使用标志更快。
  • @FelixK。标签上写着 C#,而不是 GWBASIC 或 Quickbasic ;)
  • @HaLaBi goto 是 C# 关键字。
  • @Felix K. goto 不是最佳实践...从侏罗纪公园吸取的教训:仅仅因为你可以做一件事,并不意味着你应该做一件事
【解决方案2】:

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

ia 的值永远不能高于 2,这由您的循环定义。

因此,您的 compMove() 函数将收到的最大值是 4。

尝试改变:

Temp = i + a;
compMove(Temp);

到这里:

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

【讨论】:

  • 大声笑!哇,是的,谢谢,这是一个非常明显的错误,但公平地说,我认为我没有注意到它,循环由于某种原因让我感到困惑,我认为我只需要更多地练习它们。谢谢:)
【解决方案3】:

好吧,如果我查看提供的代码,并且如果我正确理解了您想要的内容,那么您需要的唯一就是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 (pseudocode)

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

      if(btn == null) return;

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

【讨论】:

    【解决方案4】:

    你忘了从更大的循环中跳出来..稍微修改一下代码,如下所示:

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

        找到空位后,您需要跳出两个循环。您的代码只会跳出嵌套的代码。

        这是一种方法:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-10-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-11-15
          相关资源
          最近更新 更多