Uncaught TypeError при создании случайной позиции для еды в игре HTML5 змея - PullRequest
0 голосов
/ 08 марта 2012

В настоящее время я работаю над созданием многопользовательской игры Snake в HTML5 Canvas с использованием Javascript.

Код ниже является функцией, которая обрабатывает случайное размещение пищи для змеи.Проблема с фрагментом кода состоит в том, что он дает мне x и y в while (map [x] [y]);обратно, как что-то, что он не может прочитать, хотя он генерирует случайное число.

Это точная ошибка:

    "Uncaught TypeError: Cannot read property '20' of undefined"

'20' - это случайное сгенерированное число (и оно будет позицией решетки пищи в двумерном массиве), и оно изменяется каждый разЯ перезапускаю программу или обновляю веб-страницу.Может кто-нибудь объяснить, что мне нужно изменить, чтобы определить х и у и разместить мою еду?

                   function rand_food(){
                        var x, y;

                        do {
                            x = MR() * this.rect_w|0;
                            y = MR() * this.rect_h|0;
                        } 
                        while (map[x][y]);       <-- Here is the error                                              
                            map[x][y] = 1;

                            this.ctx.strokeRect(x * 10+1, y * 10+1, 8, 8);                                      
                    }

Вот еще один фрагмент кода, который определяет карту.

                this.map = [];
                    // Map positions
                    //*
                    for (i = 0; i < this.rect_w; i++){
                        map[i] = [];
                }//*/

После попытки предположить Шона мой код теперь выглядит так: Но он все еще дает мне ту же ошибку.Любое другое предложение?

function SnakeGame(){                       
                    this.map = [];

                    for (i = 0; i < this.rect_w; i++){
                        this.map[i] = [];                           
                    }


                    function rand_food(){
                        var x, y;
                        console.log("Map length: " + this.map.length);
                        do {
                            x = MR() * this.rect_w|0;
                            y = MR() * this.rect_h|0;
                            console.log("x: " + x);
                            console.log("y: " + y);
                        } 
                        while (this.map[x][y]);                                                     
                            this.map[x][y] = 1;

                            this.ctx.strokeRect(x * 10+1, y * 10+1, 8, 8);  

                    }

Ответы [ 2 ]

0 голосов
/ 08 марта 2012

Если карта не была определена, вы обычно получаете ReferenceError, поэтому карта определяется, но, вероятно,:

  • никому не назначен
  • определено / назначено после использования
  • поднят, будучи определенным в состоянии, которое не выполняется

Пример

if (0) {
    var foo = 1;
}
console.log(foo) //= undefined
console.log(foo[20]) // TypeError…
console.log(bar) // ReferenceError…
0 голосов
/ 08 марта 2012

this.map и map - это не одно и то же.

Если вы находитесь внутри объекта, тогда this.map является публичной переменной объекта, а map является локальной переменной.

Попробуйте что-то вроде этого:

this.map = [];
// Map positions
for (var i = 0; i < 10; i++){
    this.map[i] = [];
}

и в функции rand_food также используйте this.map.

Вот два возможных пути:

//using public variable
function SnakeGame() {
    this.map = [];
    // Map positions
    for (var i = 0; i < 10; i++){
        this.map[i] = [];
    }

    function rand_food() {
        // refer to this.map here
        this.map[0];
    }
};

// using local variable
function SnakeGame() {
    var map = [];
    // Map positions
    for (var i = 0; i < 10; i++){
        map[i] = [];
    }

    function rand_food() {
        // refer to map here
        map[0];
    }
};
...