首页 > 解决方案 > C# 从较小的数组生成随机二维数组时遇到问题

问题描述

我正在尝试从许多较小的数组中生成一个随机的二维数组。我计划有一天用它来生成随机游戏地图。

每个较小的阵列称为“岛”。它们中的每一个都是手动预定义的。

            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.....
 ..........
 ..........

标签: c#multidimensional-arrayrandom

解决方案


您的错误在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++) { ... }

看起来像一个典型的复制和粘贴错误......

除此之外,如果您的地图相当拥挤,如果没有针对给定岛屿的解决方案,您就有可能进入无限循环。

计算是否存在一个或多个有效解决方案以及您当前所在的组合是否是其中之一可能会很昂贵且有些棘手,因此,除非您真的必须处理必须给出解决方案的拥挤地图,否则我会在预定数量的放置岛屿的失败尝试;你可能偶尔会得到假阴性,但它可能是你可以忍受的。


推荐阅读