Member 13549834 Ответов: 3

Как я могу использовать цикл для всех этих операторов


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

Что я уже пробовал:

5 означает длину обнаружения 5 сантиметров

если(!обнаружить препятствие(5))
{
forwardLong();
Драйв.тотерайт();
форвардшорт();
Драйв.тотелефт();
forwardLong();
Драйв.тотелефт();
форвардшорт();
Драйв.тотелефт();
forwardLong();
Драйв.тотелефт();
форвардшорт();
Драйв.тотерайт();
forwardLong();
Драйв.тотерайт();
форвардшорт();
}
еще
{
BoeBot.wait(5);
состояние = 1;
}

3 Ответов

Рейтинг:
2

________________

Я предлагаю смотреть на движения бота как на объекты (сейчас у меня нет java-среды, поэтому исправьте синтаксис) : 

Вы должны определить класс следующим образом

class SingleMove
{
    public SingleMove(boolean short, boolean left)
    {
    Short = short;
    Left = left;
    }
        public boolean Short;
        public boolean Left;
    }

public void Move()
{
       if (Short)
    {
       forwardShort();
    }
    else
    {
      forwardLong();
    }

if (Left)
{
  Drive.toTheLeft();
}
else
{
  Drive.toTheRight();
}


}


}

Чем вы можете создать массив с предпочтительным алгоритмом движения:

ArrayList [] Allmoves = новый Arralylist;

Все двигается.Add(new SingleMove(True, False));

...

Все двигается.Add(new SingleMove(True, False));
Все двигается.Add(new SingleMove(False, False));

Тогда ваш код действия будет выглядеть так :

for(int ii = 0 ; ii <  Allmoves.GetLenght(); ii++)
{
   if(!Detect.obstacle(5))
    {
        Allmoves[ii].Move();
    }
}


Рейтинг:
0

OriginalGriff

Я бы сделал это с помощью набора команд.
Это может быть так же просто, как строка пар символов: один для операции, один для длительности.
Может быть, вот так:

FLDRFSDLFL...
Где "F" означает "Вперед", "L" - "долго"; "D" - "направление", "R" - "вправо"; "F" - "вперед", "S" - "коротко"; "D" - "направление", "L" - "влево"; ... и так далее.
Затем пусть ваш цикл обработает пару символов: если он получает "FL", он вызывает forwardLong; если он получает "DL", он звонит Drive.toTheLeft После каждой команды он проверяет наличие препятствий, прежде чем перейти к следующей команде.

Это также означает, что вам не нужно переписывать свой код для каждой фигуры - просто измените строку, которую вы ей передаете.


________________

Это хорошая идея, но если создать еще один язык программирования. :-)

OriginalGriff

Нет, вы просто предоставляете данные, которые управляют действиями фиксированной программы, точно так же, как содержимое базы данных управляет тем, что отображается на веб-сайте интернет-магазина. Поскольку продукты и их цены меняются, меняются данные, а не программа, но веб-страница всегда актуальна.

________________

Соглашаться. Но это следующий шаг для topicaster - после понимания ООП. :-)

Рейтинг:
0

Jochen Arndt

Ваш вопрос не очень ясен. Но я предлагаю написать метод для одного движения проходящего расстояние и направление в качестве параметров и возвращающего состояние столкновения:

boolean MoveOne(boolean longMove, boolean leftDirection)
{
    // Optionally wait and check again here upon collision
    if (IsCollision())
        return false;
    if (longMove)
        forwardLong();
    else
        forwardShort();
    if (leftDirection)
        Drive.toTheLeft();
    else
        Drive.toTheRight();
    return true;
}
Затем можно определить массив перемещений и использовать цикл для вызова этой функции для каждой пары элементов:
// Tip: Define constants for the corresponding moves to increase readability
boolean moveShape[][] = { 
    { true, false}, { false, true} // , ...
};
for (int i = 0; i < numberOfMoves; ++)
{
    if (!MoveOne(moveShape[i][0], moveShape[i][1]))
    {
        break;
    }
}