我正在制作一个蛇游戏(Linux中的Nibbles),它在一个60 * 60的场地上玩,有四条蛇在争夺随机放置的苹果。
我用A *(A星)算法实现了蛇的运动。
我的问题是:
当我的分数超过其他蛇时,我想避免其他蛇吃苹果。所以,当我离苹果最近的蛇时,我想以一种封闭的矩形方式移动。
你可以在这张图片中看到我的意思:
(我是绿色的,红点是我的头。)
我的程序中有一种方法可以使用A *算法执行此操作:setGoal(x,y);
。
我的问题是,当我发现一个关闭(或近似关闭)的矩形时,我需要跟随我的尾巴直到游戏结束。所以请帮助我使这个矩形路径工作。
答案 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]));
}
我希望你在途中轻推你。