#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, и спасибо вам за ответ. Не могли бы вы, пожалуйста, отредактировать свой ответ, чтобы включить объяснение вашего кода? Это поможет будущим читателям лучше понять, что происходит, и особенно тем членам сообщества, которые новички в языке и изо всех сил пытаются понять концепции.