Скрытая ошибка в алгоритме - 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}-ек");
            }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 3.727 из 5
Похожие ответы