493.98K
Categories: programmingprogramming informaticsinformatics

Управление с клавиатуры. Графический редактор

1.

ТЕМА
УПРАВЛЕНИЕ С
КЛАВИАТУРЫ

2.

Задача на 2 следующих занятия –
проект «Графический редактор»
Это будет программа с
«клавишным интерфейсом пользователя»
! такого мы пока еще не делали !
Мы все являемся пользователями множества устройств.
Подумаем, например, про телевизор:
- если мы хотим его включить, мы возьмем пульт управления
и нажмем на клавишу с маркировкой «вкл»
- если хотим переключить канал, нажмем на клавишу,
выделенную для этого действия
Когда мы пользуемся пультом от телевизора, мы понимаем,
что к кнопкам привязаны определенные действия, мы
осведомлены о «значении кнопок».

3.

В программе «Графический редактор»
- мы сами выберем на клавиатуре компьютера набор
«управляющих клавиш»
- к каждой клавише мы привяжем одно действие черепашки
Когда программа будет запущена на исполнение, мы сможем
управлять черепашкой, используя «управляющие клавиши».
Например так:
- нажимаем на клавишу «9» черепашка двигается вперед
- нажимаем на клавишу «2» черепашка двигается назад
- нажимаем на клавишу «С» черепашка меняет цвет пера

4.

Алгоритм взаимодействия с черепашкой-исполнителем,
к которому мы привыкли:
код
исполнитель
исполняется код
изменяется состояние исполнителя
вперед
…..
назад
…..
написали текст программы
запустили программу на исполнение
видим, как черепашка исполняет команды программы
при этом черепашка исполняет всю программу целиком

5.

пользователь
исполнитель
код
9
вперед
…..
2
назад
……
С
измени цвет
Cейчас получится так:
написали текст программы
запустили программу на исполнение
нет никаких видимых исполняемых черепашкой действий
Чтобы черепашка что-то делала и мы это увидели, потребуется
нажимать на управляющие клавиши.
Здесь у нас появляются 2 явные различные роли:
- автор программы
- пользователь программы

6.

В примере про телевизор исполнителем команд является
устройство – телевизор.
Когда мы управляем состоянием телевизора, мы знаем
«функционал» клавиш пульта управления.
Но, дальше, «вглубь» мы не думаем – про то, как работает
пульт управления, про то, что за работой клавиш стоит
программа.
Относительно телевизора у нас только одна роль - пользователь.
Сейчас наш исполнитель – черепашка.
Работая над новым проектом, каждый из вас будет в двух
ролях: и пользователя, который «нажимает на кнопки» и
автора программы.
Как авторы вы сами определите «значение» управляющих
клавиш = привяжете к каждой управляющей клавише
определенную часть программного кода.

7.

Б
Ы
исполнитель исполняется код
изменяется состояние
исполнителя
Л
О
Н
А
Д
О
С
Д
Е
Л
А
Т
Ь
пользователь
исполнитель
код
вперед
…..
назад
…..
код
9
вперед
……
2
назад
……
С
измени цвет
Код исполняется. Но для изменения состояния исполнителя этого не достаточно.
Состояние исполнителя изменяет пользователь программы
через нажатие управляющих клавиш

8.

Задание 1.
В правой части клавиатуры есть вот такой блок клавиш:
789
456
123
0
Используем эти клавиши в качестве управляющих:
-
при нажатии «8» черепашка должна пройти вверх на 20 пикселей,
при нажатии «2» вниз на 20 пикселей,
при нажатии «4» влево на 20 пикселей,
при нажатии «6» вправо на 20 пикселей.
Если у вас нет такого отдельного раздела клавиатуры, это ничего не
меняет в задании. Используйте обычные цифровые клавиши.

9.

Нам нужно будет использовать новую команду:
readchar
жди_символ
читает символ, нажатый с клавиатуры
Чтобы запомнить прочитанный символ (с целью его
использовать далее в программе), необходимо записать его
в переменную,
вот так:
make “a readchar //здесь а – это имя переменной

10.

Вернемся к заданию.
Для начала напишем процедуру однократного движения
черепашки
- вверх при нажатии клавиши «8» и
- вниз при нажатии клавиши «2»
to dv
make “a readchar
if :a = 8 [fd 20]
if :a = 2 [bk 20]
end

