1

私は、基本的に「この場所が撮影されました。別の場所が空いているかどうかを確認して、それを取得する必要があります」を見て、コンピュータープレーヤーが私の動きに反応するようにする方法を見つけようとしています。

これまでのところ、改善は行っていません(5時間程度)。特定のボタン(ランダムに選択した)が使用されたかどうかをコンピューターに認識させたいので、別の選択を検討する必要があります。if / elseが実際にどこに行くべきか、または別の場所を試すためにどこに/何を入れるべきかわからない。

これが私のアイデアに関するコメント付きのコードスニペットです(私がやりたい場所の配置が間違っている可能性があります):

if (c.Enabled == true) //if the button is free
{
    if ((c.Name == "btn" + Convert.ToString(RandomGenerator.GenRand(1, 9)) )) //if a specific button is free
    {
        if ((c.Text != "X")) //if its empty
        {
            //do this
            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;
        }
        else //if it is an X
        {
            //try a different button choice instead
            //see if that button is empty
                //do stuff
            //else
                //... repeat until all buttons are checked if free
        }
    }
}

私の質問は単純です:これを修正して何が起こっているのかを理解するにはどうすればよいですか?それとももっと効率的にしますか?

4

2 に答える 2

0

ここでwhileループを探しています。次のようにコードを変更できます。

Button c;
// here you look for a Button within the Controls of your Form. It stops when an Enabled Button with Text != "X" is found
do
{
    c = this.Controls.Find("btn" + Convert.ToString(RandomGenerator.GenRand(1, 9)), true).FirstOrDefault() as Button;
} while (c == null || !c.Enabled || c.Text == "X");
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;
于 2013-02-21T08:55:23.043 に答える
0

これらのボタンを使用して配列を作成できるため、名前を確認する必要はありません。

Button[9] gameField;

配列を作成する[3,3]方がより直感的かもしれませんが、この場合は単純な配列を使用する方が簡単です。
次に、そのうちの何個が空いているかを数えます。

int freeCount = gameField.Count(b => b.Text != "X");

無料のものの 1 つをランダムに選択する場合は、範囲内で乱数を生成し0 - (freeCount - 1)、適切なボタンを選択します。

int offset = RandomGenerator.GenRand(0, freeCount - 1);
Button target = gameField.Where(b => b.Text != "X").Skip(offset).FirstOrDefault();
if (target != null) {
    // check it
}

拡張メソッドWhereは、無料のボタンのみを返すようにボタンをフィルタリングします。Skip指定された数の要素をスキップし (ランダム選択の場合) FirstOrDefault、結果のシーケンスの最初の要素を返します (またはnull何もない場合)。

注: フィールドをランダムに選択して AI をもう少し野心的にする前に、いくつかのケースを確認することをお勧めします。

  • コンピューター プレーヤーは、3 番目のフィールドが空いている状態で 2 つ続けて O を持っていますか? もしそうなら、それを選択してください。
  • 人間のプレイヤーは、3 番目のフィールドが空いている状態で 2 つの X を続けていますか? もしそうなら、それを選択してください。

その戦略を利用するためのトリックがあり、より優れたヒューリスティックもありますが、それはあなたに任せます.

于 2013-02-21T08:38:10.343 に答える