无法读取属性';x';未定义的类型(JavaScript)
我目前正在尝试从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
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