Алгоритм случайного роста не работает должным образомC#

Место общения программистов C#
Anonymous
Алгоритм случайного роста не работает должным образом

Сообщение Anonymous »

Для игры, над которой я работаю, я начинаю с массива целых чисел 8x8 со всеми нулевыми значениями. Затем я случайным образом помещаю одно ненулевое значение в каждую строку/столбец таким образом, чтобы в каждой строке было только одно ненулевое значение и одно ненулевое значение в каждом столбце. Вот так:

Код: Выделить всё

0 1 0 0 0 0 0 0
0 0 0 0 2 0 0 0
0 0 0 0 0 0 3 0
4 0 0 0 0 0 0 0
0 0 5 0 0 0 0 0
0 0 0 0 0 0 0 6
0 0 0 0 0 7 0 0
0 0 0 8 0 0 0 0
Эта часть работает отлично. Я получаю другую сетку каждый раз, когда создаю ее. Но затем я пытаюсь случайным образом расширить каждое число до нулей, чтобы получить 8 регионов, каждый из которых заполнен одним из чисел. Вот пример того, что я получил:

Код: Выделить всё

4 1 1 5 2 2 2 3
4 1 1 5 2 2 3 3
4 1 5 5 2 2 3 3
4 4 5 5 5 2 3 6
4 4 5 5 5 2 2 6
4 4 5 5 5 2 2 6
4 4 5 8 5 7 2 6
4 4 4 8 8 7 2 6
Обратите внимание, что хотя цифра 1 может простираться вниз, а цифра 8 — вверх, цифра 6, которая находится в самом дальнем столбце справа, никогда не выходит за пределы этого столбца. А цифра 4, которая находится в первом столбце слева, никогда не допускает в этот столбец никаких других чисел. Вот функция, которую я использую для расширения. Я сохраняю счетчик количества нулей и выполняю цикл этой функции до тех пор, пока они все не исчезнут:
В этом случае размер равен 8, а массив цветов изменяется от 0 до 9 в каждом измерении, хотя я использую только от 1 до 8. Я сделал это для того, чтобы мне не приходилось использовать условные выражения при просмотре ячейки рядом с той, которую я проверяю.

Код: Выделить всё

private void ExpandColors()
{
//1 is up, 2 is right, 3 is down, 4 is left
int cell = rand.Next(1, size * size);

string coord = CellToCoords(cell);
string[] c = coord.Split('ÿ');
int row = Convert.ToInt16(c[0]);
int col = Convert.ToInt16(c[1]);

if (color[row, col] > 0)
{
switch (rand.Next(1, 4))
{
case 1:
if (row == 1) return; //can't look up
if (color[row - 1, col] == 0)
{
color[row - 1, col] = color[row, col];
uncolored--;
return;
}
break;
case 2:
if (col == size) return; //can't look right
if (color[row, col + 1] == 0)
{
color[row, col + 1] = color[row, col];
uncolored--;
return;
}
break;
case 3:
if (row == size) return; //can't look down
if (color[row + 1, col] == 0)
{
color[row + 1, col] = color[row, col];
uncolored--;
return;
}
break;
case 4:
if (col == 1) return; //can't look left
if (color[row, col - 1] == 0)
{
color[row, col - 1] = color[row, col];
uncolored--;
return;
}
break;
}
}
}

private string CellToCoords(int cell)
{
int col = cell % size;
if (col == 0) col = size;
int row = (cell - col) / size + 1;
return row.ToString() + "ÿ" + col.ToString();
// so 2, 5 would be 2ÿ5 and can easily be split
}
Я дважды проверил, что CellToCoords работает правильно. И, похоже, в ExtendColors нет никакой функциональной разницы, которая могла бы иметь какое-либо значение между горизонтальным и вертикальным. И все же у меня по-прежнему нет проблем с нормальным расширением значений в верхней и нижней строках, и у меня все еще есть проблемы с нормальным расширением значений в крайнем левом и крайнем правом столбце. Я запускал его десятки раз, и каждый раз наблюдалось одно и то же аномальное поведение в крайнем левом и крайнем правом столбце.
Я упускаю что-то очевидное?

Вернуться в «C#»