Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/430.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/90.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在HTML5蛇游戏中为食物生成随机位置时出现未捕获类型错误_Javascript_Html_Canvas_Scope_While Loop - Fatal编程技术网

Javascript 在HTML5蛇游戏中为食物生成随机位置时出现未捕获类型错误

Javascript 在HTML5蛇游戏中为食物生成随机位置时出现未捕获类型错误,javascript,html,canvas,scope,while-loop,Javascript,Html,Canvas,Scope,While Loop,我目前正在用Javascript在HTML5画布上制作一个多人蛇游戏 下面的代码是处理蛇食物随机放置的函数。这段代码的问题是,它在映射[x][y]时给了我x和y;即使它产生了一个随机数,他也无法阅读 这就是确切的错误: "Uncaught TypeError: Cannot read property '20' of undefined" “20”是随机生成的数字,是二维数组中食物的网格位置,每次我重新启动程序或刷新网页时都会发生变化。有人能解释一下我需要什么样的改变来定义x和y并放置

我目前正在用Javascript在HTML5画布上制作一个多人蛇游戏

下面的代码是处理蛇食物随机放置的函数。这段代码的问题是,它在映射[x][y]时给了我x和y;即使它产生了一个随机数,他也无法阅读

这就是确切的错误:

    "Uncaught TypeError: Cannot read property '20' of undefined"
“20”是随机生成的数字,是二维数组中食物的网格位置,每次我重新启动程序或刷新网页时都会发生变化。有人能解释一下我需要什么样的改变来定义x和y并放置我的食物吗

                   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);  

                    }
地图和地图不是一回事

如果您位于对象内部,则this.map是该对象的公共变量,map是局部变量

试着这样做:

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

如果未定义映射,通常会出现引用错误,因此映射已定义,但可能:

没有分配给任何东西 使用后定义/分配 通过在不执行的条件下定义的Being提升 范例

if (0) {
    var foo = 1;
}
console.log(foo) //= undefined
console.log(foo[20]) // TypeError…
console.log(bar) // ReferenceError…

另请参见,以了解稍微不同的方法MR函数this.rect和this.ctx如何?这些都应该在包含对象中声明,您现在似乎已经制作了SnakeGame。这是一篇关于javascript中OO的介绍性文章,可能有助于澄清问题。MR函数是一个局部变量,rect_w和rect_h是公共变量,ctx也是公共变量。我用这个把他们都公开了。但到目前为止,一切都不起作用。谢谢你的文章,我刚读过,但这并没有给我的问题带来多大帮助。我现在将继续为这个问题伤脑筋。再次感谢您的时间。是否可以链接到您拥有的公开版本,以便我们可以在上下文中查看代码?好的,很抱歉我的回复太晚,但我昨天没有时间再查看它了。还有其他事情要做。你可以在这里下载这个项目。打开.rar,查看Snake2.html和snake.JS的JS文件夹。这些是我正在处理的文件。谢谢你抽出时间。
if (0) {
    var foo = 1;
}
console.log(foo) //= undefined
console.log(foo[20]) // TypeError…
console.log(bar) // ReferenceError…