По вопросу цикла-Моделирование движения робота на 2d-массиве

я пытаюсь смоделировать движение робота в 2d-массиве. В моем случае робот сначала идет вперед, если он видит энгеля, он поворачивает налево и продолжает свое движение. Проблема в том, что я не мог представить поворот налево и движение в левом направлении в исходной матрице.

Вот мой код:

#include <Servo.h>
#define x 7                                         //определения матрицы
#define y 7

const int trigPin = 12;
const int echoPin = 11;

Servo myServo;                                     //определения переменных
Servo myServo2;

int pos = 0;

int counter;
int counter1 = 0;
int counter2;
int counter3;

int integer;
int integer2;
int integer4;

long duration;
long distance;

void setup() {
    Serial.begin(9600);
    myServo.attach(9);
    myServo2.attach(10);
    pinMode(trigPin, OUTPUT); // Устанавливает тригПин в качестве выходного
    pinMode(echoPin, INPUT); // Устанавливает эхопин в качестве ввода
}

void loop() {
    int my2dArray[x][y] = {                          // начальная матрица
        {1, 1, 1, 1, 1, 1, 1},
        {1, 1, 1, 1, 1, 1, 1},
        {1, 1, 1, 1, 1, 1, 1},
        {1, 1, 1, 0, 1, 1, 1},
        {1, 1, 1, 1, 1, 1, 1},
        {1, 1, 1, 1, 1, 1, 1},
        {1, 1, 1, 1, 1, 1, 1},
    };
    // Clears the trigPin
    digitalWrite(trigPin, LOW);
    delayMicroseconds(2);
// Устанавливает триггер в ВЫСОКОЕ состояние на 10 микросекунд
    digitalWrite(trigPin, HIGH);
    delayMicroseconds(10);
    digitalWrite(trigPin, LOW);
// Считывает эхопин, возвращает время прохождения звуковой волны в микросекундах
    duration = pulseIn(echoPin, HIGH);
// Расчет расстояния
    distance = duration * 0.034 / 2;
    int robot = my2dArray[3][3];                   // первое место робота

    if (counter1 > 0) {
        for (integer = 0;  integer < counter1; integer += 1) {
            if (distance < 10) {                                  //seeing     the object
                for (pos = 0; pos <= 180 ; pos += 1) {              //turning left
                    myServo.write(pos);
                }

                for (pos = 0; pos <= 180  ; pos += 1) {            //moving on after turning
                    myServo.write(pos);
                    myServo2.write(pos);

                    if (pos == 180) {
                        counter3 +=  1;
                    }
                }

                Serial.println(integer);

                for (integer4 = 0;  integer4 < counter3; integer4 += 1) {     //modifying matrix if there is an object
                    my2dArray[3 + integer][3 + integer4] = robot * my2dArray[3 + integer][3 + integer4];
                }

                Serial.println("Break condition.");
                break;
            } else {
                my2dArray[3 + integer][3] = robot * my2dArray[3 + integer][3];    //modifying matrix in case of there is no object
            }
        }
    }

    for (integer2 = 0; integer2 < 7; integer2++) {                          //отображение матрицы
        Serial.print(my2dArray[integer2][0]);
        Serial.print("|");
        Serial.print(my2dArray[integer2][1]);
        Serial.print("|");
        Serial.print(my2dArray[integer2][2]);
        Serial.print("|");
        Serial.print(my2dArray[integer2][3]);
        Serial.print("|");
        Serial.print(my2dArray[integer2][4]);
        Serial.print("|");
        Serial.print(my2dArray[integer2][5]);
        Serial.print("|");
        Serial.println(my2dArray[integer2][6]);
    }

    Serial.println();

    for (pos = 0; pos <= 180  ; pos += 1) {                               // движение вперед в первый момент
        myServo.write(pos);
        myServo2.write(pos);

        if (pos == 180) {
            counter1 +=  1;
        }
    }

    delay(1000);
}

Проблемная часть заключается в следующем:

for (integer4 = 0;  integer4 < counter3; integer4 += 1){      //modifying matrix if there is an object

    my2dArray[3 + integer][3+integer4] = robot * my2dArray[3 + integer][3+integer4];

     }

"целочисленное" значение не изменяется в проблемной части, оно всегда равно 0, несмотря на первый цикл for. Как я могу правильно передать "целое число" в проблемную часть?

, 👍-1

Обсуждение

Эти имена переменных действительно сбивают с толку. Вы действительно должны называть их в честь того, что они представляют, а не типа данных, который в них содержится., @Majenko

Кроме того, вам действительно следует научиться правильно форматировать свой код. Это значительно облегчает следование. На этот раз я сделал это для вас, но вам действительно нужно научиться правильно делать отступы., @Majenko


1 ответ


0

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

for (integer = 0; integer < counter1; integer += 1) {
    if (distance < 10) {
        // ...
        for (integer4 = 0;  integer4 < counter3; integer4 += 1) {     //modifying matrix if there is an object
            my2dArray[3 + integer][3 + integer4] = robot * my2dArray[3 + integer][3 + integer4];
        }
        break; // << HERE
    } else {
        // ...
    }
}

Какова цель этого перерыва? Я думаю, что вы используете его, чтобы выпрыгнуть из if, чтобы он не запускал else, который он все равно не запустит, так как это условие else. Вместо этого на самом деле разрыв завершает цикл for после первой итерации, которая попадает в это внутреннее условие if. То есть, пока расстояние меньше 10, оно будет выполняться только один раз, и поэтому целое число всегда будет равно 0.

,