我正在使井字游戏统一,当轮到计算机时,它会选择一个随机数(如果已经标记了该随机数),那么它将生成另一个随机数并再次对其进行检查,但是它陷入了while循环i不知道为什么。
public void checkComputer()
{
if ( Variab == 0 && whoseTurn == 1)
{
int j = 0;
int rand = Random.Range(0, 8);
while (markedSpaces[rand] != 1 || markedSpaces[rand] != 2)
{
rand = Random.Range(0, 8);
j++;
}
TicTacToeButton(rand);
}
}
答案 0 :(得分:1)
类似的问题不断涌现,但我不认为这是重复的问题,但这是具有不同解决方案的相同问题。
您不应不使用Random.Range
确定何时退出功能。这注定会失败,结果是无限循环。一旦在代码中看到类似while(Random.Range(...))
的内容,就必须停止并重新评估如何解决此问题。
在您的特定情况下,下面的代码中的条件必须为false
,以便将该随机数视为正常:
while (markedSpaces[rand] != 1 || markedSpaces[rand] != 2)
重新编写代码,并不需要依赖Random.Range
的循环。
创建一个循环访问markedSpaces
的函数,并检查markedSpaces
的值是1
还是2
。如果是1
或2
,请将其添加到List
中,然后返回该List
:
List<int> GetValidSpacesIndexes()
{
List<int> markedSpacesIndexes = new List<int>();
//Loop through the markedSpaces
for (int i = 0; i < 8; i++)
{
//Get indexes with 1 or 2 values
if (markedSpaces[i] == 1 || markedSpaces[i] == 2)
{
markedSpacesIndexes.Add(i);
}
}
return markedSpacesIndexes;
}
现在,在您的checkComputer
函数中,调用GetValidSpacesIndexes
函数,使用Random.Range(0, validSpacesIndexes.Count)
从该值中获取有效索引。使用返回的随机数获取从markedSpaces
返回的正确值,这就是应该传递给TicTacToeButton
函数的内容。
public void checkComputer()
{
if (Variab == 0 && whoseTurn == 1)
{
//Get Valid indexes
List<int> validSpacesIndexes = GetValidSpacesIndexes();
//Geneate Random number within valid Indexes
int rand = Random.Range(0, validSpacesIndexes.Count);
//Get the index value
rand = markedSpaces[rand];
TicTacToeButton(rand);
}
}
答案 1 :(得分:0)
我认为您应该重新考虑自己的操作方式。考虑计算机只有一个可用空间的情况。是的,最终,计算机会猜出正确的数字...但是,它必须不断生成随机数,直到获得正确的数字为止...就资源而言有点浪费。假设地,它可能会无限期地产生错误的数字……如果您愿意,您可以创建一个非玩过的正方形数组,并在其范围内生成一个随机索引。这样只会产生一个随机数。
但是,对于您当前的问题,我认为这是因为您使用的是“或”而不是“与”。如果标记空间== 1,则标记空间!= 2为true。如果markedspace == 2,则markedspace!= 1为true。如果markedspace是任何其他数字,则两个条件都成立。因此,您将遇到一个无限循环,因为无论它产生什么,它都会产生一个真实值。
尽管,如果您说1和2代表玩家,空白方块由0代表,那么您的条件需要重写...看起来您正在尝试选择随机数,只要当前平方为0 ...这可能与您想做的事情相反...您应该将其更改为:
while (markedSpaces[rand] != 0)
或者,或者:
while (markedSpaces[rand] == 1 || markedSpaces[rand] == 2)