11.

To dv
make “а readchar
if :а = 8 [fd 20]
if :а = 2 [bk 20]
end
Запустите процедуру
на исполнение
(в окне команд
набираете dv )
Потом на клавиатуре
нажмите клавишу «8»
Подумайте, как исполняется процедура после нажатия «8»?

12.

To dv
make “a readchar
if :a = 8 [fd 20]
if :a = 2 [bk 20]
end
По нажатию клавиши «8»
процедура выполнится
вот так и остановится
начало
dv
Make “a 8
Fd 20
Если мы нажмем на «8»
во второй раз,
ничего не произойдет
конец
dv
Вопрос: какие изменения нужно внести в процедуру,
чтобы при втором, третьем и далее нажатии на клавиши
«8» и «2» черепашка также двигалась вверх и вниз?

13.

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

14.

Надо, чтобы процедура работала по такому алгоритму
начало
dv
Make :a readchar
начало
dv
Make :a readchar
начало
dv
Fd 20
Make :a readchar
Fd 20
Fd 20
конец
dv
конец
dv
конец
dv

15.

Непрерывное «ожидание» нажатия управляющей клавиши мы
можем реализовать за счет рекурсии
Изменим эту процедуру:
To dv
make “key readchar
if :key = 8 [fd 20]
if :key = 2 [bk 20]
end
To dv
make “a readchar
if :a = 8 [fd 20]
if :a = 2 [bk 20]
dv
end

16.

Давайте подумаем, как будет
исполняться такая рекурсивная
процедура.
To dv
make “a readchar
if :a = 8 [fd 20]
if :a = 2 [bk 20]
Допустим, мы опять пишем в окне
dv
команд dv и далее нажимаем
end
на клавиатуре «8»
Выполнится
Потом выполнится
make “а 8
fd 20
это обеспечит
однократное движение
Потом будет вновь вызвана процедура dv
именно это обеспечит «состояние ожидания»
Далее, процедура уже запущена на исполнение самой собой и если мы
нажимаем на клавишу «8» еще раз, исполняется та же
последовательность команд: make “а 8
fd 20
И вновь будет вызвана процедура dv

17.

Запуск на исполнение рекурсивной процедуры dv и
дальнейшее последовательное нажатие на клавишу «8»
несколько раз дает вот такой «рекурсивный каскад» из
серии команд:
make “a 8
To dv
make “a readchar
if :a = 8 [fd 20]
if :a = 2 [bk 20]
dv
end
fd 20
dv
make “a 8
fd 20
dv
make “a 8
fd 20
dv
..……
Итого: мы поняли, что для обеспечения возможности
многократной реакции черепашки на управляющую клавишу,
в описание процедуры, «связывающей» движение с клавишей
необходимо внести рекурсивный вызов

18.

Теперь нам надо добавить в процедуру движение влево
при нажатии «4» и вправо при нажатии «6».
Допустим, мы сделаем это вот так:
To dv
make “a readchar
if :a = 8 [fd 20]
if :a = 2 [bk 20]
if :a = 4 [lt 90 fd 20]
if :a = 6 [rt 90 fd 20]
dv
end

19.

To dv
make “a readchar
if :a = 8 [fd 20]
if :a = 2 [bk 20]
if :a = 4 [lt 90 fd 20]
if :a = 6 [rt 90 fd 20]
dv
end
Проверьте, как работает
эта процедура.
Для начала сделайте так:
нажимайте несколько раз подряд
на клавишу «4».
Видим: при однократном нажатии
на «4» черепашка делает поворот
влево на 90 и далее шаг вперед
А если нажать на «4» несколько раз подряд, черепашка уже рисует
квадратик, а не движется влево шаг за шагом.
Теперь запустите процедуру следующим образом: сначала используйте
клавишу «4» или «6», а потом «2» или «8».
Вы увидите, что первоначально правильная последовательность команд
для клавиш «2» и «8» также начинает работать неправильно после того,
как мы использовали клавиши «4» или «6». При нажатии на «2» или «8»
черепашка теперь идет не вверх или вниз, а куда-то.
Почему так происходит?

20.

