代码之家  ›  专栏  ›  技术社区  ›  Joji

JavaScript:是否有一种优雅的方法来生成二维数组中相邻单元格的坐标

  •  0
  • Joji  · 技术社区  · 3 年前

    假设我有一个网格,即二维数组

    const grid = [
      [0, 0, A, 0, 0],
      [0, 0, 0, 0, 0],
      [0, 0, 0, B, 0],
      [D, E, 0, C, F],
      [0, 0, 0, 0, 0],
    ]
    

    如果网格中的某个单元格可以访问所有相邻单元格 4-二级 例如, C 是在 [3, 3] 这样它就可以访问 [3, 3 + 1] , [3 - 1, 3] , [3 +1, 3]``[3, 3 - 1] ,所以通常我必须像这样硬编码

    
    // 👇 hard-coded directions
    const dirs = [
        [1, 0],
        [-1, 0],
        [0, 1],
        [0, -1],
      ]
    
    const possibleMoves = []
    for (const [dx, dy] of dirs) {
       possibleMoves.push([dx + x, dy +y])
    }
    

    那么,如果它可以8个方向移动,那么你就必须硬编码更多的方向

     const dirs = [[1, 0], [-1, 0] , [0,1], [0,-1], [1,1], [-1,1], [-1,-1], [1,-1]]
    

    是否有更聪明的方法来生成 dirs 下一步行动的数组?

    0 回复  |  直到 3 年前
        1
  •  0
  •   Tom    3 年前

    对!

    第一:任何时候你在做网格逻辑,从检查什么开始 Amit Patel 不得不说。

    老实说,这个链接有你需要的一切。

    简短的版本是:如果你知道网格宽度和单元格布局,你就可以很容易地计算出任何单元格邻居的坐标偏移,以定义任何“邻居”

    该逻辑可以实现为一个纯函数,它需要网格尺寸和你想要的邻居的单元格(也称为“目标”单元格)的坐标:

    let myNeighbors = getCellNeighbors(
      { x: 2, y: 2 }, // coords of target cell
      { width: 10, height: 10 } // grid dimensions, in cells
    )
    

    或者,您可以创建一个有状态的东西,在创建时获取网格维度并计算一次偏移量,以重新用于所有getNeighbors调用:

    let myGrid = new Grid(10, 10)
    let myNeighbors = myGrid.getNeighbors(2, 5)
    
    let myBiggerGrid = new Grid(25, 25)
    let otherNeighbors = myBiggerGrid(2, 5)