2013-02-21 1 views
1

Мой первый код выполняется, и после того, как я делаю свой ход, компьютер всегда пытается получить правый нижний пятно бордюрной доски Tic Tac:C# - Почему выполнение этих разных кодов дает мне тот же результат?

private void ComputersTurn() 
    { 
     Control.ControlCollection coll = this.Controls; 
     foreach (Control c in coll)//for each button in form 
     { 
      if ((c != null) && (c is Button))//if c is a button and c has a value 
      { 
       if ((c.Name != "btnNewGame") && (c.Name != "btnExit")) // if the button isnt btn new game or exit 
       { 

        if (c.Enabled == true) //if a button has an X 
        { 
         c.Text = "O"; //place an O 
         c.Enabled = false; //in a empty button 
         CheckComputerWinner(); //check if it wins 
         return; //return result 
        }//end of if 
       }//end of if 2 
      }//end of if 1 
     }//end of foreach 
    }//end of ComputersTurn 

Второй код, который я получил помощь с .. .does точно такой же вещи:

private void ComputersTurn() 
    { 
     Control.ControlCollection coll = this.Controls; 
     foreach (Control c in coll)//for each button in form 
     { 
      if ((c != null) && (c is Button))//if c is a button and c has a value 
      { 
       if ((c.Name != "btnNewGame") && (c.Name != "btnExit")) // if the button isnt btn new game or exit 
       { 
        gamefield = new Button[] { btn1, btn2, btn3, btn4, btn5, btn6, btn7, btn8, btn9 }; 
        int freeCount = gamefield.Count(b => b.Text != "X"); 

        int offset = RandomGenerator.GenRand(0 - 8, freeCount - 1); 
        Button target = gamefield.Where(b => b.Text != "X").Skip(offset).FirstOrDefault(); ; 
        if (target != null)//if target has an X 
        { 
         // check it 
         if (c.Enabled == true) 
         { 
          c.Text = "O"; //O will be inside the button 
          c.Enabled = false; //button can no long be used 
          CheckComputerWinner(); //check if it finishes task 
          return; 
         } 
        } 
       } 
      } 
     } 
    }//end of ComputersTurn 

генератор случайных

public static class RandomGenerator 
    { 
     private static readonly Random _random = new Random(); 

     public static int GenRand(int x, int y) 
     { 
      return _random.Next(x, y); 
     } 
    } 

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

+1

Как определить 'c'? И что вы подразумеваете под «тем же результатом»? – antonijn

+0

Потому что как-то код нарушается? «непредсказуемый» означает, что он может работать :-) –

+0

Трудно сказать, почему он не дает случайный результат, когда код, генерирующий случайное значение, недоступен :( – Evelie

ответ

1

Второе решение никогда не использует значение target. Он использует текущее значение цикла c. Измените все, чтобы проверить логику, чтобы использовать target вместо c. Вы также можете исключить внешний цикл и два внешних оператора if.

+0

Это немного изменило его. Вместо этого теперь он всегда выбирает верхнюю левую сторону. Однако, как и старый первый код, он меняет свое положение, основываясь на том, выигрывает или проигрывает (что я не кодировал). –

+0

Рад, что помогло. Удачи вам в вашем проекте! –

+0

А, вот это @Evelie занялась другой проблемой. Спасибо <3! –

Смежные вопросы