mercredi 5 décembre 2018

C# Have problems generating random 2d array from smaller arrays

I am trying to generate a random 2D array, from a number of smaller arrays. I plan to use it some day to generate a random game map.

Each smaller array is called "Island". Each of them is manually predefined.

            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'}    
            };   

I am trying to generate a larger array, with all smaller ones inside, placed randomly.

What's important, is that smaller arrays shouldn't overlap each other.

    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;
    }

I am trying to go through each island, one by one, and only add new one, if it doesn't overlap non-empty squares.

    public static void FillMap()
    {
        foreach(Island thisIsland in IslandsList)
        {
                Boolean check = false;

                int x = 0;
                int y = 0;

                while(check!=true)
                {
                    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);
                }

                    PlaceIsland(x,y,thisIsland);
        }   
    }  

The placing:

    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];
               }
            }  
    }

However, sometimes islands still overlap, and I can't find why.

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




Aucun commentaire:

Enregistrer un commentaire