当 "looking around" 这个二维数组时如何适当地避免 RangeErrors?

How to suitably avoid RangeErrors when "looking around" this 2D array?

我有一个二维数组结构来表示作为我正在制作的游戏的一部分的瓷砖网格。游戏的一个方面是基于对文本文件的分析,以某种随机方式填充网格。不过,从一开始,我就已经意识到,只是让它像这样随机完成,而不坚持某种有效性检查或预防机制,以阻止配置非常糟糕的网格形成,是行不通的。我想避免的主要问题是太多的图块靠近在一起时将无法穿越,可能会将网格的大块与其余部分分开。 为了避免一些非常糟糕的网格,我提出的想法是在生成过程中使用这样的逻辑

检查何时为每个 "grid square" 分配一个平铺值
if (tileBeingInserted.isTraversable()) {
  //all is well
  return true;
} else {
  //we may have a problem, are there too many untraversables nearby?
  //Proceed to check all squares "around" the current one.
}

明确地说,检查当前正方形周围意味着检查在 8 个主要方向中的每一个方向上紧邻的正方形。现在,我的问题是我正在尝试推断出如何对此进行编码,以便它肯定不会在任何时候给出 RangeError 或者至少捕获它并在必须时恢复。例如,您可以清楚地将其中一个角方块视为最糟糕的情况,因为算法想要检查的方块中只有 2 个在数组的边界内。自然地,如果 RangeError 由于这个原因发生,我只是希望程序能够毫无问题地向前推进,所以结构

try {
  //check1
  //check2...8
} catch (RangeError e) {

}

是不可接受的,因为一旦测试了单个超出范围的方块,代码就会脱离检查块。我想到了一个替代方案,但由于它的混乱而不喜欢,将每张支票单独包装在一个 try-catch 中,是的,我想这会起作用,但这是一些看起来很可怕的代码......所以任何人都可以在这里帮助我?对于避免我没有看到的 RangeErrors 这个问题,是否有不同的角度?

所以我测试是否应该放置另一个不可穿越的图块的代码是这样的:

bool _tileFitsWell(int tileTypeInt, int row, int col)
{
    //...initialise some things, set stuff up
    ...

    if (tile.traversable == true) {
      //In this case a new traversable tile is being put in, so no problems.
      return true;
    } else {
      //begin testing what tiles are around the current tile
      //Test NW adjacent
      if (row > 0 && col > 0) {
        temp = tileAt(row - 1, col - 1);
        if (!temp.traversable) {
           strikeCount++;
        }
      }
      //Test N adjacent
      if (row > 0) {
        temp = tileAt(row - 1, col - 1);
        if (!temp.traversable) {
          strikeCount++;
        }
      }
      //Test NE adjacent
      if (row > 0 && col < _grid[0].length - 2) {
        temp = tileAt(row - 1, col  1);
        if (!temp.traversable) {
          strikeCount++;
        }
      }
      //Test W adjacent
      if (col > 0) {
        temp = tileAt(row, col - 1);
        if (!temp.traversable) {
          strikeCount++;
        }
      }
    }
    return strikeCount < 2;
  }

为了简单起见,每个 "initial" if 语句(检查 rowcol 的语句)中的代码有点像伪代码。正如我在之前的评论中解释的那样,我不需要检查其他 4 个主要方向的图块的原因是因为这些检查是在填充地图时完成的,这些位置的图块将始终未初始化或超出范围,具体取决于调用函数在给定时间检查的图块。