Это учебное пособие научит Вас создавать диаграммы действий - структурированные блок-схемы, позволяющие задавать алгоритмы графически в стиле структурированного программирования. Диаграммы действий облегчают задание алгоритмов, делая необязательным знание синтаксиса Java операторов. Использование диаграмм действий дает еще одно преимущество: с их помощью Вы можете визуализировать алгоритмы, делая их более понятными для других пользователей модели.
Чтобы облегчить процесс обучения, мы используем уже имеющуюся модель столкновения бильярдных шаров: Billiard Balls. В этой моделинесколько шаров двигаются в двумерной прямогольной области. Шары эластично отскакивают друг от друга и от границ области.
Мы создадим диаграмму действий, задающую алгоритм, реализованный в текущей модели с помощью функции checkHit(). Этот алгоритм проверяет, не произошло ли в текущий момент времени столкновения данного шара с каким-либо другим шаром.
Алгоритм последовательно проходит по всем шарам (они представлены в модели как коллекция активных объектов класса Ball) и проверяет, выполняются ли для шаров условия, свидетельствующие о том, что эти два шара столкнулись. Должны быть выполнены два условия: расстояние между этими шарами должно быть меньше, чем диаметр шара, и кроме того шары должны двигаться навстречу дург другу. Если столкновение будет обнаружено, то диаграмма действий вернет тот шар,который столкнулся с шаром, переданным ей в качестве аргумента.
Подготовьте модель
для учебного пособия

Создайте новую
диаграмму действий
Перетащите элемент Диаграмма
действий
с
палитры Диаграмма действий
на диаграмму класса
активного объекта Main. Будет
нарисована простейшая диаграмма действий, состоящая из
начальной точки (задаваемой блоком "диаграмма действий") и блока
"вернуть значение".
Чтобы обнаружить столкновение одного шара с каким-то другим, мы должны поочередно проверить все присутствующие в нашей модели шары на предмет столкновения с данным. Поэтому сейчас мы добавим в наш алгоритм цикл, который будет проверять для всех шаров выполнение условий столкновения.
Лучшим способом последовательно выполнить какое-либо действие над всеми элементами коллекции (с помощью которой мы задали бильярдные шары в нашей модели) является использование блока диаграммы действий Цикл For. Есть две разновидности этого цикла: Цикл со счетчиком и Итератор по коллекции. Как следует из названия, Итератор по коллекции итеративно проходит по всем элементам указанной коллекции. На каждой итерации выполняется заданное действие циклв, в котором доступен очередной элемент коллекции.
Добавьте цикл "for"
в диаграмму действий
Перетащите элемент Цикл For
из палитры Диаграмма действий
в нашу диаграмму действий.
Перетаскивая блок над областью графического редактора, Вы увидите, что
определенные точки диаграммы действий будут выделяться с помощью
маленьких кружков. Эти точки являются так называемыми точками вставки диаграммы действий.
Если при перетаскиваниии блока Вы отпустите кнопку мыши, когда
курсор мыши
будет
находиться над одной из этих точек, то блок будет добавлен в
соответствующее место диаграммы.
В
первое время выбор необходимой Вам точки вставки может быть не совсем
интуитивен, поэтому в этом учебном пособии мы будем указывать нужные
точки вставки на рисунках с помощью специальных красных стрелок:
Перетащив блок в указанную нами точку диаграммы действий, Вы увидите, что в диаграмму будет добавлен новый блок "цикл for":



Блок Решение (If.. Else) является простейшим способом управления выполнением алгоритма. Он обеспечивает выполнение фрагментов кода в соответствии с условием. У блока есть две исходящие ветви - true и false. С помощью других блоков диаграммы действий Вы можете задать последовательность действий для каждой из этих ветвей. Когда управление дойдет до данного блока, будет приниматься решение о том, по какой ветви блока управление пойдет дальше. Если заданное для блока условие будет выполнено (т.е. результат его выполнения будет равен true), то будет выбрана ветвь true. В противном случае - ветвь false.
Добавьте
блок "решение"
Перетащите элемент Решение
(If .. Else)
из палитры Диаграмма действий
в диаграмму действий (а именно - в точку вставки, расположенную внутри
цикла "for"):
Новый блок "решение" будет добавлен в эту точку диаграммы.

Перейдите на страницу Основные панели Свойства и введите условие в поле Условие. Условие может быть любым выражением Java, возвращающим значение типа boolean. Введите здесь b==b1. Вы увидите, что это условие будет отображено внутри блока в графическом редакторе.