To dv
make “a readchar
if :a = 8 [fd 20]
if :a = 2 [bk 20]
if :a = 4 [lt 90 fd 20]
if :a = 6 [rt 90 fd 20]
dv
end
ВАЖНОЕ УПРАЖНЕНИЕ:
На листке бумаги действуем
«от имени черепашки» отрабатываем последовательность
нажатий на клавиши,
рисуйте след!
Нажимаем на клавишу
Положение черепашки
Ни на что пока не нажали
исходное положение
в центре экрана
4
повернулась налево
продвинулась на 20 влево
8
никуда не повернулась
продвинулась еще на 20 влево
8
никуда не повернулась
продвинулась еще на 20 влево
6
повернулась направо
продвинулась на 20 вверх

21.

ВАЖНОЕ УПРАЖНЕНИЕ.
Продолжаем: отработайте аналогичным образом еще одну
последовательность клавиш. Например такую: 8, 2, 4, 8, 2 или любую
произвольную, но с присутствием в ней клавиш 4 или 6
Какие выводы мы должны сделать?
Вывод 1, простой:
Работа процедуры происходит не по тому сценарию, который мы хотим
реализовать
Вопрос:
что влияет на то, куда идет черепашка на каждом следующем шаге?
Ответ: ее текущее положение
черепашка начинает двигаться НЕ из исходного положения вот такого:
голова вверх, центр экрана;
а из того положения, в котором она оказалась на предыдущем шаге.
Направление головы черепашки может быть разным, а именно одним из
3х возможных:

22.

Вопрос: какие изменения можно внести в команды,
связанные с управляющими клавишами «4» и «6» чтобы
процедура работала по нужному сценарию, а именно:
«2» - всегда движение вниз
«8» - всегда движение вверх
«4» - всегда движение влево
«6» - всегда движение вправо
789
456
123
0
Ответ: можно возвращать черепашку в положение
«головой вверх» после поворотов влево и вправо.

23.

Вот так:
To dv
make “a readchar
if :a = 8 [fd 20]
if :a = 2 [bk 20]
if :a = 4 [lt 90 fd 20 rt 90 ]
if :a = 6 [rt 90 fd 20 lt 90 ]
dv
end
Эта процедура реализует нужный сценарий управления
движением. Но, тут мы «хитрим» - черепашка все время
(почти) развернута головой вверх.

24.

Дальше мы поставим себе более сложную задачу:
написать такую программу для управляющих клавиш
«2», «4», «6» и «8», чтобы черепашка при движении
смотрела в ту сторону, куда она движется, а не вверх.
Выполняя Упражнение мы увидели, что текущее положение
черепашки (куда она сейчас повернута головой) влияет на то,
как будет отработано следующее нажатие на управляющую
клавишу (куда черепашка развернется и пойдет).
Внимание: при решении этой задачи нам придется
думать про черепашку
«одновременно в двух временных точках»:
1) настоящий момент – нажатие управляющей клавиши,
оно происходит сейчас
2) предыдущий момент – предыдущее нажатие
управляющей клавиши

25.

В тот момент, когда мы нажимаем на управляющую клавишу
(этот момент = сейчас) мы должны
знать не только то, какая клавиша нажата сейчас,
но и то, какая клавиша была нажата на предыдущем шаге.
Еще раз формулировка задачи:
написать такую программу для управляющих клавиш
«2», «4», «6» и «8», чтобы черепашка при движении
смотрела в ту сторону, куда она движется.
Каким может быть алгоритм решения ?
1) Мы должны знать:
- как была развернута черепашка на предыдущем шаге
- какая клавиша нажата сейчас
2) при нажатии управляющей клавиши развернуть черепашку
так, как надо по сценарию работы управляющей клавиши
(угол разворота будет зависеть от текущего положения)
3) после этого шагнуть вперед на 20

26.

В программе будет две процедуры:
1) основная, реализующая движение черепашки
2) запускающая процедура, которая:
- очищает экран,
- опускает перо,
- запускает основную процедуру
Для того, чтобы правильно написать основную процедуру,
нам нужно будет знать:
• какая управляющая клавиша нажата сейчас
// узнаем, как в итоге должна быть повернута черепашка
до того, как она сделает шаг вперед
какая управляющая клавиша была нажата последней
// узнаем, в какую сторону она повернута сейчас
Разница между этими положениями дает нам угол поворота,
на который надо развернуть черепашку

