未捕获的TypeError:无法读取未定义的属性“X”(数组)

时间:2018-04-29 13:19:56

标签: javascript arrays

我知道,这可能是有关JavaScipt的最常见错误!但是我已经阅读过,至少有20篇关于StackOverflow上这个错误的文章没有给我提供我需要的信息。所以,提前抱歉任何愚蠢的问题! ;)

我正在使用JavaScript开始一个基本的战舰游戏。现在,我有两个功能:船(生成船)和桌子(生成表格并与用户交互。这些是完整的功能:

表:

function table (){
     const DIM = parseInt(prompt("Insert the size:"));
     var arr = [];
     for (var i = 0; i < DIM; i++){
         arr[i] = [];
         for (var j = 0; j < DIM; j++){
             arr[i][j] = parseInt(0);
         }
     }
     arr = boats(5, 1, DIM, arr); //1 Carrier
     arr = boats(4, 1, DIM, arr); //1 Battleship
     arr = boats(3, 2, DIM, arr); //2 Cruiser
     arr = boats(2, 3, DIM, arr); //3 Destroyer
     arr = boats(1, 4, DIM, arr); //4 Submarines
     console.log(arr);
}

船:

function boats (siz, numb,  DIM, arr){
    console.log(arr);
    var size = siz;
    var nrboats = numb;
    var step = 0;
    while (step < nrboats) {
        var random_column = parseInt(Math.floor((Math.random() * DIM)));
        console.log(random_column);
        var random_line = parseInt(Math.floor((Math.random() * DIM)));
        console.log(random_line);
        var verification = true;
        var orientation = "";
        while (verification && orientation === "") {
            for(var k = 0; k < size; k++) {
                if (arr[random_line][Math.min((random_column) + k, DIM-1)] === 0 && arr[random_line][((random_column) + 1 + k)] === 0 && arr[random_line][((random_column) - 1 + k)] === 0 && arr[((random_line) + 1)][(random_column + k)] === 0 && arr[((random_line) - 1)][(random_column + k)] === 0) {
                     verification = true;
                     orientation = "horizontal";
                 } else if (arr[Math.min((random_line) + k,DIM-1)][random_column] === 0 && arr[((random_line) + k)][((random_column) + 1)] === 0 && arr[((random_line) + k)][((random_column) - 1)] === 0 && arr[((random_line) + 1 + k)][random_column] === 0 && arr[((random_line) - 1 + k)][random_column] === 0) {
                     verification = true;
                     orientation = "vertical";
                 } else {
                     verification = false;
                 }
        }
        if (verification && orientation === "horizontal") {
            for(var i = 0; i < size; i++){
                arr[random_line][random_column+i] = 1;
            }
            step++;
        } else if (verification && orientation === "vertical") {
            for(var j = 0; j < size; j++){
                arr[random_line+j][random_column] = 1;
            }
            step++;
        }
    }
    return arr;
}

这可能是一个简单的问题,但我无法弄清楚发生了什么!任何帮助都会很棒!

谢谢,
mikeysantana

1 个答案:

答案 0 :(得分:0)

random_line等情况下,arr[((random_line) + k)][random_column]变量的值大于数组arr的长度-1,因此您正在执行undefined[random_column]

对于你在那里看到的每个random_line变量,你需要确保它们不超过数组的lastIndex,我做了一行:

...else if (arr[Math.min((random_line) + k,DIM-1)][random_column] === 0 && arr[((random_line) + k)][((random_column) + 1)] === 0 && arr[((random_line) + k)][((random_column) - 1)] === 0 && arr[((random_line) + 1 + k)][random_column] === 0 && arr[((random_line) - 1 + k)][random_column] === 0){.... 

确保它与您的游戏逻辑一致。在某些情况下,战列舰的大小太大而不适合你的网格,特别是当你的随机变量朝向阵列附近但你有一艘大船适合时。