c# - 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.....
..........
..........
解决方案
您的错误在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++) { ... }
看起来像一个典型的复制和粘贴错误......
除此之外,如果您的地图相当拥挤,如果没有针对给定岛屿的解决方案,您就有可能进入无限循环。
计算是否存在一个或多个有效解决方案以及您当前所在的组合是否是其中之一可能会很昂贵且有些棘手,因此,除非您真的必须处理必须给出解决方案的拥挤地图,否则我会在预定数量的放置岛屿的失败尝试;你可能偶尔会得到假阴性,但它可能是你可以忍受的。
推荐阅读
- javascript - Firebase Firestore / JS - 根据用户组管理读/写访问
- apache - Laravel:用于重定向到 https 的 .htaccess 规则不起作用
- kubernetes - 如何配置大使能够映射到容器上的多个端口
- swift - 删除 UITableViewRow 时出错,单击的行索引不在可能的索引范围内
- ajax - 无法在生产环境中访问请求数据,但可以在本地环境中访问
- business-process-management - 激活快照以启动 BPM 8.6 流程
- c++ - 成员函数如何理解对象是通过取消引用 const 指针获得的?
- fullcalendar - FullCalendar 可以在离线环境中使用吗
- python - Python JVM 烧瓶
- mysql - 是否可以将表链接到使用外键链接回第一个表的表?