Проблемы с разрывом цикла for - PullRequest
0 голосов
/ 23 января 2012

По сути, когда нажимается кнопка, вызывается метод 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 ]

2 голосов
/ 23 января 2012

Вы можете использовать локальные переменные для выхода из второго цикла (с логическим значением). Или вы используете 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 голос
/ 23 января 2012

В дополнение к другим ответам, я думаю, что текст вашей кнопки не будет обновляться, как вы надеялись, используя функцию compMove().

i и a никогда не могут иметь значение больше 2, как определено вашими циклами.

Следовательно, самое высокое значение, которое ваша функция compMove() когда-либо получит, равно 4.

Попробуйте изменить:

Temp = i + a;
compMove(Temp);

На это:

Temp = (i*3) + a;
compMove(Temp);
1 голос
/ 23 января 2012

Ну, если я посмотрю на предоставленный код и, если я правильно понимаю, что вы хотите, то only , что вам нужно здесь, это 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();
   }
1 голос
/ 23 января 2012

Вы забыли вырваться из большого цикла ... немного измените код, чтобы он выглядел так:

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 голос
/ 23 января 2012

Ваш оператор break будет выходить только из первого цикла for, вам нужно будет использовать другой break или какой-то другой механизм.

1 голос
/ 23 января 2012

Вам нужно вырваться из обеих петель, когда было найдено пустое место. Ваш код только выходит из вложенного.

Вот один из способов сделать это:

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