Скрытая ошибка в алгоритме - C#
Формулировка задачи:
Привет всем. Я тут всю ночь не спал - укреплял свои навыки программирования. Задался сделать программу "Фортуна" называется. Просто игра, в которой выпадают числа и собирается комбинация. Вроде бы всё сделал, но появилась ошибка при проверке, которую я не знаю как исправить. Просто не хватает опыта. Помогите кто может пожалуйста. Ошибка в комбинации двух пар. Вот кодик:
static void Game()
{
Random random = new Random();
int[] slot = new int[5];
do
{
Console.Clear();
for (int i = 0; i < slot.Length; ++i)
{
slot[i] = random.Next(1, 9);
Console.Write("{0} ", slot[i]);
}
Console.WriteLine();
int a = 0;
int b = 0;
// Комбинации
#region Пятёрки и четвёрки
for (int c = 0; c < slot.Length; ++c)
{
for (int d = 0; d < slot.Length; ++d)
{
if (slot[c] == slot[d])
{
a++;
}
}
if (a == 5 | a == 4) break;
else a = 0;
}
if (a == 5)
{
Console.WriteLine("Пятёрка!");
continue;
}
if (a == 4)
{
Console.WriteLine("Четвёрка!");
continue;
}
#endregion
#region Полный дом
for (int c = 0; c < slot.Length; ++c)
{
for (int d = 0; d < slot.Length; ++d)
{
if (slot[c] == slot[d])
{
a++;
}
}
if (a == 3)
{
for (int e = 0; e < slot.Length; ++e)
{
for (int f = 0; f < slot.Length; ++f)
{
if ((slot[e] != slot[c]) & (slot[e] == slot[f]))
{
b++;
}
}
if (b == 2) break;
else b = 0;
}
}
else a = 0;
break;
}
if (a == 3 & b == 2)
{
Console.WriteLine("Полный дом!");
continue;
}
#endregion
#region Тройка
for (int c = 0; c < slot.Length; ++c)
{
for (int d = 0; d < slot.Length; ++d)
{
if (slot[c] == slot[d])
{
a++;
}
}
if (a == 3) break;
else a = 0;
}
if (a == 3)
{
Console.WriteLine("Тройка!");
continue;
}
#endregion
#region Две пары
for (int c = 0; c < slot.Length; ++c)
{
for (int d = 0; d < slot.Length; ++d)
{
if (slot[c] == slot[d])
{
a++;
}
}
if (a == 2)
{
for (int e = 0; e < slot.Length; ++e)
{
for (int f = 0; f < slot.Length; ++f)
{
if ((slot[e] != slot[c]) & (slot[e] == slot[f]))
{
b++;
}
}
if (b == 2) break;
else b = 0;
}
}
else a = 0;
break;
}
if (a == 2 & b == 2)
{
Console.WriteLine("Две пары!");
continue;
}
#endregion
#region Пара
for (int c = 0; c < slot.Length; ++c)
{
for (int d = 0; d < slot.Length; ++d)
{
if (slot[c] == slot[d])
{
a++;
}
}
if (a == 2) break;
else a = 0;
}
if (a == 2)
{
Console.WriteLine("Пара!");
continue;
}
#endregion
#region Без выигрыша
Console.WriteLine("Без выигрыша!");
#endregion
} while (Console.ReadKey().Key == ConsoleKey.Enter);
}
Ошибка заключается в том, что когда первое число не равно остальным. А остальные являются двумя парами, например 14488, то показывается комбинация "Пара!", а не "Две пары!". У меня неправильный алгоритм, но к другому я ещё не пришёл. Всю ночь потратил, чтобы даже до этого додуматься.
Немного изменил код. Добавил a = 0 и b = 0, после каждой комбинации. Пока ищу, может быть это была ошибка.
static void Game()
{
Random random = new Random();
int[] slot = new int[5];
do
{
Console.Clear();
for (int i = 0; i < slot.Length; ++i)
{
slot[i] = random.Next(1, 9);
Console.Write("{0} ", slot[i]);
}
Console.WriteLine();
int a = 0;
int b = 0;
// Комбинации
#region Пятёрки и четвёрки
for (int c = 0; c < slot.Length; ++c)
{
for (int d = 0; d < slot.Length; ++d)
{
if (slot[c] == slot[d])
{
a++;
}
}
if (a == 5 | a == 4) break;
else a = 0;
}
if (a == 5)
{
a = 0;
b = 0;
Console.WriteLine("Пятёрка!");
continue;
}
a = 0;
b = 0;
if (a == 4)
{
a = 0;
b = 0;
Console.WriteLine("Четвёрка!");
continue;
}
a = 0;
b = 0;
#endregion
#region Полный дом
for (int c = 0; c < slot.Length; ++c)
{
for (int d = 0; d < slot.Length; ++d)
{
if (slot[c] == slot[d])
{
a++;
}
}
if (a == 3)
{
for (int e = 0; e < slot.Length; ++e)
{
for (int f = 0; f < slot.Length; ++f)
{
if ((slot[e] != slot[c]) & (slot[e] == slot[f]))
{
b++;
}
}
if (b == 2) break;
else b = 0;
}
}
else a = 0;
break;
}
if (a == 3 & b == 2)
{
a = 0;
b = 0;
Console.WriteLine("Полный дом!");
continue;
}
a = 0;
b = 0;
#endregion
#region Тройка
for (int c = 0; c < slot.Length; ++c)
{
for (int d = 0; d < slot.Length; ++d)
{
if (slot[c] == slot[d])
{
a++;
}
}
if (a == 3) break;
else a = 0;
}
if (a == 3)
{
a = 0;
b = 0;
Console.WriteLine("Тройка!");
continue;
}
a = 0;
b = 0;
#endregion
#region Две пары
for (int c = 0; c < slot.Length; ++c)
{
for (int d = 0; d < slot.Length; ++d)
{
if (slot[c] == slot[d])
{
a++;
}
}
if (a == 2)
{
for (int e = 0; e < slot.Length; ++e)
{
for (int f = 0; f < slot.Length; ++f)
{
if ((slot[e] != slot[c]) & (slot[e] == slot[f]))
{
b++;
}
}
if (b == 2) break;
else b = 0;
}
}
else a = 0;
break;
}
if (a == 2 & b == 2)
{
a = 0;
b = 0;
Console.WriteLine("Две пары!");
continue;
}
a = 0;
b = 0;
#endregion
#region Пара
for (int c = 0; c < slot.Length; ++c)
{
for (int d = 0; d < slot.Length; ++d)
{
if (slot[c] == slot[d])
{
a++;
}
}
if (a == 2) break;
else a = 0;
}
if (a == 2)
{
a = 0;
b = 0;
Console.WriteLine("Пара!");
continue;
}
a = 0;
b = 0;
#endregion
#region Без выигрыша
Console.WriteLine("Без выигрыша!");
#endregion
} while (Console.ReadKey().Key == ConsoleKey.Enter);
}
Нет, не то. Всё ещё, если первое число не совпадает с остальными 25588, то показывается, что пара. Не знаю что это. Ладно, я пойду отдыхать.
Я не смогу уснуть, пока не решу Придётся заново алгоритм выдумывать. Просто я хочу сделать без встроенных функций массива на подобие Array.sort(); Потому что я ничему не научусь. А я ведь такую силу почувствовал. Будет обидно, что я написал правильный код, но ошибся с каким-нибудь break или условии
По идее, мой цикл должен проходить и сравнивать все числа в массиве. По другому никак. Но может быть я что-то не понимаю... Дальше идут сравнения на количество одинаковых чисел. Всё хорошо, если пара есть у первого числа и дальше у остальных чисел. Тогда ошибок не возникает. Но, когда первое число бесхозное, то дальше, если есть две пары или полный дом, то показывается либо пара, либо тройка. Не могу сообразить, с чем это связано.
Решение задачи: «Скрытая ошибка в алгоритме»
textual
Листинг программы
var groups = slot.GroupBy(num => num).
Select(group => new {Count = group.Count(), Number = group.Key}).
OrderBy(v => v.Count).ToArray();
if (groups[0].Count >= 2)
{
Console.WriteLine(groups[1].Count == 2
? $"{groups[0].Count} {groups[0].Number}-ек и два {groups[1].Number}-ек"
: $"{groups[0].Count} {groups[0].Number}-ек");
}