27.

Дальше мы будем использовать для исполнителя-черепашки термин
«состояние».
С состоянием объекта мы уже имели дело. Например, когда
настраивали окно вывода информации. Объект «окно вывода» может
быть в разных состояниях: прозрачным или нет, с подписью или без….
Сама черепашка тоже может быть видимой или не видимой, может быть
разных цветов.
Термин «состояние» используется в программировании для описания
свойств объекта, которые ему присущи в определенный момент
времени.
В данной задаче черепашка может быть ориентирована в 4 разных
направлениях.
Каждое из этих положений мы назовем «состоянием»
Каждое состояние свяжем с клавишей, это «маркировка» состояния:
если состояние «8», значит черепашка повернута головой вверх
если состояние «2», значит черепашка повернута головой вниз…

28.

29.

Когда мы нажимаем управляющую клавишу
1. черепашка уже ориентирована в пространстве
определенным образом:
• «головой вверх», если последней была
нажата клавиша «8»
• «головой вниз», если последней была нажата
клавиша «2»
• «головой влево», если последней была
нажата клавиша «4»
• «головой вправо», если последней была
нажата клавиша «6»
Это - ее текущее состояние.

30.

2. черепашка должна поменять свое текущее
состояние на новое.
Новое состояние задается управляющей
клавишей, которая нажата сейчас:
• если нажата клавиша «8», черепашка должна
встать «головой вверх»
• если нажата клавиша «2», черепашка должна
встать «головой вниз»
• если нажата клавиша «4», черепашка должна
встать «головой влево»
• если нажата клавиша «6», черепашка должна
встать «головой вправо»

31.

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

32.

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

33.

Нам потребуются две переменные. Обе они будут
описывать состояние черепашки. Первая будет содержать
текущее состояние (назовем ее current_state), вторая –
новое состояние (назовем ее new_state).
В new_state будем считывать и запоминать клавишу,
которая нажата сейчас:
make "new_state readchar
На следующем шаге будем делать присвоение
make “current_state :new_state
И опять считывать нажатую клавишу
make “new_state readchar

34.

Пример:
Допустим, ранее была нажата клавиша «8».
Значит, черепашка сейчас в состоянии «головой вверх» и
значение переменной current_state сейчас равно 8.
Нажимаем клавишу “6”. Новое состояние черепашки “головой
вправо”, переменной new_state сейчас надо присвоить 6.
Черепашка должна повернуться на 90 градусов вправо и сделать
шаг.
После чего в переменную current_state должно быть записано
значение переменной new_state.
значение current_state
8
6
значение new_state
6
на сколько надо
повернуться
Rt 90 fd 20

35.

Черепашка сейчас в состоянии «головой вправо». Значение
переменной current_state сейчас равно 6.
Нажимаем клавишу “2”. Новое состояние черепашки “головой вниз”.
Значение переменной new_state сейчас равно 2.
Черепашка должна повернуться на 90 градусов вправо и сделать шаг.
После чего в переменную current_state должно быть записано значение
переменной new_state.
Черепашка сейчас в состоянии «головой вниз». Значение переменной
current_state сейчас равно 2.
значение current_state
значение new_state
на сколько надо
повернуться
8
6
Rt 90 fd 20
6
2
Rt 90 fd 20
2

36.

Результат работы программы может быть,
например, вот таким:

37.

Если вы справились с этим заданием, у вас
получилась программа, которая правильно работает для
заданных управляющих клавиш «2», «8», «6», «4».
А теперь попробуйте запустить ее, нажимая не только
запрограммированные вами управляющие клавиши.
Например, внесите «3» или «7» в последовательность
нажимаемых клавиш. Вы увидите, что программа
начинает работать неверно - в качестве текущего
состояния черепашки запоминается некоторая не
описанная в программе клавиша, что нарушает
правильное выполнение программы.

38.

Задание 2. Нам нужно, чтобы при нажатии
любой
не
запрограммированной
клавиши,
состояние черепашки осталось таким, каким
было до ее нажатия.
Следовательно,
программу
надо
будет
изменить таким образом, чтобы состояние
черепашки менялось только тогда, когда она
реально
развернулась
(была
нажата
управляющая клавиша), а не в любом случае
(при нажатии любой клавиши).
Речь
идет
о
присвоении
переменной
current_state значения переменной new_state.

