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

您可以使用这些按钮创建一个数组,这样您就不必检查名称:

Button[9] gameField;

创建[3,3]数组可能更直观,但在这种情况下,普通数组更容易使用。
然后,您可以计算其中有多少是免费的:

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

如果要随机选择其中一个免费的,请在范围内生成一个随机数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 更有野心:

  • 电脑玩家有没有连续两个O,第三场是空的?如果是这样,请选择那个。
  • 人类玩家是否连续两个 X 并且第三个字段是空闲的?如果是这样,请选择那个。

有一些技巧可以利用该策略,也有更好的启发式方法,但我将把它留给你。

于 2013-02-21T08:38:10.343 回答
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 回答