В предыдущих статьях мы научились управлять терминалом с помощью команд ANSI
и создали несколько слов, открывающих новые возможности в генерации изображений.
В этой статье мы начнем рассматривать способы создания простых рисунков из текстовых символов. Хотя это по-прежнему всего лишь текстовый вывод, использование подобной "графики" может сделать ваши программы более дружественными к пользователю и улучшить восприятие выдаваемой информации.
Самый простой и часто используемый способ "декорирования" выводимого на терминал текста – печать разделительной строки из "звездочек" или символа "минус".
Можно просто создать слово, выводящее строку из звездочек необходимой длины:
: BAD-STARS ." ******************************" ;
Безусловно, это очень плохой пример, состоящий из одних недостатков. Забудьте, что вы это видели и никогда так не делайте.
Мы можем выводить на терминал любые символы с помощью EMIT , например, "звездочку":
: STAR [CHAR] * EMIT ;
Теперь нужно найти способ повторения этой операции необходимое число раз. Рассмотрим основной метод организации счетного цикла в программе:
Для выполнения какого-либо действия некоторое количество раз требуется счетчик повторений. Каждый раз, когда повторяемое действие выполняется, счетчик должен увеличиваться на 1. Для того, чтобы понять, когда необходимо прекратить повторения и заняться чем-то еще, программа должна помнить требуемое число повторов. Это число называется пределом цикла. После увеличения счетчика повторений программа сравнивает его с пределом цикла. Если счетчик стал равен пределу или превысил его, выполнение цикла прекращается и программа переходит к выполнению следующих действий.
На рисунке присутствует еще один параметр – начальное значение счетчика цикла. Для правильного счета необходимо установить счетчик в известное значение, обычно в ноль, но часто бывает полезным начинать счет с другого числа.
Теперь мы можем использовать средства Форта и создать слово, содержащее цикл:
: 10STARS 10 0 DO STAR LOOP ;
Выполните 10STARS и на экране появятся 10 "звездочек".
Новые слова DO и LOOP, которые появились в определении 10STARS , используются для повторного выполнения слов, находящихся между ними, другими словами, они организуют цикл. Поищем известные нам параметры цикла в определении:
Перед словом DO в стек помещаются два числа. Слово DO извлекает число с вершины стека, в нашем случае это 0, и использует его для установки начального значения счетчика цикла.
Затем слово DO извлекает из стека следующее число, в нашем определении это 10 - требуемое число повторений или предел цикла. Таким образом слово DO используется для инициализации параметров цикла, необходимых слову LOOP .
После того, как слово DO выполнило свою работу, выполняются слова между DO и LOOP. В нашем определении это единственное слово STAR, но на самом деле их может быть сколько угодно. Когда приходит очередь слова LOOP, оно увеличивает счетчик цикла и сравнивает его новое значение с пределом цикла. Если счетчик меньше предела, программа вернется к слову, следующему за DO. Если счетчик стал равен пределу, выполнение перейдет к слову, стоящему после LOOP.
Слово 10STARS имеет серьезный недостаток. Слово выводит строку только из 10 "звездочек", а нам хотелось бы выводить линии различной длины, в зависимости от числа, находящегося на вершине стека.
Нужно изменить определение таким образом, чтобы предел цикла задавался не внутри определения, а мы сами помещали его в стек перед выполнением слова:
: STARS \ n -- \ 0 DO STAR LOOP ;
Теперь в определении присутствует только начальное значение счетчика цикла (0), а вот предел цикла вам необходимо помещать в стек перед каждым выполнением слова STARS , о чем нам также подсказывает стековая диаграмма в комментарии.
Убедитесь, что все работает как надо:
Вернемся к наработкам из прошлых статей. Загрузите слова из файла или наберите на клавиатуре.
У нас уже есть слово, перемещающее курсор по экрану терминала. Используем его для создания слова, рисующего горизонтальную линию заданной длины len с началом в координатах x и y:
: H-LINE \ len x y -- \
GO-XY
0 DO [CHAR] - EMIT LOOP ;
Для рисования линии используем символ "минус". Если возникли ошибки, сравните свой ввод с текстом на снимке окна терминала:
Посмотрим, что у нас получилось. Наберите (в одну строку)
CLRSCR 28 12 6 H-LINE 24 16 8 H-LINE 20 20 10 H-LINE
и нажмите Enter. На экране терминала должны появится три горизонтальные линии:
Сохраните слово H-LINE вместе с другими словами, оно еще пригодится.
Аналогичное слово для построения вертикальных линий будет сложнее и потребует знакомства с несколькими новыми словами – разберемся с ними в следующей статье.
Спасибо за внимание.