39.

to dv
make "new_state readchar
if (or :new_state = 2 :new_state = 4 :new_state = 6 :new_state = 8)[ ;нажаты правильные клавиши
if :current_state = 8[
if :new_state = 6[rt 90]
if :new_state = 2[lt 180]
;if :new_state = 8[]
if :new_state = 4[lt 90]
make "current_state :new_state] ;запомнить новое положение "current_state
Начало
if :current_state = 2[
dv
if :new_state = 6[lt 90]
if :new_state = 8[lt 180]
;if :new_state = 2[]
if :new_state = 4[rt 90]
2 or 8
make "current_state :new_state]
or 4 or 6
if :current_state = 4[
if :new_state = 6[rt 180]
повернуться на
if :new_state = 8[rt 90]
if :new_state = 2[lt 90]
нужный угол
;if :new_state = 4[]
make "current_state :new_state]
if :current_state = 6[
Make “current_state
;if :new_state = 6[]
:new_state
if :new_state = 8[lt 90]
if :new_state = 2[rt 90]
if :new_state = 4[lt 180]
Fd 20
make "current_state :new_state]
fd 20] ;двигаться вперед
dv
end
to main
make "current_state 8
dv
end
вызов dv
Конец dv

40.

Начало
dv
2 or 8
or 4 or 6
повернуться на
нужный угол
Make “current_state
:new_state
Fd 20
вызов dv
Конец dv

41.

Далее мы будем решать ту же задачу, но более простым
способом.
Вопрос: зачем было решать задачу сложно, если можно легко?
Ответ:
Наши учебные задачи являются не целью, а средством
обучения. Каждая задача придумана так, чтобы решая ее, можно
было освоить новое понятие, метод, алгоритм.
Решая предыдущую задачу, мы использовали алгоритм,
учитывающий состояние объекта.
Мы запоминали текущее состояние объекта, выполняли команду
в зависимости от того, каким конкретно было текущее состояние
объекта, после чего запоминали новое состояние объекта.
В реальных задачах не всегда есть «волшебная команда»
которая позволяет реализовать простой алгоритм. Огромное
количество задач решаются только так – расчетом нового
состояния объекта исходя из его текущего состояния.

42.

Вспомним команду
Seth N
Нов_курс N
поворачивает черепашку
на абсолютный угол
Направление на экране соответствует направлению на
компасе. То есть значения абсолютного угла:

43.

Задание 3. Перепишите программу с использованием
команды поворота на абсолютный угол Seth. Добавьте в
нее:
1) движения наискосок по нажатию клавиш «1», «3», «7» и
«9»

44.

2) возможность опускать и поднимать перо. Для этих
операций выберем две буквы, например «d» (от слова
«down» - вниз) и «u» (от слова «up» - вверх).
3) проверку окончания рекурсии. Выберем для этого букву
«е» (от слова «еnd»). Пусть по нажатию этой клавиши
черепашка поднимет перо и вернется в положение home.
4) возможность установки нескольких цветов для
черепашки и команду fill - крась. Для задания цвета
используем буквы: «k» – black (черный), «w» – white
(белый), «r» – red (красный), «b» – blue (синий), «g» –
green (зеленый), «y» - yellow (желтый), «n» – brown
(коричневый); для команды fill используем букву «f».

45.

