调整2D地图的大小

时间:2016-03-03 17:50:57

标签: arrays matrix grid 2d

我正在为游戏开发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

这样做的好方法是什么?

1 个答案:

答案 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循环。因此,它们在更大的网格尺寸上的可扩展性较差。我认为可能有一个解决方案可以将它包装成一个循环序列,它在没有嵌套的情况下运行。