Генерация карты - 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; }
}

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


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

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

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