Это не прорыв , это застревание в бесконечном цикле.
Если я правильно читаю, похоже, вы пытаетесь создать доску судоку для игры на ней. Проблема в том, что это не так просто, как вы думаете. Насколько я вижу, вы просто проходите через это, заполняя его случайными неиспользуемыми значениями; проблема в том, что не каждая такая конфигурация будет действительной - большую часть времени ваши случайные записи в конечном итоге приведут вас к неразрешимой конфигурации платы.
Затем, когда вы попытаетесь выбрать случайное значение для некоторого квадрата, внутренняя функция GetRandom
будет просто бесконечно зацикливаться, пытаясь выбрать число (так как getUsed
уже будет иметь все 1 - 9
, do..while
никогда не выйдет)
Простой способ убедиться в этом: добавьте это вверху вашей GetRandom
функции:
if (Enumerable.Range(1, 9).All(i => numbers.Contains(i)))
Console.WriteLine("PROBLEM!");
Теперь, если у numbers
есть все от 1 до 9, это скажет вам. (А затем продолжайте застрять в бесконечном цикле, но теперь это ваша проблема;))
Кроме того, просто, как sidenote, не следует продолжать делать new Random()
объекты, подобные этому; лучше просто иметь один экземпляр Random
, инициализировать его в конструкторе и затем продолжать использовать Random.Next
. По крайней мере, Random r = new Random()
вверху функции, а затем просто r.Next
внутри цикла.
Хорошо, вот очень простой пример попадания в неразрешимую позицию, только в первых двух строках:
123|456|789
456|123|X
Не осталось действительного числа, чтобы поставить его в положение, помеченное X
- посмотрите, как это произошло?
Заполнение сетки случайными неиспользуемыми числами - это не то же самое, что заполнение ее «ответами» - подумайте об этом, если вы взяли обычную игру судоку и попытались решить , просто поставив любое случайное число это удовлетворяло правилам в каждом пустом квадрате - вы застряли бы довольно скоро, верно? Это именно то, что происходит с вашей программой.
Я бы посоветовал вам сначала написать судоку решатель , который берет действительную начальную конфигурацию платы и пытается ее решить - затем вы можете перейти к попытке сделать доски самостоятельно.