Цикл, который только добавляет неповторяющиеся значения в список? - PullRequest
0 голосов
/ 03 февраля 2019

РЕДАКТИРОВАТЬ: 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);
        }
    }

Проблема в том, что оператор if всегда верен.Выходные данные консоли показывают количество циклов цикла X раз, а выражение if также является истинным значением X раз.

Это просто невозможно сделать в цикле while.Или я что-то не так делаю?Спасибо!

РЕДАКТИРОВАТЬ: Да, и чтобы быть ясно, да дубликаты добавляются.Я пытаюсь сгенерировать 5 уникальных координат в области 3х3, и почти всегда есть дубликаты!

Ответы [ 2 ]

0 голосов
/ 03 февраля 2019

РЕДАКТИРОВАТЬ: OP здесь, его ответ.Не можете принять мой собственный ответ в течение 2 дней?Не знаю, я стог нуб.Спасибо людям, которые помогли.

Я исправил это, это не красиво, но это работает.Массив логических значений для отслеживания, если значение уже использовалось.И не добавлять / удалять значения из списка внутри цикла 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);
    }
0 голосов
/ 03 февраля 2019

Если я вас правильно понял, вы хотите сравнить содержимое многомерных массивов или, может быть, только их размеры.Но метод .Contains () ищет ссылочное равенство, и оно всегда уникально, потому что вы вызываете «new».Я определил для него метод расширения.

    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);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...