Скрытая ошибка в алгоритме - C#

Узнай цену своей работы

Формулировка задачи:

Привет всем. Я тут всю ночь не спал - укреплял свои навыки программирования. Задался сделать программу "Фортуна" называется. Просто игра, в которой выпадают числа и собирается комбинация. Вроде бы всё сделал, но появилась ошибка при проверке, которую я не знаю как исправить. Просто не хватает опыта. Помогите кто может пожалуйста. Ошибка в комбинации двух пар. Вот кодик:
Листинг программы
  1. static void Game()
  2. {
  3. Random random = new Random();
  4. int[] slot = new int[5];
  5. do
  6. {
  7. Console.Clear();
  8. for (int i = 0; i < slot.Length; ++i)
  9. {
  10. slot[i] = random.Next(1, 9);
  11. Console.Write("{0} ", slot[i]);
  12. }
  13. Console.WriteLine();
  14. int a = 0;
  15. int b = 0;
  16. // Комбинации
  17. #region Пятёрки и четвёрки
  18. for (int c = 0; c < slot.Length; ++c)
  19. {
  20. for (int d = 0; d < slot.Length; ++d)
  21. {
  22. if (slot[c] == slot[d])
  23. {
  24. a++;
  25. }
  26. }
  27. if (a == 5 | a == 4) break;
  28. else a = 0;
  29. }
  30. if (a == 5)
  31. {
  32. Console.WriteLine("Пятёрка!");
  33. continue;
  34. }
  35. if (a == 4)
  36. {
  37. Console.WriteLine("Четвёрка!");
  38. continue;
  39. }
  40. #endregion
  41. #region Полный дом
  42. for (int c = 0; c < slot.Length; ++c)
  43. {
  44. for (int d = 0; d < slot.Length; ++d)
  45. {
  46. if (slot[c] == slot[d])
  47. {
  48. a++;
  49. }
  50. }
  51. if (a == 3)
  52. {
  53. for (int e = 0; e < slot.Length; ++e)
  54. {
  55. for (int f = 0; f < slot.Length; ++f)
  56. {
  57. if ((slot[e] != slot[c]) & (slot[e] == slot[f]))
  58. {
  59. b++;
  60. }
  61. }
  62. if (b == 2) break;
  63. else b = 0;
  64. }
  65. }
  66. else a = 0;
  67. break;
  68. }
  69. if (a == 3 & b == 2)
  70. {
  71. Console.WriteLine("Полный дом!");
  72. continue;
  73. }
  74. #endregion
  75. #region Тройка
  76. for (int c = 0; c < slot.Length; ++c)
  77. {
  78. for (int d = 0; d < slot.Length; ++d)
  79. {
  80. if (slot[c] == slot[d])
  81. {
  82. a++;
  83. }
  84. }
  85. if (a == 3) break;
  86. else a = 0;
  87. }
  88. if (a == 3)
  89. {
  90. Console.WriteLine("Тройка!");
  91. continue;
  92. }
  93. #endregion
  94. #region Две пары
  95. for (int c = 0; c < slot.Length; ++c)
  96. {
  97. for (int d = 0; d < slot.Length; ++d)
  98. {
  99. if (slot[c] == slot[d])
  100. {
  101. a++;
  102. }
  103. }
  104. if (a == 2)
  105. {
  106. for (int e = 0; e < slot.Length; ++e)
  107. {
  108. for (int f = 0; f < slot.Length; ++f)
  109. {
  110. if ((slot[e] != slot[c]) & (slot[e] == slot[f]))
  111. {
  112. b++;
  113. }
  114. }
  115. if (b == 2) break;
  116. else b = 0;
  117. }
  118. }
  119. else a = 0;
  120. break;
  121. }
  122. if (a == 2 & b == 2)
  123. {
  124. Console.WriteLine("Две пары!");
  125. continue;
  126. }
  127. #endregion
  128. #region Пара
  129. for (int c = 0; c < slot.Length; ++c)
  130. {
  131. for (int d = 0; d < slot.Length; ++d)
  132. {
  133. if (slot[c] == slot[d])
  134. {
  135. a++;
  136. }
  137. }
  138. if (a == 2) break;
  139. else a = 0;
  140. }
  141. if (a == 2)
  142. {
  143. Console.WriteLine("Пара!");
  144. continue;
  145. }
  146. #endregion
  147. #region Без выигрыша
  148. Console.WriteLine("Без выигрыша!");
  149. #endregion
  150. } while (Console.ReadKey().Key == ConsoleKey.Enter);
  151. }
