Unity & C# - Выбор случайной строки из массива - PullRequest
0 голосов
/ 11 июля 2020

Я пытаюсь сделать простую игру «камень, ножницы, бумага». Мне нужен компьютер, чтобы случайным образом выбрать строку из массива КАМЕНЬ, БУМАГА и НОЖНИЦЫ. Вот что у меня есть на данный момент:

public string GetComputerChoice()
    {
        string computerChoice = null;
        string[] computerChoices = { "ROCK", "PAPER", "SCISSORS" };

        return computerChoice[Random.Next(computerChoices.Length)];
    }

Единственная ошибка, которую я получаю в Visual Studio, - это «Next», в котором говорится: «Random не содержит определения для« Next ».

Я совершенно новичок в программировании в целом. Какие-нибудь советы, почему это не работает, или что я могу сделать, чтобы это работало? Я читал другие ответы на похожие сообщения, но кажется, что все ответы - это просто блоки кода, чтобы заставить его работать, без объяснения, почему это работает.

Ответы [ 2 ]

0 голосов
/ 11 июля 2020

следует заменить строку ниже

return computerChoice[Random.Next(computerChoices.Length)];

этой строкой

return computerChoice[new Random().Next(computerChoices.Length)];

почему ?: Поскольку Random - это класс stati c, и вы не можете создать его экземпляр с помощью ключевого слова new. Причина в том, что классы stati c разделяются между потоками (контекстами, содержащими ваши запросы) и user a, в которых запрос использует exactly same class в том же memory location, что user b использует его.

Вы можете думать о классе stati c как о shared room, который используют несколько семейств и он принадлежит не только вам, тогда вы не имеете права вносить какие-либо изменения, вы можете просто использовать его!

когда вы используете ключевое слово new в своем коде, на самом деле вы making an instance of that class that just belong to you (вы: означает сделанный вами запрос).

0 голосов
/ 11 июля 2020

Метод Next() не является stati c, поэтому вам нужно создать экземпляр объекта Random, чтобы использовать его:

public string GetComputerChoice()
{
    string computerChoice = null;
    string[] computerChoices = { "ROCK", "PAPER", "SCISSORS" };

    return computerChoice[new Random().Next(computerChoices.Length)];
}

Однако создание нового объекта Random каждый раз случайное значение - не лучшая практика и может привести к неожиданным результатам, таким как повторяющиеся значения, особенно при вызове в быстрой последовательности, поскольку текущее время используется в начальном значении ГПСЧ (прочтите, как генераторы псевдослучайных чисел работай). В идеале вы должны создать объект Random один раз и сохранить его где-нибудь для повторного использования.

Я совсем не знаком с Unity, но похоже, что у него есть собственный класс Random, чтобы помочь вы вышли: Unity Random - Документация

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...