как двигаться замкнутым прямоугольным образом вокруг яблока в Snake Game

Я работаю над игрой со змеями (Nibbles в Linux), в которую играют на поле 60 * 60, где четыре змеи соревнуются за случайно расположенное яблоко.

Я реализовал движение своей змеи с помощью алгоритма A* (A star).

Моя проблема заключается в следующем:

Когда мой счет больше, чем у других змей, я хочу, чтобы другие змеи не ели яблоки. Итак, когда я буду ближайшей змеей к яблоку, я хочу двигаться по замкнутому прямоугольному пути.

Вы можете увидеть, что я имею в виду на этом изображении:

введите здесь описание изображения

(Я зеленый, а красная точка — моя голова.)

В моей программе есть способ сделать это с помощью алгоритма A*: setGoal(x,y);.

Моя проблема в том, что когда я нахожу замкнутый (или приблизительно замкнутый) прямоугольник, мне нужно идти за своим хвостом до конца игры. Поэтому, пожалуйста, помогите мне заставить этот прямоугольный путь работать.


person M0εiπ    schedule 06.04.2012    source источник


Ответы (1)


Есть ли способ, которым вы можете легко отслеживать положение своего хвоста? Если вы можете, вы можете просто установить цель своей головы, чтобы она равнялась положению вашего хвоста. Если вы не можете легко отметить положение своего хвоста, это будет более сложно.

Если вы знаете длину змеи (я предполагаю, что знаете, потому что змея может следовать по прямоугольному пути ровно snakeLength размера) и она прямоугольная, то вы сможете войти в состояние, которое продолжает цикл до endOfGame == правда например.

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]));
    }

Я надеюсь, что это подтолкнет вас на вашем пути.

person Sam P    schedule 26.04.2012