Javascript 当我将数组值设置为0以外的任何值时,它返回“0”;未捕获类型错误:无法设置属性“0”;1-15“';“未定义”的定义;

Javascript 当我将数组值设置为0以外的任何值时,它返回“0”;未捕获类型错误:无法设置属性“0”;1-15“';“未定义”的定义;,javascript,arrays,html5-canvas,Javascript,Arrays,Html5 Canvas,我目前正在尝试制作一个地图生成器,但在我随机设置块为land的部分中,如果我将它们设置为0或“”以外的任何值,它将返回 未捕获的TypeError:无法设置未定义的属性“1-15” (它不返回“1-15”,只是在运行时返回一个介于1和数组长度(15)之间的数字) //让一块土地周围的每个街区都有三分之一的机会获得更多的土地 for(设y=0;y

我目前正在尝试制作一个地图生成器,但在我随机设置块为land的部分中,如果我将它们设置为0或“”以外的任何值,它将返回

未捕获的TypeError:无法设置未定义的属性“1-15”

(它不返回“1-15”,只是在运行时返回一个介于1和数组长度(15)之间的数字)

//让一块土地周围的每个街区都有三分之一的机会获得更多的土地
for(设y=0;y对于(让i=-1;i让我们简化一下这个问题。您看到的实际错误是因为您正在访问
代理[a][B]
,其中
代理[a]
未定义,因此您得到
无法设置未定义的属性B

请考虑一下
a
可以得到哪些可能的值。
a
在代码中是
y+i
。您将
y
0
循环到
proxy.length-1
,并将
i
-1
循环到
1

因此,
y+i
的可能范围将是
-1
proxy.length
。这在两个方向上都比应该的多1项!(您会同意
proxy[-1]
可能未定义,与
proxy.length]
相同)

当然,
x+j
也是如此,但这不会引发错误,因为它只会在
proxy[something][1]
处写入新属性,例如,这可能不是有意的,但却是有效的JavaScript

因此,您必须更改循环或约束值。由于这是固定大小贴图上的贴图生成器,我想约束结果更符合逻辑。因此,您可以执行以下操作:

if(
y+i>=0&&
y+i=0&&
x+j<代理[y+i]。长度
) {
代理[y+i][x+j]=“o”
}
……或者:

if((y+i)在代理中&(x+j)在代理[y+i]中){
代理[y+i][x+j]=“o”
}
//lets every block surrounding a land peice have a 1 in 3 chance of making more land
for(let y = 0; y < proxy.length; y++){
    for(let x = 0; x < proxy[y].length; x++){
        if(proxy[y][x] != 0){

            for(let i = -1; i <= 1; i++){
                for(let j = -1; j <= 1; j++){

                    let run = Math.floor(Math.random() * 3)

                    if(run == 0){
                        proxy[y + i][x + j] = "o"
                    }

                }
            }   

        }
    }
}