javascript - 如何在 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)
}
解决方案
推荐阅读
- sql - MariaDB:将查询结果导出到 csv 文件时缺少一些列
- python - 找到一段 DNA 的最长回文子串
- json - 在对象键中用另一个字符替换一个字符
- vue.js - Chart js - Vue-ChartJs - 选项和刻度不适用于 xAxis
- javascript - 单击 Plotly 散点图中的数据点时打开 URL [Python]
- sharepoint - 如何有效地使用数千个项目填充共享点在线列表?
- sql - SQL Server 复杂联接
- javascript - 当我们从一页更改为另一页时,库存率不显示
- uistackview - 改变水平 UIStackview 中的列宽
- php - MYSQL delete 语句删除了太多行