太空入侵者 - 外星人运动算法的奇怪运动

时间:2014-09-18 11:55:54

标签: java algorithm

我已经在太空入侵者的克隆上工作了一段时间。我到目前为止面临的最大问题是让外星人移动。经过大量的努力,我开发了n算法来移动它们。该算法表现得如预期的那样,除了当外星人完成向左/向右移动然后向下移动时,左或右边的外星人开始会聚在他们旁边的两个上,与他们的精灵重叠。监测他们的X坐标,我发现他们每次向下移动时都向左/向右移动10个像素。我无法弄清楚他们为什么这样做,我希望你能帮助我。这是我的移动算法(外星人排列成2行10,这个方法每10帧调用一次。movestate指示外星人移动的方向。):

public void alienMove()
    {
        boolean movedown = false;
        if(movestate)
        {
            for(int i = 0;i<aliens.length;i++)
            {
                if(aliens[i].getX()==950)
                {
                    movestate = false;
                    movedown = true;
                }
                else
                {
                    aliens[i].setX(aliens[i].getX()+10);
                }
            }
            if(movedown)
            {
                for(int j = 0;j<aliens.length;j++)
                {
                    aliens[j].setY(aliens[j].getY()+20);
                }
                movedown = false;
            }
        }
        else
        {
            for(int i = 0;i<aliens.length;i++)
            {
                if(aliens[i].getX()==50)
                {
                    movestate = true;
                    movedown = true;
                }
                else
                {
                    aliens[i].setX(aliens[i].getX()-10);
                }
            }
            if(movedown)
            {
                for(int j = 0;j<aliens.length;j++)
                {
                    aliens[j].setY(aliens[j].getY()+20);
                }
                movedown = false;
            }
        }
    }

4 个答案:

答案 0 :(得分:1)

假设外星人即将到达右边缘。前9个(从左到右阅读)没有X = 950,所以向右移动10个像素。然后最右边确实有X = 950,所以向右移动;相反,它会触发方向改变和降档。

同样,在左边缘,第一个外星人不会移动,但会触发(后来)降档和方向反转,然后其他九个外星人向左移动10个像素。

你需要以同样的方式对待所有的外星人。也可以移动边缘外星人,或者在到达边缘时不移动任何外星人。

答案 1 :(得分:0)

在尝试调试此代码之前,我建议您改进并简化它。首先,如果你看一下你的代码,有许多部分完全相似,可以很容易地分解。

另外,如果enum Direction使用某些方法move(Point p),您可能会感觉更舒服,代码会更清晰。另外,我得到aliens[i].getX() == 50实际上总是false除了最左边的外星人,所以这个测试应该不在循环中。

这也可能是您的代码无效的原因,因为您的第一个循环将外星人从aliens[0]移动到aliens[aliens.length - 1]。只有最后一个外星人可以验证aliens[i].getX() == 950所以当达到这个条件时, aliens[0]aliens[aliens.length - 2]的所有外星人都会被移到右边和底部,而{{ 1}}只会移到底部

答案 2 :(得分:0)

通常在太空侵略者中,外星人会像块一样移动。因此,当他们向左移动时,你不会想要测试所有这些都已达到坐标50.就在最左边的那个。所以也许:

if(aliens[i].getX()==50)

应该是:

if(aliens[0].getX()==50)

等。相应地:

if(aliens[aliens.length - 1].getX()==950)

什么时候他们走对了?

答案 3 :(得分:0)

这是一个错误,最后一个没有移动,但是在它向左/右方向移动之前都是;

if(aliens[i].getX()==950)
{
   movestate = false;
   movedown = true;
}
else
{
   aliens[i].setX(aliens[i].getX()+10);
}

此检查if(aliens[i].getX()==950)应该在增量之后。 在最后一次迭代中,您已将所有外星人移动到左/右,但最后一个检测到边缘及其位置未移动,因此应恢复上次迭代的所有移动效果。