Важное замечание.
Обратите внимание на синтаксис: если команда readchar
считала клавишу с цифрой:
make "key readchar
if :key = 8 [rt 90]
если команда readchar считала клавишу с буквой
(добавляется значок ") :
make "key readchar
if :key = "d [pd]

46.

С помощью нашего графического редактора мы можем
нарисовать разные картинки, например вот такую:

47.

Задание 4.
В предыдущей программе каждое движение
черепашки происходило после нажатия управляющей
клавиши. Для того, чтобы, например, переместиться
влево на 200 пикселей нужно было 10 раз нажать
кнопку «4».
В новой программе нам надо организовать движение
так, чтобы после однократного нажатия клавиши
черепашка двигалась в соответствующем направлении
и продолжала это движение до тех пор, пока не будет
нажата какая-нибудь другая клавиша.

48.

нам понадобится новая команда
кey?
клавиша?
логический датчик (= функция);
результат исполнения «истина» или «ложь»
Как это работает и вообще про функцию
обработка входных данных
данные на входе
функция
данные на выходе =
результат исполнения
функции
Состояние клавиатуры
Это входные данные для функции key?

49.

key?
клавиша?
логический датчик (функция);
результат исполнения «истина» или «ложь»
Как это работает
состояние
клавиатуры
зависит от оценки
состояния клавиатуры
есть ли нажатая клавиша?
key?
Входные данные:
у клавиатуры 2 состояния: (1) ничего не нажато
(2) что-то нажато
истина
ложь
значение
результата
Функция key? / клавиша? выполняет оценку состояния клавиатуры
Выходные данные:
- если клавиатура в состоянии (1), у функции на выходе «Нет»
- если в состоянии (2), у функции на выходе «Да»

50.

Итого:
Запуск на исполнение функции клавиша?
приводит к тому, что где-то появляется результат
ее исполнения.
Результат логического типа, 2 возможных значения:
истина / ложь (да / нет)
Как «взять» результат и использовать его?
Пример использования функции key? в программе.
Наберите процедуру ниже и протестируйте ее:
to main
repeat 6 [show клавиша? wait 10]
end
Что происходит в этом примере? Давайте подробно разберем

51.

Пример использования функции key? в программе:
IF key? make “a readchar
IFELSE key? [make “a readchar] [make “a 0]
Поясните примеры. Что происходит при их исполнении?

52.

Пример использования функции key? в программе:
Разберемся….
IF key? make “a readchar
Как в процессе работы программы будет исполняться эта строка?
Сначала будет выполнена функция key?
Результат ее работы: либо ИСТИНА, либо ЛОЖЬ
Далее:
IF ИСТИНА make “a readchar
IF ЛОЖЬ исполняем следующую строку программы

53.

Пример использования функции key? в программе:
IFELSE key? make [“a readchar] [make “a 0]
Как в процессе работы программы будет исполняться эта строка?
Сначала будет выполнена функция key?
Результат ее работы: либо ИСТИНА, либо ЛОЖЬ
Далее:
IF ИСТИНА make “a readchar
IF ЛОЖЬ make “a 0

54.

Вернемся к заданию 4
Кроме функции key? нам понадобится команда wait t (жди t),
приостанавливающая работу программы на время t
Использование команды wait t нужно для того, чтобы процесс
движения черепашки был виден.
В предыдущей программе не потребуется делать никаких
кардинальных изменений.
Вспомним, в какой момент черепашка меняет направление
своего движения? - В момент нажатия клавиши.
И именно в этот момент она должна считать новое значение
клавиши.
Нужная нам команда:
IFELSE key? [make “a readchar] [wait 2]

55.

Пример. Повторить 10 раз действие: если клавиша
нажата, рисовать треугольник, иначе рисовать
линию 50 px
См. код в заметках к слайду

56.

ЗАДАНИЕ НА ДОМ
УСЛОВИЯ ЗАДАЧ РАЗМЕЩЕНЫ НА САЙТЕ
iamprogrammer.itv.ru

57.

ПРИМЕР РЕАЛИЗАЦИИ
ЗАДАНИЕ 2
to cifr :b
make "a readchar
if :a = 8 [if :b = 8 [fd 20]
if :b = 2 [ rt 180 fd 20 ]
if :b = 6 [ lt 90 fd 20]
if :b = 4 [ rt 90 fd 20 ]]
if :a = 2 [if :b = 8 [ rt 180 fd 20]
if :b = 2 [ fd 20 ]
if :b = 6 [ rt 90 fd 20]
if :b = 4 [ lt 90 fd 20 ]]
if :a = 6 [if :b = 8 [rt 90 fd 20]
if :b = 2 [ lt 90 fd 20 ]
if :b = 6 [ fd 20]
if :b = 4 [ rt 180 fd 20 ]]
if :a = 4 [if :b = 8 [lt 90 fd 20]
if :b = 2 [ rt 90 fd 20 ]
if :b = 6 [ rt 180 fd 20]
if :b = 4 [ fd 20 ]]
if not(or(:a = 8) (:a = 2) (:a = 4) (:a = 6)) [make "a :b]
make "b :a
cifr :b
end
to main
make "b 8
cifr :b
end
English     Русский Rules