如何在蛇游戏中围绕苹果以一个封闭的矩形方式移动

时间:2012-04-06 14:47:53

标签: algorithm path grid path-finding

我正在制作一个蛇游戏(Linux中的Nibbles),它在一个60 * 60的场地上玩,有四条蛇在争夺随机放置的苹果。

我用A *(A星)算法实现了蛇的运动。

我的问题是:

当我的分数超过其他蛇时,我想避免其他蛇吃苹果。所以,当我离苹果最近的蛇时,我想以一种封闭的矩形方式移动。

你可以在这张图片中看到我的意思:

enter image description here

(我是绿色的,红点是我的头。)

我的程序中有一种方法可以使用A *算法执行此操作:setGoal(x,y);

我的问题是,当我发现一个关闭(或近似关闭)的矩形时,我需要跟随我的尾巴直到游戏结束。所以请帮助我使这个矩形路径工作。

1 个答案:

答案 0 :(得分:1)

有没有办法可以轻松地按照尾巴的位置?如果可以的话,你可以设定你的头部目标等于尾巴的位置。如果你不能轻易地标记尾巴的位置,那么它会更复杂。

如果你知道蛇有多长(我假设你这么做,因为蛇可以沿着一条正好snakeLength尺寸的矩形路径而且它是矩形的),那么你应该能够进入一个状态例如,继续循环直到endOfGame == true。

divSnakeLength = snakeLength / 4; (giving you the length of each side of the rectangle)
distanceToApple = divSnakeLength / 2;
applePosition = this.getApplePosition();
Position[] rectangleEdges = new int[2][2];

rectangleEdges[0] = {applePosition.x - distanceToApple, 
                        applePosition.y + distanceToApple};

rectangleEdges[1] = {applePosition.x + distanceToApple,
                        applePosition.y + distanceToApple};

rectangleEdges[2] = {applePosition.x + distanceToApple,
                        applePosition.y - distanceToApple};

rectangleEdges[3] = {applePosition.x - distanceToApple,
                        applePosition.y - distanceToApple};

//now we have the four corners of the rectangle

while(!endOfGame){
    foundGoal = false;
    setGoal(rectangleEdges[0]);
        while(!foundGoal(rectangleEdges[0]));
    setGoal(rectangleEdges[1]);
        while(!foundGoal(rectangleEdges[1]));
    setGoal(rectangleEdges[2]);
        while(!foundGoal(rectangleEdges[2]));
    setGoal(rectangleEdges[3]);
        while(!foundGoal(rectangleEdges[3]));
    }

我希望你在途中轻推你。