разрывается во время цикла, когда все кубики катятся с одинаковым числом

#c# #random #die

Вопрос:

 using System;
using System.Collections.Generic;
namespace AnyDice
{
    class Program
    {
        static void Main(string[] args)
        {
            int diceSides;
            int rollDie;
            int count = 0;
            bool keepRolling = true;
            List<int> num = new List<int>();
            Random random = new Random();

            Console.Write("Write the number of sides of your die: ");
            diceSides = Convert.ToInt32(Console.ReadLine());

            Console.WriteLine("Type the numbers of the die");

            for (int i = 0; i < diceSides; i  )
            {
                int rank = 1   i;
                Console.Write(rank   "~~> ");
                num.Add(Convert.ToInt32(Console.ReadLine()));
            }

            num.Sort();

            Console.WriteLine("nHere's the die and its contents");
            for (int i = 0; i < num.Count; i  )
            {
                Console.Write("[");
                Console.Write(num[i]);
                Console.Write("]");
            }

            Console.WriteLine("nHow many times do you want to roll at once");
            rollDie = Convert.ToInt32(Console.ReadLine());
            while (keepRolling)
            {
                for (int i = 0; i < rollDie; i  )
                {
                    Console.Write("[");
                    Console.Write(num[random.Next(num.Count)]);
                    Console.Write("]");
                    count  ;
                }
                Console.ReadLine();
            }

            Console.WriteLine("It took you "   count   " attempts");

            Console.ReadLine();
        }
    }
}

 

Например, если (4,4,4,4) свернуто или (2,2) в любом «n» — ном столбце, цикл while прерывается.
Я подумал о том, чтобы сохранить каждое значение прокатки штампа в другом списке массивов и сравнить каждое значение в нем. Если все равно, то он ломается.. но я понятия не имею, как это реализовать.

Комментарии:

1. если (num.Distinct(). Количество() == 1) { }

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

3. в основном прерывайте цикл, когда все прокатанные штампы имеют одинаковое точное число

4. @jdweng num -это жребий, а не броски.

5. Добавьте a List<int> для отслеживания бросков: var rolls = new List<int>(); . Сохраните каждый рулон в списке: var roll = num[random.Next(num.Count)]; rolls.Add(roll); а Console.Write(roll); затем проверьте, совпадают ли рулоны: keepRolling = rolls.Distinct().Count() == 1;

Ответ №1:

У нас есть Линк. Он живет в System.Linq пространстве имен, и это может вам помочь.

Я должен буду двумя способами проверить, все ли смерти одинаковы:

 int first = dies.First();
if (dies.All(i => i == first))
{
  // break if all are equals to the first die
}
 

Или с помощью Distinct мы можем отфильтровать любые копии.

 if (dies.Distinct().Count() == 1)
{
  // if we only have unique items and the count is 1 every die is the same
}
 

Комментарии:

1. Это ужасное решение. Вы используете две переменные, когда можете использовать только одну переменную.

Ответ №2:

Я не уверен на 100%, что понимаю ваше требование, но в любом случае вам следует написать отдельную функцию, которая возвращает флаг, указывающий, находится ли массив в состоянии, которое должно вызвать разрыв.

 bool KeepRolling(int[] num)
{
    for (int i=0; i<num.Length; i  )
    {
        if (num[i] >= i) return false;
    }
    return true;
}
 

Затем просто вызовите его из своего цикла:

 keepRolling = KeepRolling(num);
 

Ответ №3:

             while (keepRolling)
            {
                rolls.Clear();
                for (int i = 0; i < rollDie; i  )
                {
                    var firstRoll = num[random.Next(num.Count)];
                    rolls.Add(firstRoll);
                    Console.Write(firstRoll   " ");
                    count  ;
                }
                if (rolls.Distinct().Count() == 1)
                {
                    Console.WriteLine("It took you "   count   " attempts");
                    keepRolling = false;
                    break;
                }
                Console.ReadLine();
            }
 

Комментарии:

1. Добро пожаловать в Stack Overflow, и спасибо вам за ответ. Не могли бы вы, пожалуйста, отредактировать свой ответ, чтобы включить объяснение вашего кода? Это поможет будущим читателям лучше понять, что происходит, и особенно тем членам сообщества, которые новички в языке и изо всех сил пытаются понять концепции.