Генерация карты - C#

Узнай цену своей работы

Формулировка задачи:

Доброе время суток. Подскажите пожалуйста алгоритмы с помощью которых можно сделать подобного рода карты: Может быть есть готовые C# реализации, буду благодарен даже за названия алгоритмов, так как находил алгоритмы генерации лабиринтов. Но там лабиринты слишком сложные, да и по факту там лабиринт, а мне бы карту...

Решение задачи: «Генерация карты»

textual
Листинг программы
  1. private static readonly Random Randomizer = new Random();
  2.  
  3. private static void Main()
  4. {
  5.     const int N = 12 * 2 + 1, M = 12 * 2 + 1;
  6.     const int MAX_VISITS = 2;
  7.     const int CHANCE_TO_BREAK_WALL = 30;
  8.  
  9.     Cell[,] grid = Init(N, M);
  10.  
  11.     var stack = new Stack<Cell>();
  12.  
  13.     Cell current = grid[1, 1];
  14.     current.IsWall = false;
  15.     current.Visits++;
  16.  
  17.     while (true)
  18.     {
  19.         List<Cell> neighbours = GetNeighbours(grid, current.X, current.Y, MAX_VISITS);
  20.         if (neighbours.Count > 0)
  21.         {
  22.             Cell neighbour = neighbours[Randomizer.Next(neighbours.Count)];
  23.  
  24.             bool breakWall = neighbour.Visits == 0 || Randomizer.Next(100 / CHANCE_TO_BREAK_WALL + 1) == 0;
  25.  
  26.             if (breakWall)
  27.                 neighbour.IsWall = false;
  28.             neighbour.Visits++;
  29.  
  30.             if (breakWall)
  31.             {
  32.                 Cell wall = GetWall(grid, current, neighbour);
  33.                 wall.IsWall = false;
  34.             }
  35.  
  36.             stack.Push(current);
  37.             current = neighbour;
  38.         }
  39.         else if (stack.Count > 0)
  40.             current = stack.Pop();
  41.         else
  42.             break;
  43.     }
  44.  
  45.     Show(grid);
  46. }
  47.  
  48. private static void Show(Cell[,] grid)
  49. {
  50.     for (var i = 0; i < grid.GetLength(0); i++)
  51.     {
  52.         for (var j = 0; j < grid.GetLength(1); j++)
  53.             Console.Write(grid[i, j].IsWall ? "O" : " ");
  54.         Console.WriteLine();
  55.     }
  56. }
  57.  
  58. private static Cell GetWall(Cell[,] grid, Cell a, Cell b)
  59. {
  60.     int x = Math.Min(a.X, b.X) + Math.Abs(a.X - b.X) / 2;
  61.     int y = Math.Min(a.Y, b.Y) + Math.Abs(a.Y - b.Y) / 2;
  62.     return grid[y, x];
  63. }
  64.  
  65. private static List<Cell> GetNeighbours(Cell[,] grid, int x, int y, int maxVisits)
  66. {
  67.     var neighbours = new List<Cell>();
  68.     if (x - 2 >= 0 && grid[y, x - 2].Visits < maxVisits)
  69.         neighbours.Add(grid[y, x - 2]);
  70.     if (y - 2 >= 0 && grid[y - 2, x].Visits < maxVisits)
  71.         neighbours.Add(grid[y - 2, x]);
  72.     if (x + 2 < grid.GetLength(1) && grid[y, x + 2].Visits < maxVisits)
  73.         neighbours.Add(grid[y, x + 2]);
  74.     if (y + 2 < grid.GetLength(0) && grid[y + 2, x].Visits < maxVisits)
  75.         neighbours.Add(grid[y + 2, x]);
  76.     return neighbours;
  77. }
  78.  
  79. private static Cell[,] Init(int n, int m)
  80. {
  81.     var grid = new Cell[n, m];
  82.     for (var i = 0; i < n; i++)
  83.         for (var j = 0; j < m; j++)
  84.             grid[i, j] = new Cell { X = j, Y = i, IsWall = true };
  85.     return grid;
  86. }
  87.  
  88. private class Cell
  89. {
  90.     public int X { get; set; }
  91.     public int Y { get; set; }
  92.     public bool IsWall { get; set; }
  93.     public int Visits { get; set; }
  94. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 4.2 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут