【问题标题】:Two dimensional array expandable in all directions二维阵列可向所有方向扩展
【发布时间】:2013-04-14 09:22:22
【问题描述】:

大家好,

我只是在尝试编写所谓的“生活游戏”。忘记是谁发明的,但我觉得它很有趣。请不要发布任何与游戏编程相关的链接,因为它会破坏我的动力;)

其中最重要的部分是游乐场。我需要一个二维数组,它可以向各个方向扩展。

例如一开始我有一个 10*10 字段的数组。我需要能够同时在 array[-1][-1] 方向和 array[11][11] 方向添加新字段。我什至需要能够将新项目添加到字段数组 [-1] [10] 或数组 [10] [-10]。我需要能够将数组访问到所有可能的 2D 方向。

在写这篇文章的同时,我刚刚有了一个想法:让四个数组指向所有方向 NORTH、EAST、SOUTH 和 WEST 怎么样?只需将所有阵列彼此相邻放置,几乎指向指定方向。就像下面的例子一样。所有的阵列放在一起形成了我的游乐场。它会有效吗,还是有更简单的方法?

[][][] | [][][]
[][][] | [][][]
[][][] | [][][]
_______|_______
[][][] | [][][]
[][][] | [][][]
[][][] | [][][]

谢谢。

【问题讨论】:

  • 你能发一个这个游戏规则的链接吗?我对你的解释感到困惑。
  • 我建议创建一个具有周期性边界条件的网格类,使得x=-1; grid.set(x, y); 等于x = -1 + L; grid.set(x, y);
  • 想象一下游戏需求的变化:我们需要 3 维代替 2 维。你还认为数组是最好的方法吗?

标签: java arrays multidimensional-array game-physics


【解决方案1】:

假设您使用的是原始数组,使用固定数量的单元格展开矩阵可能如下所示:

boolean[][] gameBoard = new boolean[3][3];

public boolean[][] expandMatrixBy(boolean[][] matrix, int number) {
  int oldSize = matrix.length;
  int newSize = oldSize + 2 * number;
  boolean[][] result = new boolean[newSize][newSize];

  // Assume new cells should be dead, i.e. false..
  for (int row = number; row < oldSize + number; row++) {
    for (int col = number; col < oldSize + number; col++) {
      // ..copy only the existing cells into new locations.
      result[row][col] = matrix[row - number][col - number];
    }
  }
  return result;
}

// Calling this on a 3x3 matrix will produce 5x5 matrix, expanded by 1 on each side.
gameBoard = expandMatrixBy(gameBoard, 1);

这是约翰·康威的人生游戏 :-)

选项: 可以自定义此解决方案以在选定的边上进行扩展,如下所示:

enum Side { Left, Right, Top, Bottom };

public boolean[][] expandMatrixBy(boolean[][] matrix, int number, Set<Side> sides) {
  int oldSize = matrix.length;
  int newSize = oldSize + number * sides.size();
  boolean[][] result = new boolean[newSize][newSize];

  for (Side side : sides) {
    switch(side) {
      case Left:
        // Add number of columns on the left.

      case Right:
        // Add "number" of columns on the right.
    }
  }
  return result;
}

Set<Side> expandOnTheseSides = EnumSet.of(Side.Left, Side.Top);
gameBoard = expandMatrixBy(gameBoard, 1, expandOnTheseSides);

祝你好运。

【讨论】:

  • 我不明白你为什么要在 newSize 中将数字乘以 2。虽然我猜这是一个好方法:P 不过,我的游乐场将被限制在两个方面。
  • 当您说“可向所有方向扩展”时,我认为您的意思是同时向所有方向扩展相同数量的列。代码的最后一行将在每一侧添加 1 行/列,这就是为什么你将 number 乘以 2,因为每个轴上有两条边。
  • 啊,我明白了。是的,这正是我要说的。谢谢芽[:
  • 我刚刚添加了一个可选改进,以防您需要部分扩展。 boolean[][] 可能不是一个好选择,但如果您不打算过于频繁地扩张,这将是一件好事。
  • 你好样的。我仍然面临的问题是复制源数组的所有元素。需要大量时间和资源,具体取决于源数组的大小。好吧,那得再做点功课了。感谢您在这里帮助我!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多