我正在为游戏开发2D地图编辑器,我需要一种方法来在所有方向上均匀地增加或减少网格/地图的大小。
假设您有一个带有“十字”符号的3x3地图。
(数组是零索引的。它们从0开始)
像这样:
Textview
数组看起来像这样:
0,1,0
1,1,1
0,1,0
因此,tile index 4将成为地图的中心。
我想将大小从3x3增加到5x5。所以我最终得到了这个:
map = [0,1,0,1,1,1,0,1,0]
新的地图数组应该像这样结束:
0,0,0,0,0
0,0,1,0,0
0,1,1,1,0
0,0,1,0,0
0,0,0,0,0
这样做的好方法是什么?
答案 0 :(得分:1)
这是增加和减少的两个功能。参数arr是您的一维地图,xWidth是网格的宽度(当然还有高度)。 我有一个类似背景的问题here on Stackoverflow非常感谢willywonka_dailyblah帮我查看了j和i索引。
public int[] increase_grid(int[] arr, int xWidth)
{
int newWidth = (xWidth+2);
int[] result = new int[newWidth * newWidth];
int count=0;
while(count<newWidth)
{
result[count++] = 0;
}
for (int i=0;i<xWidth;i++)
{
result[count++] = 0;
for (int j=0;j<xWidth;j++)
{
result[count++] = arr[i * xWidth + j];
}
result[count++] = 0;
}
while(count<(newWidth*newWidth))
{
result[count++] = 0;
}
return result;
}
public int[] decrease_grid(int[] arr, int xWidth)
{
int newWidth = (xWidth-2);
int[] result = new int[newWidth*newWidth];
for(int i=0; i< newWidth;i++)
{
for (int j=0;j< newWidth;j++)
{
result[i* newWidth + j] = arr[(i+1) * xWidth + (j+1)];
}
}
return result;
}
我有这个打印功能:
public void print_arr(int[] a, int xWidth)
{
for(int i=0;i<xWidth;i++)
{
for(int j=0;j<xWidth;j++)
{
System.out.print(a[i * xWidth + j]+" ");
}
System.out.println();
}
System.out.println();
}
您可以将这些功能称为:
int[] map = new int[]{0,1,0,1,1,1,0,1,0};
print_arr(map, 3);
map = increase_grid(map, 3);
print_arr(map, 5);
map = increase_grid(map, 5);
print_arr(map, 7);
map = decrease_grid(map, 7);
print_arr(map, 5);
因此,您必须传递地图的当前大小,并调用增加或减少。请注意,这些函数包括嵌套的for循环。因此,它们在更大的网格尺寸上的可扩展性较差。我认为可能有一个解决方案可以将它包装成一个循环序列,它在没有嵌套的情况下运行。