2012-01-22 66 views
0

本质上,当按下按钮时,调用randomMove()方法,这意味着不会在TicTacToe中找到空方块,然后为其分配“O”,问题是因为至少有两个方格变成了“O”,所以它不会跳出循环。跳出for循环的问题

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

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(); 
    } 
+0

你嵌套循环。你的意思是只打破嵌套的? – Oded

回答

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方法是这样的,国际海事组织(

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

     if(btn == null) return; 

     btn.Text = "O"; 
     hasWon(); 
    } 
+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

goto是邪恶的......你可以但你不应该 –

+0

@ Muad'Dib但应该比使用国旗更快。 –

+0

@FelixK。该标签表示C#,而不是GWBASIC或Quickbasic;) – 2012-01-22 20:50:14

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

你break语句只会逃跑的第一个for循环,你将需要使用另一个突破或一些其他机制。

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

除了其他的答案,我想你的按钮上的文字是不会更新,你会用你compMove()功能希望。

ia永远不会有高于2的值,如您的循环所定义的。

因此,价值最高的compMove()功能所能获得的4

尝试改变:

Temp = i + a; 
compMove(Temp); 

要这样:

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

哈哈!哇,是的,谢谢,这是一个非常明显的错误,但要公平,我不认为我会注意到它,循环混淆了我出于某种原因,我认为我只需要更多的练习与他们。谢谢 :) –