Ошибка заключается в том, что когда первое число не равно остальным. А остальные являются двумя парами, например 14488, то показывается комбинация "Пара!", а не "Две пары!". У меня неправильный алгоритм, но к другому я ещё не пришёл. Всю ночь потратил, чтобы даже до этого додуматься.
Немного изменил код. Добавил a = 0 и b = 0, после каждой комбинации. Пока ищу, может быть это была ошибка.
Листинг программы
  1. static void Game()
  2. {
  3. Random random = new Random();
  4. int[] slot = new int[5];
  5. do
  6. {
  7. Console.Clear();
  8. for (int i = 0; i < slot.Length; ++i)
  9. {
  10. slot[i] = random.Next(1, 9);
  11. Console.Write("{0} ", slot[i]);
  12. }
  13. Console.WriteLine();
  14. int a = 0;
  15. int b = 0;
  16. // Комбинации
  17. #region Пятёрки и четвёрки
  18. for (int c = 0; c < slot.Length; ++c)
  19. {
  20. for (int d = 0; d < slot.Length; ++d)
  21. {
  22. if (slot[c] == slot[d])
  23. {
  24. a++;
  25. }
  26. }
  27. if (a == 5 | a == 4) break;
  28. else a = 0;
  29. }
  30. if (a == 5)
  31. {
  32. a = 0;
  33. b = 0;
  34. Console.WriteLine("Пятёрка!");
  35. continue;
  36. }
  37. a = 0;
  38. b = 0;
  39. if (a == 4)
  40. {
  41. a = 0;
  42. b = 0;
  43. Console.WriteLine("Четвёрка!");
  44. continue;
  45. }
  46. a = 0;
  47. b = 0;
  48. #endregion
  49. #region Полный дом
  50. for (int c = 0; c < slot.Length; ++c)
  51. {
  52. for (int d = 0; d < slot.Length; ++d)
  53. {
  54. if (slot[c] == slot[d])
  55. {
  56. a++;
  57. }
  58. }
  59. if (a == 3)
  60. {
  61. for (int e = 0; e < slot.Length; ++e)
  62. {
  63. for (int f = 0; f < slot.Length; ++f)
  64. {
  65. if ((slot[e] != slot[c]) & (slot[e] == slot[f]))
  66. {
  67. b++;
  68. }
  69. }
  70. if (b == 2) break;
  71. else b = 0;
  72. }
  73. }
  74. else a = 0;
  75. break;
  76. }
  77. if (a == 3 & b == 2)
  78. {
  79. a = 0;
  80. b = 0;
  81. Console.WriteLine("Полный дом!");
  82. continue;
  83. }
  84. a = 0;
  85. b = 0;
  86. #endregion
  87. #region Тройка
  88. for (int c = 0; c < slot.Length; ++c)
  89. {
  90. for (int d = 0; d < slot.Length; ++d)
  91. {
  92. if (slot[c] == slot[d])
  93. {
  94. a++;
  95. }
  96. }
  97. if (a == 3) break;
  98. else a = 0;
  99. }
  100. if (a == 3)
  101. {
  102. a = 0;
  103. b = 0;
  104. Console.WriteLine("Тройка!");
  105. continue;
  106. }
  107. a = 0;
  108. b = 0;
  109. #endregion
  110. #region Две пары
  111. for (int c = 0; c < slot.Length; ++c)
  112. {
  113. for (int d = 0; d < slot.Length; ++d)
  114. {
  115. if (slot[c] == slot[d])
  116. {
  117. a++;
  118. }
  119. }
  120. if (a == 2)
  121. {
  122. for (int e = 0; e < slot.Length; ++e)
  123. {
  124. for (int f = 0; f < slot.Length; ++f)
  125. {
  126. if ((slot[e] != slot[c]) & (slot[e] == slot[f]))
  127. {
  128. b++;
  129. }
  130. }
  131. if (b == 2) break;
  132. else b = 0;
  133. }
  134. }
  135. else a = 0;
  136. break;
  137. }
  138. if (a == 2 & b == 2)
  139. {
  140. a = 0;
  141. b = 0;
  142. Console.WriteLine("Две пары!");
  143. continue;
  144. }
  145. a = 0;
  146. b = 0;
  147. #endregion
  148. #region Пара
  149. for (int c = 0; c < slot.Length; ++c)
  150. {
  151. for (int d = 0; d < slot.Length; ++d)
  152. {
  153. if (slot[c] == slot[d])
  154. {
  155. a++;
  156. }
  157. }
  158. if (a == 2) break;
  159. else a = 0;
  160. }
  161. if (a == 2)
  162. {
  163. a = 0;
  164. b = 0;
  165. Console.WriteLine("Пара!");
  166. continue;
  167. }
  168. a = 0;
  169. b = 0;
  170. #endregion
  171. #region Без выигрыша
  172. Console.WriteLine("Без выигрыша!");
  173. #endregion
  174. } while (Console.ReadKey().Key == ConsoleKey.Enter);
  175. }
Нет, не то. Всё ещё, если первое число не совпадает с остальными 25588, то показывается, что пара. Не знаю что это. Ладно, я пойду отдыхать.
Я не смогу уснуть, пока не решу Придётся заново алгоритм выдумывать. Просто я хочу сделать без встроенных функций массива на подобие Array.sort(); Потому что я ничему не научусь. А я ведь такую силу почувствовал. Будет обидно, что я написал правильный код, но ошибся с каким-нибудь break или условии
По идее, мой цикл должен проходить и сравнивать все числа в массиве. По другому никак. Но может быть я что-то не понимаю... Дальше идут сравнения на количество одинаковых чисел. Всё хорошо, если пара есть у первого числа и дальше у остальных чисел. Тогда ошибок не возникает. Но, когда первое число бесхозное, то дальше, если есть две пары или полный дом, то показывается либо пара, либо тройка. Не могу сообразить, с чем это связано.

Решение задачи: «Скрытая ошибка в алгоритме»

textual
Листинг программы
  1. var groups = slot.GroupBy(num => num).
  2.                 Select(group => new {Count = group.Count(), Number = group.Key}).
  3.                 OrderBy(v => v.Count).ToArray();
  4.             if (groups[0].Count >= 2)
  5.             {
  6.                 Console.WriteLine(groups[1].Count == 2
  7.                         ? $"{groups[0].Count} {groups[0].Number}-ек и два {groups[1].Number}-ек"
  8.                         : $"{groups[0].Count}  {groups[0].Number}-ек");
  9.             }

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


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

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

11   голосов , оценка 3.727 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы