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

Среда исполнителя

Исполнитель Алмазоискатель — это игровой персонаж. Он действует на поле, расчерченном на клетки 6/6.

Его движение ограничивают стены. На пути ему встречаются препятствия двух видов: враги и барьеры. Враги убивают, барьеры — препятствуют прохождению.
Враг — это змея, мечи и огонь,
барьеры - это обычные стены, ледяная стена голубого цвета и случайная стена.
Для каждого препятствия свой способ прохождения.
Змею нужно перепрыгивать,
под мечами нужно проползти,
огонь на протяжении игры то разжигается, то гаснет, поэтому нужно реализовать цикл проверки с ожиданием и проходить только тогда, когда он гаснет,
ледяную стену нужно разбить ударом.
Случайная стена выглядит как ряд прозрачных кирпичей. Она прозрачная потому, что может появиться в начале проигрывания алгоритма, а может нет. Если появляется, тогда становится яркой и присутствует до завершения алгоритма. Мы точно не знаем будет она или нет, поэтому с помощью блока условия (он выглядит как ромб) должны заложить в алгоритм оба варианта и когда она есть, и когда ее нет.
Обычные коричневые стены никак не пробиваются и не преодолеваются их нужно обходить.
На барьеры стоящие впереди исполнитель может запрыгивать и висеть.

Задача игры — собрать все алмазы, дойти до поля с лифтом (синяя дверь) и зайдя в него подняться из подземелья.

Сверху от игрового поля мы видим такие элементы:

1) Кнопки для управления картами.
Стрелки вправо и влево пролистывают и отображают разные карты для исполнителя. Средняя кнопка с изображенным квадратом переводит текущую карту со всеми ее персонажами в начальное положение.
2) Надпись «Карта не пройдена» показывает, что к текущей карте еще не было составлено правильной схемы. После составления схемы и проигрывания ее исполнителем без ошибок эта надпись сменится на «Карта пройдена».
Если составляется ветвящийся алгоритм, предполагающий разные варианты действий, в зависимости от условия, то, чтобы было засчитано прохождение карты должны быть проверены обе ветки событий. Условием является есть ли на пути случайная стена или ее нет. После проверки одной из веток событий надпись «Карта не пройдена» сменяется на «Проверена одна ветка». Нужно еще раз запустить проигрывание алгоритма и, если вторая ветка тоже проигрывается без ошибок, то надпись меняется на «Карта пройдена».
3) Блок с алмазами показывает сколько всего нужно собрать алмазов исполнителю в текущей карте. По мере прохождения игры и собирания алмазов они из бледных превращаются в яркие.

Под средой исполнителя находятся такие элементы:

1) Поле, в котором выводятся различные подсказки. Например, если в процессе выполнения алгоритма произошла какая-то ошибка, игра прервется и в поле будет выведена причина.
Возможные причины:
дана команда ползти, когда исполнитель стоит,
дана команда идти, когда исполнитель лежит,
дана команда идти, но впереди стена и идти нельзя,
дана команда идти, когда исполнитель висит на стене и т. д.
В поле, также отображается результат прохождения карты — она была пройдена успешно, или исполнитель убит врагом, или он не дошел и т. д.
2) Кнопка после поля подсказок прерывает проигрывание алгоритма, когда он уже запущен.
3) Кнопки со стрелками — это переходы к предыдущему и следующему слайду программы.

Область построения блок-схемы

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

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

Панель выбора блоков и команд

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

1) Блоки границ — это блоки овальной формы. Каждый алгоритм начинается с овального блока «начало» и заканчивается овальным блоком «конец».

2) Блоки данных — это блоки в форме параллелограмма. Они используются в алгоритме везде где нужно запросить ввод каких-то данных у пользователя или вывести сообщение. В СКИ алмазоискателя используется блок данных «Ввод скорость» для указания скорости исполнителя. Если, при реализации блок-схемы исполнителем попадается этот блок, то появляется диалоговое окно, предлагающее выбрать скорость из нескольких вариантов. При отсутствии этого блока, исполнитель двигается со скоростью по-умолчанию - 1 секунда на шаг. Блок с командой «Вывод результ» выводит диалоговое окно с сообщением о том, сколько алмазов уже собрано и достиг ли исполнитель конечной цели.

3) Блоки действия — это блоки прямоугольной формы. Они задают отдельные действия.
У некоторых из них есть еще числовые значения в названии. Эти числа тоже можно задавать.

4) Блоки условия — это блоки ромбической формы. Они реализуют ветвящиеся и циклические алгоритмы.
В ромбик помещается вопрос или какое-то условие на которое можно однозначно ответить да или нет. Если уловие истинно, то реализуется одна ветка событий, если ложно — другая.

Действия исполнителя

В СКИ исполнителя перечислены 8 команд, которые он может выполнять.

1) Идти 1 - исполнитель перемещается шагом вперед на столько клеток, сколько указано в команде. Если на пути встречается стена, то выдается ошибка, что вперед идти невозможно.
Нельзя подавать команду идти если исполнитель лежит на земле или висит на стене. Сначала нужно встать или спрыгнуть.

2) Прыжок 1 - исполнитель перемещается прыжком вперед на столько клеток, сколько указано в команде.
Если на пути встречается стена, то он запрыгивает на стену.

Если исполнитель висит на стене и повернут в сторону стены, то при команде прыжок запрыгнет на стену выше.
Чтобы спрыгнуть со стены нужно сначала подать команду «развернуться», а потом «прыжок 1».
Если, при этом, с противоположной стороны будет стена, то исполнитель перепрыгнет с одной тены на другую.
Также исполнитель может запрыгнуть на клетку, расположенную выше и впереди, если стена, на которой он висит переходит вверху в пол этой клетки.
3) Ползти 1 - исполнитель переползает вперед на столько клеток, сколько указано в команде. Если на пути встречается стена, то выдается ошибка, что вперед идти невозможно.
Нельзя подавать команду ползти если исполнитель стоит на земле или висит на стене. Сначала нужно спрыгнуть и лечь на землю.

4) Взять алмаз - исполнитель берет алмаз, который находится на той же клетке, на которой он стоит. Если команда подана, но алмаза нет, то выдается ошибка.

5) Ждать 1 — ждать на месте столько секунд, сколько указано в команде.
Эта инструкция используется когда исполнитель стоит около огня. Он не знает сколько по времени огонь будет гореть и когда погаснет. Поэтому используется блок условия для проверки есть ли огонь впереди. Если есть — тогда дается команда «ждать», если нет, тогда можно идти.

6) Лечь — исполнитель ложится на землю. Нельзя подавать эту команду если он и так лежит или висит на стене.

7) Встать — исполнитель встает на ноги из положения лежа. Нельзя подавать эту команду если он и так стоит или висит на стене.

8) Развернуться — исполнитель поворачивается в противоположную сторону.

9) Удар — перемещается на одну клетку вперед, совершая удар ногой. Если на пути встречается коричневая стена, то выдается ошибка, что вперед идти невозможно. Если стена ледяная — она пробивается.
Нельзя подавать команду идти если исполнитель лежит на земле или висит на стене. Сначала нужно встать или спрыгнуть.

10) «Впереди стена?» - это команда для блока условия. Она дает ответ «да» если впереди любая из стен (ледяная, каменная, случайная) и «нет», если путь вперед свободен.
Но целесообразно использовать блок с этой командой для определения есть ли случайная стена впереди, чтобы задать испольнителю разные варианты действий для обоих вариантов - если путь свободен или прегражден.

11) «Впереди огонь?» - это команда для блока условия. Она дает ответ «да» если впереди горит огонь и «нет», если огня впереди нет.
Этот блок используется в циклическом алгоритме. Пока горит огонь и условие истинно, исполнитель должен ждать и возвращаться вновь к проверке условия после каждой минуты ожидания.

12) «Повторено 1?» - это команда для блока условия. Она дает ответ «да» если в процессе выполнения алгоритма этот блок был пройден столько раз, сколько указанно в нем в виде числа и ответ «нет», если блок еще не был пройден указанное количество раз.
Он используется, когда в алгоритме есть повторяющаяся определенное, известное количество раз, последовательность действий. Тогда ставится этот блок и в нем указывается сколько раз последовательность должна повториться. Затем на ветке «нет» описывается эта последовательность и от последнего блока связь тянется вновь к началу этого блока условия. На ветке «да» описывается дальнейшая последовательность действий, которая выполняется после всех необходимых повторений команд.

Панель управления схемой

Снизу от области построения схемы находится ряд кнопок для управления схемой.

Перечислим их назначение слева-направо:
1) удаление выбранного блока (клавиатура delete),
2) переход в режим создания связей (клавиатура L),
3) перемещение выделенных блоков вверх (клавиатура ↑),
4) перемещение выделенных блоков вниз (клавиатура ↓),
5) перемещение выделенных блоков вправо (клавиатура →),
6) перемещение выделенных блоков влево (клавиатура ←),
7) переход в режим просмотра схемы (клавиатура P),
8) проверка созданной блок-схемы на целостность (пока что еще не реализовано),
9) запуск игры по созданной блок-схеме (клавиатура G).

