Unity保持冻结在具有随机功能的while循环中

时间:2018-08-21 15:47:25

标签: c# visual-studio unity3d random infinite-loop

我正在使井字游戏统一,当轮到计算机时,它会选择一个随机数(如果已经标记了该随机数),那么它将生成另一个随机数并再次对其进行检查,但是它陷入了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);

    }
 }

2 个答案:

答案 0 :(得分:1)

类似的问题不断涌现,但我不认为这是重复的问题,但这是具有不同解决方案的相同问题。

您不应使用Random.Range确定何时退出功能。这注定会失败,结果是无限循环。一旦在代码中看到类似while(Random.Range(...))的内容,就必须停止并重新评估如何解决此问题。

在您的特定情况下,下面的代码中的条件必须为false,以便将该随机数视为正常:

while (markedSpaces[rand] != 1 || markedSpaces[rand] != 2)

重新编写代码,并不需要依赖Random.Range的循环。

创建一个循环访问markedSpaces的函数,并检查markedSpaces的值是1还是2。如果是12,请将其添加到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)