MSDN.WhiteKnight - Stack Overflow answers
Ответ на "C# генерация случайного пути"
Answer 883003
Если нет никаких ограничений на то, в какой мере путь может пересекать или накладываться на себя, случайный путь - это просто набор случайных точек. Напишем код для заполнения линии между двумя точками:
public class Map { int[,] cells; public Map(int size) { cells = new int[size, size]; } //заполнение прямой между двумя точками заданным числом public void FillLine(int x1, int y1, int x2, int y2, int value) { int x = x1, y = y1; int dx = Math.Sign(x2 - x1); //приращение по X int dy = Math.Sign(y2 - y1); //приращение по Y bool direction_y = false; while (true) { cells[x, y] = value; if (x == x2 && y == y2) break; //достигнута конечная точка //сделаем по очереди приращение по X или Y if (direction_y) { if (y != y2) y += dy; } else { if (x != x2) x += dx; } direction_y = !direction_y; } } public override string ToString() { StringBuilder sb = new StringBuilder(500); for (int y = 0; y < cells.GetLength(0); y++) { for (int x = 0; x < cells.GetLength(0); x++) { sb.AppendFormat("{0} ",cells[x,y].ToString().PadLeft(2)); } sb.AppendLine(); } return sb.ToString(); } }
Тогда заполнение случайного пути будет выглядеть так:
const int SIZE = 30; const int N = 4; Map m = new Map(SIZE); Random rnd = new Random(); int x0=0,y0=0,x, y; int value = 1; //проходим через N случайных точек for (int i = 0; i < N; i++) { x = rnd.Next(SIZE-1); y = rnd.Next(SIZE-1); m.FillLine(x0, y0, x, y,value); x0 = x; y0 = y; } //заходим в конец x = SIZE - 1; y = SIZE - 1; m.FillLine(x0, y0, x, y, value);
Content is retrieved from StackExchange API.
Auto-generated by ruso-archive tools.