我正试图想办法让计算机播放器基本上看到“这个地点被拍摄,我应该看看是否有其他人是免费的并且接受它”。
到目前为止,我没有做任何改进(比如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
}
}
}
我的问题很简单:如何解决这个问题并了解发生了什么?或者更有效率地做到这一点?
答案 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更加雄心勃勃:
有利用这种策略的技巧,也有更好的启发式方法,但我会把它留给你。
答案 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;