Теперь мы хотим реализовать пропуск проверки столкновения в том случае, если мы сравниваем шар с самим собой. Нам нужно поместить только одну строку кода в ту ветвь диаграммы действий, которая будет выбрана в том случае, если результат выполнения нашего условия будет истинным (true). Вы можете добавить фрагменты кода в диаграмму действий с помощью соответствующих блоков Код. Код может быть как простым выражением Java, так и набором выражений, отделенных точками с запятой. Этот код будет выполняться тогда, когда управление дойдет до соответствующего блока "код".
Добавьте блок кода
Перетащите элемент Код
из
палитры Диаграмма действий
в точку вставки, расположенную в ветви true блока "решение".
Новый блок "код" будет добавлен в эту точку диаграммы.

Перейдите на страницу Основные
панели Свойства.
В поле Код
введите Java код, который Вы хотите выполнить в тот момент, когда
управление диаграммы дойдет до этого блока. Введите здесь
continue;
Этот код будет отображен внутри блока в графическом
редакторе.
Теперь добавим комментарий к этому коду, чтобы сделать алгоритм более понятным для других пользователей этой модели. Введите skip checking в поле Коментарий.


Теперь наша диаграмма действий не будет выполнять проверку столкновения шара с самим собой, пропустив этот случай и продолжив итерирование по другим элементам коллекции.
Теперь мы хотим проверить первое условие столкновения, а именно - проверить, находятся ли шары на расстоянии столкновения (т.е. расстояние между шарами меньше диаметра шара).
Для этого мы вначале объявим пару локальных переменных для хранения промежуточных результатов вычисления. Переменные в диаграммах действия задаются с помощью блоков Локальная переменная. Пожалуйста, обратите внимание, что локальная переменная видна не во всей диаграмме действий, а только в той ее части, которая следует за точкой объявления переменной.
Объявите локальную
переменную
Перетащите элемент Локальная
переменная
с палитры Диаграмма действий
в точку вставки
внизу области цикла "for":


Объявите еще одну
локальную переменную

Добавьте еще один
блок "решение"

Введите условие в поле Условие: dx*dx+dy*dy < 4*b.r*b.r
Введите комментарий к блоку в поле Комментарий:
check the distance between balls
Этот комментарий будет виден внутри блока (ранее там
отображалось условие).


Теперь мы должны проверить второе условие столкновения - двигались ли шары в момент потенциального столкновения навстречу друг другу или нет. Мы реализуем эту проверку так же, как и предыдущую - вначале создадим локальные переменные, а затем добавим блок "решение", который собственно и будет производить проверку.
Объявите две
локальные
переменные
Назовите первую переменную vrx и задайте Начальное значение: b1.vx - b.vx
Добавьте еще один
блок "решение"

Введите условие в поле Условие: dx*vrx+dy*vry <= 0
Введите комментарий к блоку в поле Комментарий:
проверка направления движения
шаров

Теперь нам нужно определить, какие значения будет возвращать наша диаграмма действий. Это может быть сделано с помощью блоков Вернуть значение (Return). Блок Вернуть значение (Return) играет две роли: во-первых, он определяет, какое значение будет возвращать диаграмма действия (если ее тип возвращаемого значения не void), и во-вторых, немедленно возвращает это значение, завершая тем самым процесс.
Если мы обнаружим столкновение шаров, то наша диаграмма действий должна будет вернуть в качестве возвращаемого значения тот шар, который столкнулся с шаром, переданным этой диаграмме в качестве аргумента.
Вставьте
блок "вернуть значение"
Перетащите элемент Вернуть
значение (Return)
из палитры Диаграмма действий в ветвь true
только что созданного блока "решение". Эта ветвь будет нарисована
пунктиром, обозначая тем самым,
что управление никогда не дойдет до тех блоков, которые будут следовать
в данной ветви за блоком "вернуть значение".
Каждая ветвь диаграммы действий должна заканчиваться блоком Вернуть значение (Return). По этой причине в конец каждой новой диаграммы действий, один блок "вернуть значение" был автоматически добавлен в ее конец, сделав таким образом уже эту начальную конструкцию логически завершенной. Управление будет передано этому блоку, когда алгоритм закончит свою работу и не найдет ни одного столкновения, поэтому здесь мы должны вернуть значение null.
Задайте значение,
возвращаемое диаграммой действий
Выберите блок "вернуть значение", расположенный внизу нашей диаграммы действий.
На странице Основные
панели Свойства,
введите null в поле Возвращаемое значение.

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