Я использую алгоритм, подобный этому, чтобы сделать мою местность. В основном он генерирует некоторые случайные числа и использует синусоидальную волну для генерации холмов, в сочетании они дают красивый холмистый ландшафт. Обратите внимание, что вы можете добавить цикл и массив значений, если вы хотите более 3-х проходов.
private void GenerateTerrain()
{
terrainContour = new int[Width*Height];
//Make Random Numbers
double rand1 = randomizer.NextDouble() + 1;
double rand2 = randomizer.NextDouble() + 2;
double rand3 = randomizer.NextDouble() + 3;
//Variables, Play with these for unique results!
float peakheight = 20
float flatness = 50
int offset = 30;
//Generate basic terrain sine
for (int x = 0; x < Width; x++)
{
double height = peakheight / rand1 * Math.Sin((float)x / flatness * rand1 + rand1);
height += peakheight / rand2 * Math.Sin((float)x / flatness * rand2 + rand2);
height += peakheight / rand3 * Math.Sin((float)x / flatness * rand3 + rand3);
height += offset;
terrainContour[x] = (int)height;
}
}
Затем, чтобы заполнить карту высот, просто прокрутите значения и проверьте, находится ли он выше порога или нет.
for (int x = 0; x < Width; x++)
{
for (int y = 0; y < Height; y++)
{
if (y > terrainContour[x])
tiles[x, y] = Solid Tile
else
tiles[x, y] = Blank Tile
}
}
Здесь вы можете добавить гораздо больше, я добавил больше случайности и сделал отступ для некоторых плиток на 1 вверх или вниз для улучшения рельефа. А добавление синусоидальных волн сделает его более реалистичным.
Попробуйте использовать алгоритмы 2D Perlin Noise и выберите определенные высоты, чтобы сделать пещеры и более продвинутую местность, так как теперь это то, что я делаю, но этот код здесь - хорошее начало.