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