Скрытая ошибка в алгоритме - 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}-ек");
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д