Построение схемы

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

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


Добавление блока в область построения схемы
Чтобы добавить блок в ячейку области построения схемы можно использовать один из вариантов:
1) щелкнуть по блоку на панели выбора блоков и команд левой кнопкой мыши и не отпуская перетащить на ячейку в области построения схемы, затем отпустить,
2) щелкнуть по ячейке в области построения схемы, при этом ячейка окрасится в красный цвет, затем сделать двойной щелчок на блоке на панели выбора блоков и команд.
Для добавления нескольких одинаковых блоков в схему нужно выделить все ячейки, в которые будут вставляться блоки. Затем сделать двойной щелчек на блоке на панели выбора блоков и команд. Во всех выделенных ячейках появятся выбранные блоки.


Изменение команды на блоке
Если в добавленном на схему блоке нужно поменять команду, то можно использовать один из вариантов:
1) щелкнуть по команде на панели выбора блоков и команд левой кнопкой мыши и не отпуская перетащить на соответствующий блок в области построения схемы, затем отпустить,
2) щелкнуть по ячейке с нужным блоком в области построения схемы, при этом ячейка окрасится в красный цвет, затем сделать двойной щелчок на нужной команде на панели выбора блоков и команд.


Перемещение блоков
Для перемещения каких-либо блоков нужно выделить ячейку с нужным блоком или область ячеек, отпустить левую кнопку мыши, чтобы выделенные ячейки с блоками окрасились в красный цвет.
Затем можно использовать один из вариантов:
1) в выделенной области щелкнуть левой кнопкой мыши и, не отпуская ее, перетащить область на новую позицию, затем отпустить,
2) воспользоваться кнопками со стрелочками снизу области построения схемы,

3) воспользоваться клавишами клавиатуры со стрелками вверх, вниз, вправо, влево.
Если какая-то ячейка, в которую мы пытаемся переместить блок уже занята, то перемещения не произойдет и появится предупреждение.

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


Режим построения связей
Между блоками должна быть построена связь в виде линий, чтобы было понятно, какой шаг за каким следует. Чтобы прочертить линии нужно перейти в режим создания связей.
Для этого нужно нажать на соответствующую кнопку внизу области построения схемы, либо нажать на клавиатуре клавишу «L».


При этом на блоках появятся красные и синие круги. Красные круги обозначают из какого блока связь выходит, синие — в какой блок идет.


Чтобы прочертить связь нужно поднести указатель мыши к красному кругу одного из блоков — он увеличится в размере, нажать левую кнопку мыши и, не отпуская переместить на синий круг другого блока, затем отпустить. Блоки соединятся красной линией.

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

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

Блок начала содержит только исходящую связь, блок конца — только входящую, блоки данных и блоки действия содержат две связи — одну входящую, другую исходящую, а блоки условия три связи — одну входящую, и две исходящие.
Когда блок данных устанавливается в ячейку у его острых боков появляются надписи «Да» и «Нет». Если условие в блоке истинно, то после этого блока начнет выполняться тот блок, к которому построена связь от угла ромба с надписью «Да», если ложно — то «Нет».


Если создается цикл, то после составления тела цикла (то есть команды или последовательности команд, которые будут циклически повторяться) от последнего блока связь должна идти к входу в блок условия.
Например для блока «Впереди огонь?»:


Для блока «Повторено 1?»:

В режиме создания связей нельзя добавлять новые блоки и команды.
Чтобы выйти из этого режима нужно снова нажать на кнопку внизу области построения схемы или на кнопку «L» клавиатуры.

Режим просмотра схемы
Если схема большая, то она вся не помещается в видимой области и нужно использовать полосы прокрутки, чтобы работать с ней. Но можно посмотреть на всю схему целиком если нажать на кнопку просмотра схемы внизу области создания схемы или нажать на клавиатуре клавишу «P».


Это режим просмотра — в нем нельзя добавлять новые блоки и команды и редактировать схему. Чтобы выйти из режима нужно повторно нажать на эти кнопки.

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


Если в процессе выполнения алгоритма встречаются ошибки, то выполнение будет прервано и в поле подсказок выведена причина. Если ошибки в самой структуре схемы, тогда появится диалоговое окно, сообщающее об ошибках. Если выполнение алгоритма успешно и исполнитель справился со всеми задачами, то появится надпись «Карта пройдена».
Начавшееся проигрывание алгоритма можно остановить нажав на кнопку справа от поля подсказок.



Пример блок-схемы для карты 1