Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/406.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/4/oop/2.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
无法读取属性';x';未定义的类型(JavaScript)_Javascript_Oop_Canvas - Fatal编程技术网

无法读取属性';x';未定义的类型(JavaScript)

无法读取属性';x';未定义的类型(JavaScript),javascript,oop,canvas,Javascript,Oop,Canvas,我目前正在尝试从JavaScript和画布中的一个脚本构建一个蛇游戏。目前我在这一行收到一个错误:grid.set(FOOD,randPos.x,randPos.y)它是底部设置食物功能的一部分。我不明白.x是从哪里来的,因为我没有看到在该范围内定义了x或Y。如果有人能给我指出正确的方向,我会非常感激,这样我就能完成我的第一场比赛!!!谢谢 <script> //CONSTANTS var COLS=26; var ROWS=26; //ID's

我目前正在尝试从JavaScript和画布中的一个脚本构建一个蛇游戏。目前我在这一行收到一个错误:
grid.set(FOOD,randPos.x,randPos.y)它是底部设置食物功能的一部分。我不明白
.x
是从哪里来的,因为我没有看到在该范围内定义了x或Y。如果有人能给我指出正确的方向,我会非常感激,这样我就能完成我的第一场比赛!!!谢谢

<script>
    //CONSTANTS
    var COLS=26;
    var ROWS=26;

    //ID's
    var EMPTY=0;
    var SNAKE=1;
    var FOOD=2;

    //Direction
    var LEFT=0;
    var UP=1;
    var RIGHT=2;
    var DOWN=3;

    var grid = {
        width: null, 
        height: null,
        _grid: null,

        init: function(d,c,r){
            this.width = c;
            this.height = r;

            this._grid = [];
            for(var x=0; x<c; x++){
                this._grid.push([]);
                for(var y=0; y < r; y++){
                    this._grid[x].push(d);
                }
            }
        },

        set: function(val,x,y){
            this._grid[x][y] = val;
        },

        get: function(x,y){
            this._grid[x][y];
        }
    }

    var snake = {
        direction: null,
        last: null,
        _queue: null,

        init: function(d,x,y){
            this.direction = d;
            this._queue = [];
            this.insert(x,y);
        },

        insert: function(x,y){
            this._queue.unshift({x:x, y:y});
            this.last = this._queue[0];
        },

        remove: function(){
            return this._queue.pop();
        }
    }

    function setFood(){
        var empty = [];
        for(var x=0; x<grid.width; x++){
            for(var y=0; y<grid.height; y++){
                if(grid.get(x,y)===EMPTY){
                    empty.push({x:x, y:y});
                }
            }
        }
        var randPos = empty[Math.floor(Math.random()*empty.length)];
        console.log("working");
        grid.set(FOOD, randPos.x, randPos.y);
        console.log("working???")
    }

    //Game objects
    var canvas, ctx, keystate, frames;

    function main(){
        canvas = document.createElement('canvas');
        canvas.width = COLS*20;
        canvas.height = ROWS*20;
        ctx = canvas.getContext('2D');
        document.body.appendChild(canvas);

        frames = 0;
        keystate = {};

        init();
        loop();
    }

    function init(){
        grid.init(EMPTY, COLS, ROWS);

        var sp = {x:Math.floor(COLS/2), y:ROWS-1};
        snake.init(UP, sp.x, sp.y);
        grid.set(SNAKE, sp.x, sp.y);

        setFood();
    }

    function loop(){
        update();
        draw();

        window.requestAnimationFrame(loop, canvas);
    }

    function update(){
        frames++;
    }

    function draw(){
        var tw = canvas.width/grid.width;
        var th = canvas.height/grid.height;

        for(var x=0; x<grid.width; x++){
            for(var y=0; y<grid.height; y++){
                switch(grid.get(x,y)){
                    case EMPTY:
                        ctx.fillStyle = "#fff";
                        break;
                    case SNAKE:
                        ctx.fillStyle = "#0ff";
                        break;
                    case FOOD:
                        ctx.fillStyle = "#f00";
                        break;
                }
                ctx.fillRect(x*tw, y*th, tw, th);
            }
        }
    }

    main();
</script>

