首页 > 解决方案 > 如何在 JavaScript 中将二维数组中的相邻单元格随机组合在一起?

问题描述

我正在用 JavaScript 制作KenKen生成器。为此,我需要创建一个带有“笼子”的拉丁方格,稍后将在其中包含操作数。我一直在遵循Tom Davis 的论文中的一些指导,他描述了如何创建笼子(9.4,第 21 页):

首先,[我的算法] 生成一个随机的拉丁方格。然后它通过随机挑选相邻的方块并将它们组合成具有一些限制的笼子来生成笼子。

我已经有了生成随机拉丁方格的代码,但我似乎对如何组合相邻单元格感到困惑。正如你在下面看到的,我自己尝试了一些东西,但是我写的越多,我感觉越不确定,代码变得越乱越难以维护。

我的问题是,我如何有效地做到这一点?

/**
 * Create the cages for operations to go in
 */
createCages(){
  var cages = []; // list of all cages

  // keep track of what cells are in what cages 
  // (the contents of this will be changed later, we just clone the grid so it has the same structure)
  var cagesByCell = this.clone(this.grid); 

  // every cell starts out as its own cage
  for (let y = 0; y < this.size; y++){
    for (let x = 0; x < this.size; x++){
      let newCage = [[y,x]];
      cages.push(newCage);
      cagesByCell[y][x] = newCage;
    }
  }

  // 
  let cells = this.getCellPositions();
  for (let i = 0; i < this.size; i++){
    // get random cell
    let cell = cells[i];
    let y = cell[0];
    let x = cell[1];

    // pick a random adjacent neighor to that cell
    let other;
    while (other == undefined){
      let neighor = Math.floor(Math.random()*4)
      switch (neighor){
        case 0: if (y > 0)           {other = [y-1, x]} break; // NORTH
        case 1: if (x < this.size-1) {other = [y, x+1]} break; // EAST
        case 2: if (y < this.size-1) {other = [y+1, x]} break; // SOUTH
        case 3: if (x > 0)           {other = [y, x-1]} break; // WEST
      }
    }
    let y1 = other[0];
    let x1 = other[1];

    // merge their cages
    let cageNum = cages.indexOf(cagesByCell[y][x]);
    let cageNum1 = cages.indexOf(cagesByCell[y1][x1]);
    let cage = cages[cageNum];
    let cage1 = cages[cageNum1];
    for (let i = 0; i < cage1.length; i++){
      cage.push(cage1[i])
    }

    cages.splice(cageNum1, 1);
  }
  console.log(cages)
}

标签: javascriptmultidimensional-array

解决方案


推荐阅读