Представим себе, что исполнителю "Ученик" надо провести в школе один учебный день. Исполнитель понимает команды МИНУТА_НА_УРОКЕ и МИНУТА_НА_ПЕРЕМЕНЕ, а также структуры ПОВТОРИ и ЕСЛИ. Для краткости будем считать, что день состоит из трех уроков и двух перемен √ 10 и 15 минут.
Программа, которая напрашивается для решения этой задачи, будет выглядеть так:
ЭТО ДЕНЬ
ПОВТОРИ 45 [МИНУТА_НА_УРОКЕ]
ПОВТОРИ 10 [МИНУТА_НА_ПЕРЕМЕНЕ]
ПОВТОРИ 45 [МИНУТА_НА_УРОКЕ]
ПОВТОРИ 15 [МИНУТА_НА_ПЕРЕМЕНЕ]
ПОВТОРИ 45 [МИНУТА_НА_УРОКЕ]
КОНЕЦ
Эта программа последовательно описывает действия исполнителя, что собственно и должна делать программа. Можно сказать, что в программе заложен некоторый сюжет √ на этом основании такую программу мы будем называть "сюжетной".
Теперь представим, что в языке нашего исполнителя есть датчик ЧТО_СЕЙЧАС, который возвращает значения ⌠урок■ либо ⌠перемена■ в зависимости от текущего времени. Тогда программу дня можно попытаться описать таким образом:
ЭТО ДЕНЬ
ПОВТОРИ 160
Программа не только занимает меньше места, она обладает еще одним поразительным свойством. То, что для нас (программистов) является двумя совершенно различными действиями (поведение на уроке и на перемене), для исполнителя оказалось записано одной и той же инструкцией (начинающейся с команды ЕСЛИИНАЧЕ). Программа фиксирует не столько последовательность действий, сколько правило поведения исполнителя. Это стало возможным благодаря тому, что нам удалось одной и той же инструкцией описать поведение исполнителя в любой момент времени (по аналогии с музыкой √ в любой "такт" нашего компьютерного произведения). Такую организацию программы мы и будем называть "однотактовой".
В нашем примере исполнитель выполняет тактовую инструкцию 160 раз, однако нетрудно представить себе ее бесконечное выполнение. Именно по такому принципу устроено большинство игровых программ, действие в которых разворачивается в режиме реального времени.
Самый простой способ организовать бесконечную однотактовую программу √ это бесконечная рекурсия. Основой структуры будет процедура ТАКТ, в которой будут описываться действия, происходящие в универсальный момент времени. Зафиксировать реальную продолжительность такта можно с помощью команды ЖДИ.
ЭТО ТАКТ
<Действия>
ЖДИ 1
ТАКТ
КОНЕЦ
Сразу оговорим одно возможное усложнение √ счетчик (переменная :сч) √ и будем пока считать общую структуру однотактовой программы утвержденной:
ЭТО ТАКТ :сч
<Действия>
ЖДИ 1
ТАКТ :сч + 1
КОНЕЦ
С точки зрения однотактовой программы важно не то, какие действия будут происходить внутри нее, а то, когда и почему будут происходить эти действия. С этих позиций мы и будем классифицировать возможные действия. Общая схема выглядит так:
|
2 |
||||||
|
|
2.1 |
|||||
|
|
2.1.1 |
2.1.2 |
2.2.1 |
2.2.2 |
2.3.1 |
2.3.2 |
Надеемся, что все позиции этой схемы понятны хотя бы в первом приближении. Наиболее разумно знакомиться с ними в порядке их нумерации, однако никто не может запретить Вам обратиться к тем разделам, которые интересуют Вас в большей степени. После знакомства с разделом 2.1.1 (Периодичные условные действия) Вы можете рассмотреть
специально приготовленный пример, демонстрирующий отличие однотактового программирования от других возможных способов создания проектов с динамической графикой.