我有一个矩阵作为竞技场,一个小矩阵作为播放器。使用密钥用户可以四处移动。 move(pos)
接受论证和内部检查
if(pos=="down")
if (!collide(pos)) player.pos.y++;
碰撞就像
一样if(pos=="down")
for (i = 0; i < player.matrix.length; i++)
{
for (j = 0; j < player.matrix[i].length; j++)
{
if ((player.matrix[i][j] && arena[player.pos.y + i + 1][player.pos.x + j]) != 0) result = true;
}
}
这个炒锅非常完美,直到你走到竞技场边缘。当你来到边缘时,因为没有lenght + 1 索引,如果检测得到Cannot read property of "" undefined
。我试过首先检查typeof索引是否超出界限== undefined然而即使这给了我同样的错误。然后我尝试尝试捕获,但 catch 中的下一个函数卡在第一个和它自己之间。有什么想法可以找到一个简单的退出债券的解决方案吗?
答案 0 :(得分:2)
我的建议只是通过长度比较保护arena[player.pos.y + i + 1][player.pos.x + j]
来电:
for (i = 0; i < player.matrix.length; i++)
{
for (j = 0; j < player.matrix[i].length; j++)
{ // here we have an additional protection of arena dimensions
if(player.pos.y + i + 1 < arena.length && player.pos.x + j < arena[player.pos.y + i + 1].length)
{
if ((player.matrix[i][j] && arena[player.pos.y + i + 1][player.pos.x + j]) != 0)
result = true;
}
}
}
您也可以在arena
对象上实现其他方法:
arena.isValid = function(a, b) {
// check for dimensions
if(a >= arena.length || b >= arena[a].length) {
return false;
}
// check if the value is undefined/null/0/false/""
if(!arena[a][b]) {
return false;
}
return true;
};
所以
for (i = 0; i < player.matrix.length; i++)
for (j = 0; j < player.matrix[i].length; j++)
if(player.matrix[i][j] && arena.isValid(player.pos.y + i + 1, player.pos.x + j))
result = true;