Я пытаюсь создать игру для судоку, для тех, кто не знает, что это такое. У вас есть поле 9x9, которое должно быть заполнено цифрами от 1 до 9, каждое число должно быть уникальным в его строке и столбце, а также в поле 3x3 оно найдено. Я закончил работу с множеством циклов в двухмерном массиве.Вложенные петли неожиданно вспыхивают
Но в какой-то момент он просто останавливается, без каких-либо исключений, просто вырывается, и ничего не происходит, и это не всегда в одном положении, но всегда идет на полпути.
Я ожидал исключения переполнения стека, по крайней мере.
Вот мой код:
public class Engine
{
public int[,] Create()
{
int[,] outer = new int[9, 9];
for (int i = 0; i < 9; i++)
{
for (int j = 0; j < 9; j++)
{
outer[i, j] = GetRandom(GetUsed(outer, i, j));
}
}
return outer;
}
List<int> GetUsed(int[,] arr, int x, int y)
{
List<int> usedNums = new List<int>();
for (int i = 0; i < 9; i++)
{
if (arr[x, i] != 0 && i != y)
{
if(!usedNums.Contains(arr[x, i]))
usedNums.Add(arr[x, i]);
}
}
for (int i = 0; i < 9; i++)
{
if (arr[i, y] != 0 && i != x)
{
if (!usedNums.Contains(arr[i, y]))
usedNums.Add(arr[i, y]);
}
}
int x2 = 9 - (x + 1);
int y2 = 9 - (y + 1);
if (x2 <= 3)
x2 = 2;
else if (x2 > 3 && x2 <= 6)
x2 = 5;
else x2 = 8;
if (y2 <= 3)
y2 = 2;
else if (y2 > 3 && y2 <= 6)
y2 = 5;
else y2 = 8;
for (int i = x2 - 2; i < x2; i++)
{
for (int j = y2 - 2; j < y2; j++)
{
if (arr[i, j] != 0 && i != x && j != y)
{
if (!usedNums.Contains(arr[i, j]))
usedNums.Add(arr[i, j]);
}
}
}
return usedNums;
}
int GetRandom(List<int> numbers)
{
Random r;
int newNum;
do
{
r = new Random();
newNum = r.Next(1, 10);
} while (numbers.Contains(newNum));
return newNum;
}
}
Вы пробовали пройтись и посмотреть, где он остановился? Кроме того, о какой функции мы говорим? Там есть полдюжины петель. – tzaman
Я перехожу через первый цикл в первом методе «Create()» Это никогда не бывает так, иногда в 4,7 или 5,3, всегда в другом положении, это кажется очень случайным. –
Очень ... * случайный * вы говорите? (Я не удержался) – Phil