2011-12-12 33 views
2

Demo“蛇”。数学曲线问题

我想在html 5画布中制作一个“蛇”游戏。但是我有一个问题让蛇能够朝着正确的方向前进。我会假设下面的代码会使蛇在0和180度上水平移动,在90和270度上垂直移动,但这并非如此。我在这里做错了什么? (使用左右箭头导航)。

function move(direction) { 
    if(direction == left) { 
     angel = (angel - 5) % 360; 
     if(angel < 0) angel += 360; 
    } else if (direction == right) { 
     angel = (angel + 5) % 360; 
    } 
    x = x + Math.floor(Math.cos(angel*0.0174532925)*5); 
    y = y + Math.floor(Math.sin(angel*0.0174532925)*5); 

    $("#infoBar").html("Direction: " + direction + " angel: " + angel); 

    drawPoint(x,y); 
} 

乘法器当然是度数的辐射。但不知何故,270度不是一条垂直的直线,因为我认为它是。我究竟做错了什么?

Javascript file.

Html file.

+0

似乎过于复杂,如果你只关心向上/向下或向左/向右移动它不需要计算角度。我注意到的另一件事是角度变量正在改变,因为它正在被重新分配给它自己。这是意图吗? – danca

+0

我只打算使用左/右箭头,因为它自己前进。是的,这个x,y应该会改变,因为它是蛇的新头。 – randoms

+0

是的。你能做这样的事情: 开关(方向) 案件遗留:x--;打破; case right:x ++;打破; 上一个案例:y--;打破; case down:y ++;打破; – danca

回答

6

由于浮点运算的。

COS(270度)= 0

Buuuut:

Math.cos((Math.PI/180)*270)0。它是:-1.836909530733566e-16

换句话说它是-0.000000000000000183等等非常接近零,但略小于零!

但是,您正在使用Math.floorMath.floor该数字(或Math.floor(-0.1)就此而言)= -1。

你不想那样。

使用Math.round而不是Math.floor

这里是固定的,你的是一个活生生的例子:http://jsfiddle.net/UtPJz/3/

+0

啊,谢谢你好先生:) – randoms

1

我还没有编译的代码段,但你可以做服用点是这样的:

function move(direction) { 
    switch(direction) 
    { 
     case RIGHT: 
      stepX = 1; 
      stepY = 0; 
      break; 
     case LEFT: 
      stepX = -1; 
      stepY = 0; 
      break; 
     case UP: 
      stepX = 0; 
      stepY = -1; 
      break; 
     case DOWN: 
      stepX = 0; 
      stepY = 1; 
      break; 
    } 

    x += stepX; 
    y += stepY; 
    drawPoint(x,y); 
}