Я хочу рандомизировать последовательность врагов, порожденных из числа различных врагов, которые появятся в волне. (TD GAME), как мне это сделать? - PullRequest
1 голос
/ 27 февраля 2020
    private void DetermineEnemySelection()
    {
        int _totalCount = 0;
        for(int i = 0; i < enemyCounts.Length; i++)
        {
            _totalCount += enemyCounts[i];
        }

        Stack<int> rn = new Stack<int>();

        for(int i = 0; i < _totalCount; i++)
        {
            int _sel = Random.Range(0, 5);
            if(enemyCounts[_sel] == 0)
            {

            }
        }
    }

Контекст: templeCounts [] содержит количество врагов каждого типа (врагиCounts [0] - количество врагов типа 1, которые появятся в волне)

_totalCount - общее количество враги, которые будут появляться на волне, включая врагов всех типов. Моя идея состояла в том, чтобы иметь стек чисел, который будет идентификатором типа врага. Числа go от 0 до 6 будут выбиты случайным образом. Если врагаCounts [_sel] пусто, я хочу создать новое случайное число и, если возможно, исключить это случайное число из диапазона (поэтому, если врагиСчета [3] пусто, возможно, сгенерировать числа 0 1 2 4 5)

Я не могу найти решение. У меня уже был один, который вовлекал какое-то время l oop, но через некоторое время игра по какой-то причине потерпела крах, достигнув 2701470 попыток сгенерировать следующего врага, что привело к краже sh. Мне бы хотелось, чтобы стек, в конце концов, имел длину _totalCount (чтобы у вас не было повторяющихся врагов) и выглядел примерно так {0,1,2,0,4,1,0,3,2,0,3 , 5,1,5,3,3,2,2,0} et c. Это означает, что это будет преемственность врагов.

Как лучше всего подойти к этому без бесконечных петель?

1 Ответ

0 голосов
/ 27 февраля 2020

Я нашел решение этой проблемы сам:

 private void DetermineEnemySelection()
    {
        int _totalCount = 0;
        for(int i = 0; i < enemyCounts.Length; i++)
        {
            _totalCount += enemyCounts[i];
        }

        Stack<int> _rn = new Stack<int>();
        List<int> _available = new List<int>();
        _available.Add(0);
        _available.Add(1);
        _available.Add(2);
        _available.Add(3);
        _available.Add(4);


        for (int i = 0; i < _totalCount; i++)
        {
            int _sel = _available[Random.Range(0, _available.Count)];
            if(enemyCounts[_sel] == 0)
            {
                _available.Remove(_sel);
                i--;
            } else
            {
                _rn.Push(_sel);
            }

        }
        enemySelection = _rn;
    }

...