Генерация карты - C#
Формулировка задачи:
Доброе время суток. Подскажите пожалуйста алгоритмы с помощью которых можно сделать подобного рода карты:
Может быть есть готовые C# реализации, буду благодарен даже за названия алгоритмов, так как находил алгоритмы генерации лабиринтов. Но там лабиринты слишком сложные, да и по факту там лабиринт, а мне бы карту...
Решение задачи: «Генерация карты»
textual
Листинг программы
private static readonly Random Randomizer = new Random(); private static void Main() { const int N = 12 * 2 + 1, M = 12 * 2 + 1; const int MAX_VISITS = 2; const int CHANCE_TO_BREAK_WALL = 30; Cell[,] grid = Init(N, M); var stack = new Stack<Cell>(); Cell current = grid[1, 1]; current.IsWall = false; current.Visits++; while (true) { List<Cell> neighbours = GetNeighbours(grid, current.X, current.Y, MAX_VISITS); if (neighbours.Count > 0) { Cell neighbour = neighbours[Randomizer.Next(neighbours.Count)]; bool breakWall = neighbour.Visits == 0 || Randomizer.Next(100 / CHANCE_TO_BREAK_WALL + 1) == 0; if (breakWall) neighbour.IsWall = false; neighbour.Visits++; if (breakWall) { Cell wall = GetWall(grid, current, neighbour); wall.IsWall = false; } stack.Push(current); current = neighbour; } else if (stack.Count > 0) current = stack.Pop(); else break; } Show(grid); } private static void Show(Cell[,] grid) { for (var i = 0; i < grid.GetLength(0); i++) { for (var j = 0; j < grid.GetLength(1); j++) Console.Write(grid[i, j].IsWall ? "O" : " "); Console.WriteLine(); } } private static Cell GetWall(Cell[,] grid, Cell a, Cell b) { int x = Math.Min(a.X, b.X) + Math.Abs(a.X - b.X) / 2; int y = Math.Min(a.Y, b.Y) + Math.Abs(a.Y - b.Y) / 2; return grid[y, x]; } private static List<Cell> GetNeighbours(Cell[,] grid, int x, int y, int maxVisits) { var neighbours = new List<Cell>(); if (x - 2 >= 0 && grid[y, x - 2].Visits < maxVisits) neighbours.Add(grid[y, x - 2]); if (y - 2 >= 0 && grid[y - 2, x].Visits < maxVisits) neighbours.Add(grid[y - 2, x]); if (x + 2 < grid.GetLength(1) && grid[y, x + 2].Visits < maxVisits) neighbours.Add(grid[y, x + 2]); if (y + 2 < grid.GetLength(0) && grid[y + 2, x].Visits < maxVisits) neighbours.Add(grid[y + 2, x]); return neighbours; } private static Cell[,] Init(int n, int m) { var grid = new Cell[n, m]; for (var i = 0; i < n; i++) for (var j = 0; j < m; j++) grid[i, j] = new Cell { X = j, Y = i, IsWall = true }; return grid; } private class Cell { public int X { get; set; } public int Y { get; set; } public bool IsWall { get; set; } public int Visits { get; set; } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д