Случайный класс, а если в симуляторе бросать кубики? - PullRequest
0 голосов
/ 18 мая 2019

Я новичок в C #, и у меня есть домашнее задание, где я должен написать симулятор броска костей.

Пользователь может выбрать максимум 5 кубиков, а затем, когда они бросают каждый, сумма складывается с ранее брошенным. В конце представлены количество рулонов и общая сумма.

Однако, если пользователь бросает 6, тогда этот результат не добавляется к сумме, но бросок бросается еще дважды, и затем сумма добавляется.

У меня есть несколько моментов, в которых я застрял и / или хотел бы узнать, как лучше это написать. Я включил фрагмент ниже.

  1. Ниже я указывал свой случайный класс каждый раз, когда выпадает игра в кости, но могу ли я сделать это только один раз, а затем использовать в своем коде?

  2. Есть ли простой способ написать часть с тем, что произойдет, если вы бросите 6? Я имею в виду, я думаю, я мог бы написать еще одно выражение if каждый раз, когда выпадет кубик, но кажется, что это будет очень долго?

if (intnumberofdie == 1)

            {
                Random rnd1 = new Random();
                int dice1 = rnd1.Next(1, 7);

                Console.WriteLine("You have rolled " + dice1);


            else if (intnumberofdie == 2)

            {
                Random rnd1 = new Random();
                int dice1 = rnd1.Next(1, 7);

                Console.WriteLine("The first die rolled " + dice1);

                Console.ReadKey();

                Random rnd2 = new Random();
                int dice2 = rnd2.Next(1, 7);

                Console.WriteLine("The second die has rolled " + (dice2));

                Console.ReadKey();

                Console.WriteLine("The total sum so far is " + (dice1 + dice2));

}

Ответы [ 2 ]

1 голос
/ 18 мая 2019

Попробуй:

var rnd1 = new Random();
var rollsRemaining = 6;
var sum = 0;
while (rollsRemaining > 0)
{
    int dice1 = rnd1.Next(1, 7);
    Console.WriteLine("You have rolled " + dice1);
    if (dice1 == 6)
    {
        rollsRemaining += 2;    
    }
    else
    {
        sum += dice1;
        rollsRemaining -= 1;
    }
}
Console.WriteLine("The sum is " + sum);
0 голосов
/ 18 мая 2019

Поскольку вы новичок, я постараюсь сначала объяснить несколько вещей. Если у вас есть несколько раз, вы должны сделать то же самое, вы никогда не должны обрабатывать каждый случай самостоятельно. Это означает, что вы не должны использовать if else if else .., а вместо этого используйте цикл вроде for или while.

Я написал короткую функцию, которая должна делать то, что вы хотите.

private int GetNumber(int amountDie) {
    if (amountDie <= 0 || amountDie > 5) return 0;

    int total = 0;

    for (int i = 0; i < amountDie; i++)
    {
        int roll = rnd.Next(1, 7);

        if (roll == 6)
        {
            int specialRoll1 = rnd.Next(1, 7);
            int specialRoll2 = rnd.Next(1, 7);

            total += specialRoll1;
            total += specialRoll2;
        }
        else {
            total += roll;
        }
    }

    return total;
}

Теперь еще несколько объяснений: Поскольку вы сказали, что у вас не может быть больше 5 кубиков, мы сначала проверим правильность заданного значения, в противном случае мы просто вернем 0 (в этом случае есть вещи получше, но для простоты мы просто скажем они возвращаются 0).
После этого мы объявляем общее количество, чтобы отследить, сколько очков мы должны вернуть.
Затем мы начинаем цикл. Для каждого кубика мы бросаем один раз (первая строка в for-construct). Так как нам нужно проверить, бросил ли пользователь 6, у нас это есть, если есть. Внутри него мы бросаем два кубика и добавляем оба результата к итогу. Обратите внимание, что для этих двух бросков 6 аналогичен любому другому числу и не обрабатывается по-другому (если вам это нужно, это будет немного сложнее).
Если пользователь не бросил 6, мы просто добавляем все, что они бросили, к общему количеству.

После того, как мы сделали это для всех умирающих, мы просто возвращаем полученную сумму.

Вы увидите, что если вы просто скопируете и вставите этот код, он не скомпилируется. Причина этого в том, что вам не хватает Random-объекта. В своем коде вы всегда создавали новый при каждом переходе. Это проблема, поскольку класс Random не такой случайный, как вы могли бы подумать, и вы всегда должны создавать только один для многих случайных чисел.
Вот почему я добавил это в верхней части моего класса:
private static readonly Random rnd = new Random();

Этот случайный объект создается только один раз, а затем используется для каждого кубика. Это дает вам гораздо больше случайности и предотвращает, что каждый пользователь всегда бросает одно и то же значение.

Надеюсь, это покажет вам, как вы можете создать такой метод. Конечно, вы можете добавить консольный вывод и т. Д., Как вы сделали в своем коде.

...