1

最初のコードが実行され、私が手を動かした後、コンピューターは常に Tic Tac Toe ボードの右下のスポットを取得しようとします。

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

私が助けてくれた2番目のコードは...まったく同じことをします:

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

理由がわかりません。2 つ目はコンピュータがランダムになることを目的としており、1 つ目は予測可能になるように設定されています。なぜ彼らは両方とも同じことをしているのですか?

4

1 に答える 1

1

target2 番目の解決策では、値を使用しません。現在のループ値を使用しますc。すべての check it ロジックをtargetの代わりに使用するように変更しcます。外側のループと 2 つの外側の if ステートメントをまとめて削除することもできます。

于 2013-02-21T10:07:37.453 に答える