2

演示

我正在尝试在 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 文件。

html 文件。

4

2 回答 2

6

因为浮点数学。

cos(270 度) = 0

布欧特:

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

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

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

你不想要那个。

使用Math.round而不是Math.floor.

这是为您修复的一个活生生的例子:http: //jsfiddle.net/UtPJz/3/

于 2011-12-12T18:06:04.847 回答
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);
}
于 2011-12-12T18:10:32.337 回答