一个循环,只会增加非重复值的列表?

问题描述 投票:0回答:2

编辑:OP在这里,它的回答。不能接受我自己2天的答案吗?说不上来我是一个堆栈小白。由于人们的帮助。

我想有产生一个随机坐标并将其添加到仅当坐标并不在列表中已经存在一个列表中的循环。

而只是不断循环,直到坐标的正确数量是在列表中。

    while (spawnPositions.Count < myPlayer.myPlayerUnits.Count)
    {
        Debug.Log("While");
        int[,] rnd = new int[UnityEngine.Random.Range(minX, maxX), UnityEngine.Random.Range(minZ, maxZ)];

        if (spawnPositions.Contains(rnd) == false)
        {
            Debug.Log("SpawnPos Added!");
            spawnPositions.Add(rnd);
        }
    }

问题是,如果语句总是如此。控制台输出显示了环环的次X量和if语句也是如此次X数量。

这只是不可能做while循环。还是我做错了什么?谢谢!

编辑:哦,要明确是重复添加。我想产生一个3x3的区域5个独特的坐标,而且几乎总是复制!

c# unity3d
2个回答
0
投票

如果我理解你的权利,你想多维数组或也许只有它们的尺寸的内容进行比较。但是。载有()方法查找参考平等,这始终是唯一的,因为你在呼唤“新”。余为它定义一个扩展方法。

    public static bool IsContentEqualTo(this int[,] array1, int[,] array2)
    {
        if (array1 == null) throw new ArgumentNullException(nameof(array1), "Array cannot be null");
        if (array2 == null) throw new ArgumentNullException(nameof(array2), "Array cannot be null");
        if (array1.GetLowerBound(0) != array2.GetLowerBound(0)) return false;
        if (array1.GetUpperBound(0) != array2.GetUpperBound(0)) return false;
        if (array1.GetLowerBound(1) != array2.GetLowerBound(1)) return false;
        if (array1.GetUpperBound(1) != array2.GetUpperBound(1)) return false;

        var xMin = array1.GetLowerBound(0);
        var xMax = array1.GetUpperBound(0);
        var yMin = array1.GetLowerBound(1);
        var yMax = array1.GetUpperBound(1);
        for (var x = xMin; x <= xMax; x++)
            for (var y = yMin; y <= yMax; y++)
            {
                if (array1[x, y] != array2[x, y]) return false;
            }

        return true;
    }

你可以把它像。

    if (!spawnPositions.Any(array => array.IsContentEqualTo(rnd)))
    {
        Debug.Log("SpawnPos Added!");
        spawnPositions.Add(rnd);
    }

0
投票

编辑:OP在这里,它的回答。不能接受我自己2天的答案吗?说不上来我是一个堆栈小白。由于人们的帮助。

我固定它,它不漂亮,但它的工作原理。布尔数组来跟踪如果该值已被使用。而不是actaully添加/从while循环内从列表中删除值(有几个无限循环尝试的东西:S)。

    bool[,] tileOccupied = new bool[maxX, maxZ];

    for (int i = 0; i < myPlayer.myPlayerUnits.Count; i++)
    {
        int tileValue = UnityEngine.Random.Range(0, myPlayer.mySpawnArea.Count);
        int[,] spawnTile = myPlayer.mySpawnArea[tileValue];

        if (tileOccupied[spawnTile.GetLength(0), spawnTile.GetLength(1)] == true)
        {
            do
            {
                tileValue = UnityEngine.Random.Range(0, myPlayer.mySpawnArea.Count - 1);
                spawnTile = myPlayer.mySpawnArea[tileValue];
            } while (tileOccupied[spawnTile.GetLength(0), spawnTile.GetLength(1)] == true);
        }
        tileOccupied[spawnTile.GetLength(0), spawnTile.GetLength(1)] = true;
        spawnPositions.Add(spawnTile);
    }
© www.soinside.com 2019 - 2024. All rights reserved.