javascript 2D数组迭代返回未定义的函数参数

javascript 2D数组迭代返回未定义的函数参数,javascript,function,arguments,multidimensional-array,Javascript,Function,Arguments,Multidimensional Array,我正在做一个练习来重现康威的生活游戏,我有一个基本的策略,我仍然处于“让它工作”阶段,所以我知道这看起来很有趣 我现在遇到的问题是,我试图迭代二维数组,每次都调用确定细胞存活或死亡的函数。这是为“col”返回“undefined”的最后一块代码 函数在循环外部调用时工作(变量分配给row和col) 但是,当我尝试调用循环中的函数时,会得到未定义的值。我假设这是一个范围问题,但我不确定如何解决它 代码如下: // this is the world that is being calculated

我正在做一个练习来重现康威的生活游戏,我有一个基本的策略,我仍然处于“让它工作”阶段,所以我知道这看起来很有趣

我现在遇到的问题是,我试图迭代二维数组,每次都调用确定细胞存活或死亡的函数。这是为“col”返回“undefined”的最后一块代码

函数在循环外部调用时工作(变量分配给row和col)

但是,当我尝试调用循环中的函数时,会得到未定义的值。我假设这是一个范围问题,但我不确定如何解决它

代码如下:

// this is the world that is being calculated
var world = [
    [0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0],
    [0, 0, 0, 1, 0],
    [0, 1, 0, 1, 0],
    [0, 0, 0, 0, 0]
];

// this is where the new calculated values are stored until they are ready to
// be transferred back to the first array: world
var tempWorld = [
    [0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0]
];




function getNeighbors(row, col) {
  // variables that get the values of the 8 neighboring cells
  var currentCell = world[row][col];
  var upperLeftCorner = world[row - 1][col - 1];
  var above = world[row - 1][col];
  var upperRightCorner = world[row - 1][col + 1];
  var left = world[row][col - 1];
  var right = world[row][col + 1];
  var bottomLeft = world[row + 1][col - 1];
  var bottom = world[row + 1][col];
  var bottomRight = world[row + 1][col + 1];    

    // this variable adds the neighboring cells together
  var totalNumberOfNeighbors = upperLeftCorner + above + upperRightCorner + left + right + bottomLeft + bottom + bottomRight   
  return totalNumberOfNeighbors;
};

// test to confirm that getNeighbors is working
console.log("value of getNeighbors is: " + getNeighbors(row, col));

function deadCellsLiveOrDie (row, col) {
  // Rule to make dead cells living
  if (world[row][col] === 0) {
    if (getNeighbors(row, col) === 3) {
      tempWorld[row][col] = 1;
    }
  }
};

deadCellsLiveOrDie(row, col);
livingCellsLiveOrDie(row, col);

function livingCellsLiveOrDie (row, col) {
  // Rule to determine if living cells die or live
  if (world[row][col] === 1) {
    if ((getNeighbors(row, col) === 2) || (getNeighbors(row, col) === 3)) {
      tempWorld[row][col] = 1;
    } else tempWorld[row][col] = 0 
  }
};

// test to confirm that rules of life work for a cell
console.log("tempWorld row, col is: " + tempWorld[row][col]);


// iterate over the 2-D array
for (row = 0; row < world.length; ++ row)
    {
        var col;
        for (col = 0; col < world[row].length; ++ col) {
        deadCellsLiverOrDie(row, col);
        livingCellsLiveOrDie(row, col);
        }
    }                            
//这就是正在计算的世界
变量世界=[
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 1, 0],
[0, 1, 0, 1, 0],
[0, 0, 0, 0, 0]
];
//这是存储新计算值的地方,直到它们准备就绪
//被转移回第一个阵列:世界
var tempWorld=[
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]
];
函数getNeights(行、列){
//获取8个相邻单元格值的变量
var currentCell=世界[行][col];
var upperLeftCorner=世界[行1][列1];
上述var=世界[第1行][col];
var upperRightCorner=世界[行-1][列+1];
var left=世界[世界其他地区][col-1];
右风险值=世界[世界其他地区][col+1];
var bottomLeft=世界[行+1][列-1];
var bottom=世界[行+1][列];
var bottomRight=世界[行+1][列+1];
//此变量将相邻单元格相加
var TotalNumberOfNeights=左上角+上方+右上角+左+右+左下角+右下角+右下角
返回TotalNumberOfNeights;
};
//测试以确认GetNeights正在工作
log(“GetNeights的值为:”+GetNeights(行,列));
函数deadCellsLiveOrDie(行、列){
//使死细胞存活的规则
如果(世界[行][col]==0){
if(GetNeights(行、列)==3){
临时世界[世界其他地区][col]=1;
}
}
};
死囚区(行、列);
活细胞原基(行、列);
函数livingCellsLiveOrDie(行、列){
//确定活细胞是死亡还是存活的规则
如果(世界[行][col]==1){
if((GetNeights(行,列)==2)| |(GetNeights(行,列)==3)){
临时世界[世界其他地区][col]=1;
}else tempWorld[行][列]=0
}
};
//确认生命规则对细胞有效的测试
log(“tempWorld行,列为:“+tempWorld[row][col]);
//迭代二维数组
对于(行=0;行
您的代码有一些问题:

  • 整个代码引用中的几个调用使用未声明的变量
  • 循环将
    声明为全局(不是“错误”,但不是良好实践)
  • deadCellsLiveOrDie
    的方法调用键入错误
  • getneights
    方法不进行边界检查,因此将超出范围

这里可以找到一个(快速)修复的版本:

现在您的代码没有执行,因为您在那里有一些调用使用了从未初始化过的
变量。另外,最后一个块中的循环将
初始化为全局。此外,您在循环中拼错了
deadCellsLiveOrDie
。此外,您的
getneights
方法没有任何边界检查,即它将尝试访问数组索引
-1
。这就是您要查找的吗?(可以做得更好,但我试着坚持你已经拥有的)你是最好的!我试图接受你的答案,但没有看到你评论旁边的复选框…我将不得不把它作为答案而不是评论来写。我会这么做,然后你可以接受/编辑:完成