C# - If / Else帮助[用户和计算机输入交互]

时间:2013-02-21 08:29:27

标签: c#

我正试图想办法让计算机播放器基本上看到“这个地点被拍摄,我应该看看是否有其他人是免费的并且接受它”。

到目前为止,我没有做任何改进(比如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
        }
    }
}

我的问题很简单:如何解决这个问题并了解发生了什么?或者更有效率地做到这一点?

2 个答案:

答案 0 :(得分: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,第三个字段是免费的吗?如果是,请选择该一个。

有利用这种策略的技巧,也有更好的启发式方法,但我会把它留给你。

答案 1 :(得分:0)

你在这里寻找一个循环。您可以按如下方式修改代码:

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;