Бот следит за сеткой в ​​обратном порядке - PullRequest
0 голосов
/ 19 сентября 2010

Я должен написать программу только на Си.Это код для последователя сетки.

Я определил систему координат сетки (0-5,0-5).Также определяются ориентации ботов (+ y, -y, + x, -x) и позиции.(Я хотел бы получить советы о том, как написать хороший код для этого.)

Теперь, когда мой бот движется по сетке и переходит к некоторой координате (x, y) в сетке по некоторому пути.Допускаются только повороты на 90 и 180 градусов.

Как мне достичь (0,0), то есть начальной точки, проходящей по тому же пути?Как я могу изменить ориентацию и дать соответствующие инструкции поворота, используя код C?

1 Ответ

2 голосов
/ 19 сентября 2010

Это можно исправить довольно много, но это должно быть хорошей основой для понимания концепций. Все, что мы в основном делаем, это сохраняем каждое движение, а затем просто возвращаем его назад.

#include <stdio.h>

#define MAX_STEPS 256

enum CARDINAL_DIRECTIONS { N = 0, W, S, E };

struct _s_robot {
    int x;
    int y;
    int orientation;
    int step;
    int x_history[MAX_STEPS];
    int y_history[MAX_STEPS];
    int turn_history[MAX_STEPS];
} MY_LITTLE_ROBOT = {0, 0, 0, 0, {0}, {0}, {0}};

void robot_go() {
    switch(MY_LITTLE_ROBOT.orientation) {
    case N:
        ++MY_LITTLE_ROBOT.y;
        break;
    case W:
        --MY_LITTLE_ROBOT.x;
        break;
    case S:
        --MY_LITTLE_ROBOT.y;
        break;
    case E:
        ++MY_LITTLE_ROBOT.x;
        break;
    }
    MY_LITTLE_ROBOT.x_history[MY_LITTLE_ROBOT.step] = MY_LITTLE_ROBOT.x;
    MY_LITTLE_ROBOT.y_history[MY_LITTLE_ROBOT.step] = MY_LITTLE_ROBOT.y;
    MY_LITTLE_ROBOT.turn_history[MY_LITTLE_ROBOT.step] = MY_LITTLE_ROBOT.orientation;
    ++MY_LITTLE_ROBOT.step;
}

void robot_change_orientation(int _orientation) {
    MY_LITTLE_ROBOT.orientation = _orientation;
}

void robot_reverse_orientation(int _orientation) {
    if (_orientation == N) MY_LITTLE_ROBOT.orientation = S;
    else if (_orientation == W) MY_LITTLE_ROBOT.orientation = E;
    else if (_orientation == S) MY_LITTLE_ROBOT.orientation = N;
    else if (_orientation == E) MY_LITTLE_ROBOT.orientation = W;
}

void robot_backtrack() {
    int i;
    printf("MY_LITTLE_ROBOT wants to turn around, currently at: %i, %i\n", MY_LITTLE_ROBOT.x, MY_LITTLE_ROBOT.y);
    robot_reverse_orientation(MY_LITTLE_ROBOT.orientation);
    for (i = MY_LITTLE_ROBOT.step-1; i >=  0; --i) {
        printf("Robot is @ %i, %i, with an orientation of: %i \n", MY_LITTLE_ROBOT.x, MY_LITTLE_ROBOT.y,  MY_LITTLE_ROBOT.orientation );
        robot_reverse_orientation(MY_LITTLE_ROBOT.turn_history[i]);
        robot_go();
    }
}

void dump_history() {
    int i;
    for (i = MY_LITTLE_ROBOT.step-1; i >=  0; --i) {
        printf("Robot is @ %i, %i, with an orientation of: %i \n", MY_LITTLE_ROBOT.x_history[i], MY_LITTLE_ROBOT.y_history[i],  MY_LITTLE_ROBOT.turn_history[i] );
    }
}

int main() {
    printf("***START: Robot is @ %i, %i\n", MY_LITTLE_ROBOT.x, MY_LITTLE_ROBOT.y);
    robot_go();
    robot_go();
    robot_go();
    robot_change_orientation(S);
    robot_go();
    robot_go();
    robot_change_orientation(W);
    robot_go();
    robot_go();
    robot_go();
    robot_change_orientation(N);
    robot_go();
    dump_history();
    robot_backtrack();
    printf("***FINISH: Robot is @ %i, %i\n", MY_LITTLE_ROBOT.x, MY_LITTLE_ROBOT.y);
    return 0;
}

Чтобы использовать робота снова и снова, вам может потребоваться сбросить всю историю путешествий после возврата, что должно быть несколько тривиально. Я намеренно избегал malloc s и других запутанных аспектов, делающих программу действительно полезной ради многословия и простоты. Надеюсь, это поможет.

Я также предположил, что вам не нужен истинный алгоритм поиска пути (такой как A *), потому что это совсем другая игра в мяч.

...