//常数
var-COLS=26;
var行=26;
//身份证
var空=0;
var=1;
var=2;
//方向
左向量=0;
var-UP=1;
var-RIGHT=2;
var-DOWN=3;
变量网格={
宽度:空,
高度:空,
_网格:空,
init:函数(d,c,r){
这个宽度=c;
这个高度=r;
这个。_网格=[];

对于(var x=0;x请查看
setFood
函数。在获取错误的行上方的几行中,有一个循环将
空的
集合填充为同时包含
x
y
字段的对象。其中一个对象被分配给
randPos
变量

该错误可能是由于将值赋给
randPos
变量无效造成的。该变量未定义,因此不包含必需的
x
字段

更新

似乎您刚刚错过了
网格中的
return
关键字。get(x,y)
函数,因此它应该如下所示:

get: function(x,y){
        return this._grid[x][y];
    }

请验证添加它是否解决了您的问题。

请查看
setFood
函数。在出现错误的行上方的几行,有一个循环将
empty
集合填充为同时包含
x
y
字段的对象。其中一个对象被分配给
randPos
变数

该错误可能是由于将值赋给
randPos
变量无效造成的。该变量未定义,因此不包含必需的
x
字段

更新

似乎您刚刚错过了
网格中的
return
关键字。get(x,y)
函数,因此它应该如下所示:

get: function(x,y){
        return this._grid[x][y];
    }

请验证添加它是否解决了您的问题。

请查看
setFood
函数。在出现错误的行上方的几行,有一个循环将
empty
集合填充为同时包含
x
y
字段的对象。其中一个对象被分配给
randPos
变数

该错误可能是由于将值赋给
randPos
变量无效造成的。该变量未定义,因此不包含必需的
x
字段

更新

似乎您刚刚错过了
网格中的
return
关键字。get(x,y)
函数,因此它应该如下所示:

get: function(x,y){
        return this._grid[x][y];
    }

请验证添加它是否解决了您的问题。

请查看
setFood
函数。在出现错误的行上方的几行,有一个循环将
empty
集合填充为同时包含
x
y
字段的对象。其中一个对象被分配给
randPos
变数

该错误可能是由于将值赋给
randPos
变量无效造成的。该变量未定义,因此不包含必需的
x
字段

更新

似乎您刚刚错过了
网格中的
return
关键字。get(x,y)
函数,因此它应该如下所示:

get: function(x,y){
        return this._grid[x][y];
    }

请验证添加它是否解决了您的问题。

让我帮助您调试:

grid.set(FOOD,randPos.x,randPos.y);
给您一个错误,告诉您试图从未定义的内容获取x属性

好的,
randPos
是未定义的

randPos
来自
empty[Math.floor(Math.random()*empty.length)];

empty
是在嵌套for循环中创建的数组:
empty.push({x:x,y:y});
。您看到
x
来自哪里了吗

正如Lukasz指出的,只有一种特殊情况下,像这样的数组解引用是未定义的

var a = [];
console.log(a[0]);
?

原因是
为空?没有网格单元
==空

 get: function(x,y){
     this._grid[x][y];
 }

由于缺少
返回

让我帮助您调试:

grid.set(FOOD,randPos.x,randPos.y);
给您一个错误,告诉您试图从未定义的内容获取x属性

好的,
randPos
是未定义的

randPos
来自
empty[Math.floor(Math.random()*empty.length)];

empty
是在嵌套for循环中创建的数组:
empty.push({x:x,y:y});
。您看到
x
来自哪里了吗

正如Lukasz指出的,只有一种特殊情况下,像这样的数组解引用是未定义的

var a = [];
console.log(a[0]);
?

原因是
为空?没有网格单元
==空

 get: function(x,y){
     this._grid[x][y];
 }

由于缺少
返回

让我帮助您调试:

grid.set(FOOD,randPos.x,randPos.y);
给您一个错误,告诉您试图从未定义的内容获取x属性

好的,
randPos
是未定义的

randPos
来自
empty[Math.floor(Math.random()*empty.length)];

empty
是在嵌套for循环中创建的数组:
empty.push({x:x,y:y});
。您看到
x
来自哪里了吗

正如Lukasz指出的,只有一种特殊情况下,像这样的数组解引用是u