2016-03-03 104 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循環。因此,在更大的網格尺寸下它們的可縮放性較差。我認爲可能有一種解決方案可以將這個轉換成循環序列,而不需要嵌套。