C # Проблемы с генерацией случайного 2d массива из меньших массивов - PullRequest
0 голосов
/ 05 декабря 2018

Я пытаюсь создать случайный двумерный массив из нескольких меньших массивов.Я планирую использовать его однажды для создания случайной игровой карты.

Каждый меньший массив называется "Остров".Каждый из них предопределен вручную.

            char[,] Island1 = new char[,]
            {
                {'A', 'A', 'A'},
                {'A','B','A'},
                {'A','A','A'}    
            };

            char[,] Island2 = new char[,]
            {
                {'C', 'C'},
                {'C','C'}    
            };   

            char[,] Island3 = new char[,]
            {
                {'D', 'D', 'D'},
                {'D','D','D'},
                {'D','D','D'}    
            };   

Я пытаюсь создать массив большего размера, со всеми меньшими внутри, расположенными случайным образом.

Важно то, что меньшие массивы не должныперекрывают друг друга.

    public static Boolean CanPlaceIsland(int StartX, int StartY, Island thisIsland)
    {
        Boolean Answer = true;

        for (int i = StartX; i<StartX+thisIsland.CellArray.GetLength(0);i++)
        {
            for (int j = StartX; j<StartY+thisIsland.CellArray.GetLength(1);j++)
            {
                    if (WorldMap[i,j].Terrain!='.')
                        Answer = false;
            }
        }

        return Answer;
    }

Я пытаюсь пройти по каждому острову один за другим и добавить новый, только если он не перекрывает непустые квадраты.

Вот обновленный метод заполнения карты островами (предыдущая версия могла вызвать бесконечный цикл).

    public static void CreateEmptyMap()
    {
        WorldMap = new Cell[WorldX, WorldY];

        for (int i=0; i<WorldX; i++)
            for (int j=0; j<WorldY; j++)
                WorldMap[i,j] = new Cell('.');                    
    }


    public static void FillMap()
    {
        int IslandsPlaced=0;

        foreach(Island thisIsland in IslandsList)
        {
                Boolean check = false;

                int x = 0;
                int y = 0;

                    Random w = rnd;

                    int SideA = thisIsland.CellArray.GetLength(0);
                    int SideB = thisIsland.CellArray.GetLength(1);

                    int WorldSideA = WorldMap.GetLength(0);
                    int WorldSideB = WorldMap.GetLength(1);                        

                    x = w.Next(2, WorldSideA-SideA-1);
                    y = w.Next(2,WorldSideB-SideB-1);

                    check = CanPlaceIsland(x,y,thisIsland);                           

                if (check==true)
                {
                    PlaceIsland(x,y,thisIsland);                              
                    IslandsPlaced++;
                }    
        }   

        if (IslandsPlaced!=IslandsList.Count())
        {
            CreateEmptyMap();
            FillMap();
        }
    }

Расположение:

    public static void PlaceIsland(int x, int y, Island thisIsland)
    {
        int SideA = thisIsland.CellArray.GetLength(0);
        int SideB = thisIsland.CellArray.GetLength(1);

            for (int i=0; i<SideA;i++)
            {
               for (int j=0; j<SideB;j++) 
               {
                   WorldMap[x+i,y+j] = thisIsland.CellArray[i,j];
               }
            }  
    }

Однако иногда острова все еще перекрываютсяи я не могу найти почему.

 ..........
 ..........
 ..........
 ..........
 ....AAA...
 ..DDDBA...
 ..DDDAA...
 ..DDD.....
 ..........
 ..........

1 Ответ

0 голосов
/ 06 декабря 2018

Ваша ошибка в CanPlaceIsland:

for (int j = StartX; //error here! 
     j < StartY + thisIsland.CellArray.GetLength(1); 
     j++) { ... }

Должно быть:

for (int j = StartY; 
     j < StartY + thisIsland.CellArray.GetLength(1); 
     j++) { ... }

Похоже на типичную ошибку копирования и вставки ...

ОтдельноИсходя из этого, если ваши карты довольно многолюдны, вы рискуете войти в бесконечный цикл, если для данного острова нет решения.

Вычисление, если существует одно или несколько допустимых решений и если комбинация, в которой вы находитесь в данный момент, равна единице.из них могут быть дорогими и несколько хитрыми, поэтому, если вы действительно не будете иметь дело с переполненными картами, где должно быть найдено решение, я бы выпал после заранее определенного числа неудачных попыток разместить остров;время от времени вы можете получать ложные негативы, но, вероятно, это то, с чем вы можете жить.

...