2016-03-03 108 views
1

我正在为游戏开发2D地图编辑器,我需要一种方法来在所有方向上均匀地增加或减小网格/地图的大小。调整2D地图的尺寸​​

假设您有一个3x3的地图,带有一个“十字”符号。

(数组索引从零开始他们从0开始。)

像这样:

0,1,0 
1,1,1 
0,1,0 

数组是这样的:

map = [0,1,0,1,1,1,0,1,0] 

因此,瓷砖指数4将成为地图的中心。

例如,我想将尺寸从3x3增加到5x5。所以我结束了这一点:

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 

新地图数组应该结束了这样的:

map = [0,0,0,0,0,0,0,1,0,0,0,1,1,1,0,0,0,1,0,0,0,0,0,0] 

什么是这样做的好办法吗?

回答

1

这里有两个增加和减少的功能。参数arr是一维地图,xWidth是网格的宽度(当然也是高度)。 我有一个类似的背景here on Stackoverflow非常感谢willywonka_dailyblah谁帮我在j和我的指数。

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循环。因此,在更大的网格尺寸下它们的可缩放性较差。我认为可能有一种解决方案可以将这个转换成循环序列,而不需要嵌套。