Исполнитель Черепашка в среде Visyal Basic

В начало сайта А.И.Маргулева

Исполнитель Черепашка в среде Visual Basic

Некогда, известный в стране специалист по школьной информатике едко заметил, что обучение на основе искусственно подобранных "школьных" языков "мало отличается от игры в теннис по переписке" (Шафрин Ю. А. Основы компьютерной технологии. Москва, 1996. С. 7). Действительно, стоит ли тратить время на обучение алгоритмическому языку Ершова или Лого только для того, чтобы слегка поуправляв каким-нибудь исполнителем-роботом (зачастую, только "теоретически", на бумаге), перейти, затем, к "настоящему" программированию в объектно-ориентированной среде? Тем не менее именно такой подход продвигает лаборатория информационных технологий МИПКРО как в предлагаемых программах (Угринович Н.Д. Информатика 2000), так и в учебных пособиях. Например, в свежем "Курсе компьютерной технологии с основами информатики" (авторы – О. В. Ефимова, В. В. Морозов, Н. Д. Угринович) учащимся сначала предлагается создать калькулятор в среде Visual Basic, потом "порисовать" самые примитивные геометрические фигуры посредством исполнителя "Черепашка", наделенного управляющими конструкциями алгоритмического языка Ершова, а затем, – снова перейти к решению задач в среде Visual Basic. "Пикантность" такого подхода можно оценить только учтя, что никаких "компьютерных" средств для реализации описанного управления "Черепашкой" при этом не предлагается: вот вам и "теннис по переписке"!

Этот, по мнению автора, методологический просчет мы и собираемся сейчас ликвидировать. Для этого мы создадим пользовательский элемент управления (ПЭУ) по имени Черепашка и, помещая его в экранную форму интегрированной среды Visual Basic 5 (VB5), наделим его всеми управляющими конструкциями этого языка, необходимыми нам для программного управления данным исполнителем.

Кратко о том, что такое ПЭУ

Для совсем не знакомых с языком и интегрированной средой Visual Basic автор рекомендует обратиться к журнальному варианту его пособия "Программирование на языке Visual Basic 5", опубликованному в "Информатике" №№ 23, 28, 31 за 1999 год. Для остальных же напомним основные сведения об элементах управления, поскольку именно такого типа объект мы и будем создавать.

Палитра инструментов (ToolBox ) среды VB5 дает проектировщику возможность использовать помещенные в ней объекты – элементы управления (командные кнопки, поля ввода, ярлыки и т.д.) для формирования визуальной составляющей приложения, обеспечивающей программно-пользовательский интерфейс. Наряду с указанными стандартными для Windows 9x элементами управления, за годы существования Visual-программирования были созданы сотни дополнительных элементов управления, малая часть из которых входит в состав профессиональной и корпоративной редакций VB5, другие же – подключаются путем их инсталляции на клиентском компьютере. Инсталлированные или поставленные вместе с VB5 элементы управления можно добавлять в палитру инструментов "включением" флажка соответствующей ссылки в диалоге ProjectрComponents, вкладка Controls. Такие дополнительные элементы управления, созданные как фирмой Microsoft, так и независимыми производителями, принято называть пользовательскими элементами управления – ПЭУ (иначе – OCX-элементами, элементами управления ActiveX). В версии языка VB5 и последующие включена возможность создания таких элементов средствами самой системы программирования VB5 – с целью их последующего использования как в приложениях, написанных на VB5, так и в офисных продуктах фирмы Microsoft (а также на Web-страницах). Вот такой-то объект – элемент управления, реализующий исполнитель Черепашку и обладающий свойствами и операциями (командами) одноименного исполнителя из указанного "Курса компьютерной технологии", мы и создадим. (Существует и другая возможность получения данного ПЭУ – путем загрузки с домашней страницы автора по адресу: http://margulev.school2.ru, или, благодаря "Электронному факультативу" - из соседнего столбца на его головной странице.

Работа по созданию данного исполнителя, описанная ниже, не предназначена, разумеется, для включения в учебный процесс (по крайней мере на рассматриваемой стадии обучения). Зато после ее выполнения учителем информатики и инсталляции созданного объекта на компьютерах учащихся, те получают возможность размещать данный исполнитель в палитре инструментов VB5. После чего, "беря" его экземпляр (можно и не один!) из палитры инструментов в любое проектируемое на VB5 приложение и наделяя его, тем самым, возможностями программирования посредством управляющих конструкций языка Visual Basic, учащиеся смогут изучать алгоритмические конструкции не бросая изучение объектно-ориентированной технологии в визуальной, событийно-управляемой среде современной системы программирования.

Открытие проекта типа ActiveX Control

Для разработки ПЭУ требуется открыть два проекта, которые образуют при этом группу проектов (Group) . В пером из проектов (типа ActiveX Control) будет создаваться сам ПЭУ, а второй ( обычный, типа Standart EXE) будет использоваться для постоянного тестирования создаваемого элемента.

Итак, открываем новый проект типа ActiveX Control и получаем окно, содержащее формоподобный объект-контейнер класса UserControl. Уменьшим рзмеры нашей будущей Черепашки примерно до 660Х660 твипсов (рис. 1):

 

Изменим имя проекта (Исполнитель_Черепашка) и введем его описание (Черепашка) в окне Project Properties (рис. 2):

 

Описание проекта будет идентифицировать наш ПЭУ после его регистрации в системе в списке диалога Components проекта.

Наконец, изменим в окне свойств имя класса UserControl1 на Cherepashka. Такое имя будет теперь иметь класс нашего ПЭУ в проекте приложения-клиента .

Формирование открытого
интерфейса ПЭУ

Проектируемый элемент управления, как и экранная форма, может нести в себе другие элементы управления, называемые составляющими, формирующие его визуальную составляющую. Но наш ПЭУ не нуждается в составляющих элементах, поэтому мы сразу приступаем к следующему этапу проектирования – формированию открытого интерфейса ПЭУ, для чего воспользуемся услугами мастера интерфейса элемента управления (ActiveX Control Interface Wizard). Вызов этого мастера производится одноименной командой из подменю настроек ( Add-Ins) главного меню. Если этой команды в подменю еще нет, она включается туда путем вызова диалога менеджера настроек: Add-Insр Add-In Manager и установкой в нем флажка в пункте VB ActiveX Control Interface.

Прежде чем запустить указанный мастер, составим таблицу членов класса проектируемого ПЭУ, ориентируясь на свойства и операции (методы объекта – в терминологии VB5 ) Черепашки из упомянутого "Курса компьютерной технологии" (с. 80). К ним мы добавим еще 2 свойства – X0 и Y0 – координаты (относительно внутренних координат экранной формы, в которой мы размещаем "среду обитания" нашей Черепашки) начала координат той локальной системы координат, в которой будет определяться положение Черепашки (таблица 1).

( Автор не без радости отмечает, что и объекты, и их члены можно в VB5 именовать по-русски. Русскоязычными могут быть вообще любые неслужебные идентификаторы! Чем автор и пользовался в свое удовольствие...)

Запускаем мастер и работаем, как обычно, в последовательно сменяющих друг друга по команде Next> диалогах (в любой момент имея возможность вернуться к предшествующим диалогам командой <Back). Заметим, что к услугам этого мастера можно обращаться и позднее – всякий раз, когда мы хотим в процессе проектирования что-то поменять в открытом интерфейсе нашего ПЭУ.

Первый из диалогов вводный. Следующий – .Select Interface Members – позволяет определить так называемые стандартные предоставляемые члены класса. Их набор формируется в правом списке Selected Names; источником же их (откуда можно брать нужное и куда можно отправлять ненужное) является левый список Available Names; для переброски элементов этих списков используются расположенные между ними командные кнопки со знаками ">" и " <". Мы выберем только свойство Picture, определяющее возможность размещения на поверхности ПЭУ какого-либо рисунка, хранимого в виде файла (рис. 3):

 

В следующем диалоге Create Custom Interface Members (Создание пользовательских членов интерфейса) мы и зададим все перечисленные в таблице 1 свойства и методы нашего ПЭУ, используя, однако, не сами их имена, а их латинскую транслитерацию, поскольку с русскими именами мастер не работает. (Но потом мы поменяем эти имена на русские!). Ввод каждого члена класса производим в диалоге Add Custom Member (рис. 4),

 

вызываемого командой
New (рис. 5):

 

Следующий диалог Set Mapping, предназначенный для связывания членов класса Cherepashka проектируемого ПЭУ с членами классов составляющих элементов (к которым относится и контейнер UserControl1), мы пропускаем и переходим к диалогу Set Attributes установки атрибутов для несвязанных членов (рис. 6):
 

В этом диалоге для выделяемых в списке Public Name членов класса, которые, как мы увидим, программно реализуются в виде процедур, задаются такие атрибуты этих процедур как возвращаемые значения (Return Type для методов либо Data Type для свойств), аргументы ( Arguments) – списки параметров этих процедур, желательно с объявлением их типа и ключевым словом ByVal (означающим, что при вызове процедуры аргумент передается данному параметру по значению, а не по ссылке), а также начальные значения реализуемых свойств, если это требуется.

Мы зададим для свойств – пространственных характеристик "черепашки", а также X0 и Y0 тип Single, для свойства Pero_opusheno тип Boolean и начальное значение False, для свойства Tsvet_poverhnosti  тип Long. У методов Vpered, Nazad, Napravo, Nalevo тип аргумента зададим как Single (ByVal s As Single), у Vyberi_tsvet – аргумент с (color) как Long; у метода Proverka_tsveta зададим тип возвращаемого значения Long.

Выполнив в заключительном диалоге команду Finish, мы получим в окне редактирования кода проекта предварительный код (структура такого кода подробно рассмотрена в нашем упомянутом пособии по VB5), который не имеет смысл приводить. Тем более, что мы немедленно начнем его модифицировать: с помощью контекстной замены (EditрReplace рReplace All) поменяем поочередно все транслитерированные имена на их русские оригиналы.

Заметим, что все методы нашего ПЭУ (команды Черепашки) представлены в полученном коде просто процедурными заготовками. Их коды мы напишем в процессе дальнейшей работы над проектом.

Создание тестового проекта

Тестирование – обязательный элемент процесса разработки ПЭУ, аналог отладки обычного приложения.

Для тестирования откроем вспомогательный проект командой FileрAdd Project, выберем стандартный тип проекта, дадим ему имя Тест_Черепашки, а его форме имя Тест. Оба проекта образуют при этом группу, отображаемую в окне проводника проекта; двойным щелчком по соответствующим файлам в этом окне мы будем "перескакивать" в процессе тестирования от ПЭУ к форме и обратно.

Сделаем сохранение файла ПЭУ ( Cherepashka.ctl) и закроем его окно (это будет нужно делать всегда перед переходом к тестовой форме, иначе ПЭУ в форме примет заштрихованный вид, означающий его неподключенность). Перейдя в окно формы Тест и вызвав диалог Components (Ctrl+T), подключим элемент Черепашка включением соответствующего переключателя. Разместим в экранной форме наш ПЭУ, используя появившийся в палитре инструментов характерный значок   пользовательского элемента. Поскольку он сливается при этом с формой, высветлим цвет формы (свойство BackColor), а Черепашке придадим рельеф, установив для ее контейнера (сделав очередной "скачок" в окно ПЭУ) свойство BorderStyle в 1 (Fixed Single – " одноместный номер"). Дополнительно на тестовой форме разместим "среду обитания" исполнителя, установив с помощью элементов Line границы области и оси координат. На осях ярлыками Label укажем задающие масштаб размеры. Для ввода команды разместим элемент TextBox с именем txtCom и для ее исполнения – CommonButton с именем cmdCom; над ними – ярлыки, описывающие их назначение. На рис. 7 представлен примерный вид полученной таким образом экранной формы тестового проекта:

 

Как следует из рисунка, размеры заданной "среды обитания" – 80Х60 условных единиц. Чтобы координаты "черепашки" в форме выражались в тех же единицах, надо:

Визуализация состояния исполнителя

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

На поверхности ПЭУ рисуется белая (свойство ForeColor, устанавливаемое, как и все последующие, в окне свойств Properties) окружность, с черным (свойство FillColor) сплошным (свойство FillStyle = 0 - Solid) заполнением. От ее центра в сторону направления движения рисуется белый радиус, причем точка его пересечения с окружностью имеет красный цвет, когда "перо поднято", и черный – когда исполнитель готов к рисованию. Цвет фона исполнителя будет программно приравниваться цвету фона формы (свойство BackColor). Установив внутренний пользовательский масштаб ПЭУ, задав его размер 30Х30 (значения свойств ScaleHeight и ScaleWidth при ScaleMode=0), выберем радиус окружности 12, толщину линии 4 (свойство DrawWidth). Свойство AutoRedraw, отвечающее за возможность применения графических методов, устанавливаем в True.

Вся эта картинка должна перерисовываться, во-первых, при событии Show (возникающего при воссоздании экземпляра каждой очередной стадии существования ПЭУ), а во-вторых,  – при событии Resize, возникающем при любых изменениях размеров экземпляра ПЭУ, размещенного в форме проекта приложения. Получим следующий код.

Private Sub UserControl_Show()
 With UserControl.Parent
  K = .Width / .ScaleWidth
  If K > .Height / .ScaleHeight Then _
                          K = .Height / .ScaleHeight
  For i = 0 To .Controls.Count - 1
   If TypeOf .Controls(i) Is Cherepashka Then
     UserControl.BackColor = .BackColor
   End If
  Next
 End With
 UserControl_Resize
End Sub

Private Sub UserControl_Resize()
  With UserControl
  If .Picture <> Empty Then .DrawMode = vbNop
  If .ScaleHeight > .ScaleWidth Then
     R = R0 * .ScaleHeight / S0
     Rr = R0 * .ScaleWidth / S0
     D = D0 * .ScaleHeight / S0
  Else
     R = R0 * .ScaleWidth / S0
     Rr = R0 * .ScaleHeight / S0
     D = D0 * .ScaleWidth / S0
  End If
  If D < 1 Then D = 1
  Q = .ScaleHeight / .ScaleWidth
  x1 = .ScaleWidth / 2
  x2 = .ScaleWidth / 2
  y1 = 0
  y2 = .ScaleHeight / 2
  .DrawWidth = D
  .Cls
 End With
 Circle (UserControl.ScaleWidth / 2, _
          UserControl.ScaleHeight / 2), R - 1, , , , Q
 Line (x1, y1)-(x2, y2)
 PSet (x1, y1), vbRed
 Расчет_координат
End Sub

Private Sub Расчет_координат()
 With UserControl.Parent
  For i = 0 To .Controls.Count - 1
   If TypeOf .Controls(i) Is Cherepashka Then
    .Controls(i).X = .Controls(i).Left - X0
    .Controls(i).Y = Y0 - .Controls(i).Top
   End If
  Next
  .Refresh
 End With
End Sub

Сделаем по приведенному коду ряд замечаний.

  1. Ряд используемых в данном и последующих фрагментах кода переменных и констант объявлены на уровне модуля. Поэтому приведем также и код этих объявлений, содержащихся в секции General окна кода (помимо тех объявлений, которые были созданы ранее мастером интерфейса).
  2. DefSng K-Z
    Dim i As Long, _
      D As Integer 'Ширина рисующей линии в ПЭУ
    Dim x1, y1, x2, y2 'Координаты текущей точки в ПЭУ
    Dim R, Rr, Q 'Большая, малая стороны ПЭУ и их отношение
    Const S0 = 30 'Сторона UserControl
    Const R0 = 14 'Радиус окружности в UserControl
    Const D0 = 4 'Ширина рисующей линии в UserControl
    Const RAD = 3.1415927 / 180 'Коэффициент пересчета _
                                      градусов в радианы
    

  3. Свойство Parent возвращает объект, представляющий контейнер, в котором будет размещен проектируемый ПЭУ (разумеется, это будет экранная форма – заготовка окна приложения, создаваемого пользователем Черепашки). Через это свойство мы сможем обращаться уже в коде класса к свойствам и методам этого будущего контейнера.
  4. Через объект-контейнер Parent мы имеем доступ к семейству Controls всех элементов управления, размещенных в контейнере вместе с ПЭУ. Перебирая их в цикле так же, как если бы семейство Controls представляло собой массив элементов, мы проверяем их тип ( TypeOf) на принадлежность к классу Cherepashka и, в случае совпадения, производим с размещенным в контейнере экземпляром ПЭУ требуемые операции.

Заново переразместим элемент Cherepashka в тестовой форме (рис. 8):

 

Программирование методов ПЭУ

Основная проблема, возникающая при программировании методов создаваемого класса Cherepashka, состоит в том, мы из процедур класса (то есть шаблона будущих экземпляров объекта) должны иметь доступ к свойствам этих еще не размещенных экземпляров. В частности, чтобы перемещать будущий экземпляр, нужно иметь доступ к значениям его свойств Left и Top ( координатам верхнего левого угла Черепашки в будущей экранной форме, которым та и будет "рисовать"). Способ, предложенный выше (поиск объектов, принадлежащих классу Cherepashka), не годится, так как если в форме размещается более одного экземпляра нашего ПЭУ, то вызов метода любого из них распространит свое действие и на все остальные. Поэтому используем другой прием, основанный на методе SetFocus, обеспечивающем активность вызвавшего его экземпляра. В этом случае доступ к этому экземпляру можно получить через свойство ActiveControl объекта Parent, указывающее на активный (находящийся "в фокусе") в данный момент экземпляр. (Надо только учесть, что метод SetFocus не действует на невидимые объекты, поэтому свойство Visible размещенных Черепашек всегда должно быть в значении True.)

Приводим коды методов Черепашки и вспомогательных процедур Расчет_координат и Поворот.

Public Function Вперед(ByVal S As Single)
 As Variant
 SetFocus
 With UserControl.Parent.ActiveControl
  .Left = .Left + S * Sin(Угол * RAD)
  .Top = .Top - S * Cos(Угол * RAD)
  .Цвет_поверхности = .Проверка_цвета
  If .Перо_опущено = True Then
   UserControl.Parent.Line -(.Left, .Top)
  End If
 End With
 Расчет_координат
End Function

Public Function Назад(ByVal S As Single) As Variant
 SetFocus
 With UserControl.Parent.ActiveControl
  .Left = .Left - S * Sin(Угол * RAD)
  .Top = .Top + S * Cos(Угол * RAD)
  .Цвет_поверхности = .Проверка_цвета
  If .Перо_опущено = True Then
   UserControl.Parent.Line -(.Left, .Top)
  End If
 End With
 Расчет_координат
End Function

Public Function Направо(ByVal S As Single) As Single
 Угол = Угол + S
 Поворот Угол
End Function

Public Function Налево(ByVal S As Single) As Single
 Угол = Угол - S
 Поворот Угол
End Function

Public Function Проверка_цвета(ByVal Color As Long) _
                                              As Long
 SetFocus
 With UserControl.Parent.ActiveControl
  Проверка_цвета = _
                 UserControl.Parent.Point(.Left, .Top)
 End With
End Function

Public Function Опусти_перо() As Variant
 SetFocus
 With UserControl.Parent.ActiveControl
  .Перо_опущено = True
  .Цвет_поверхности = .Проверка_цвета
  UserControl.PSet (x1, y1), vbBlack
  UserControl.Parent.PSet (.Left, .Top)
 End With
End Function

Public Function Подними_перо() As Variant
 SetFocus
 With UserControl.Parent.ActiveControl
  .Перо_опущено = False
 UserControl.PSet (x1, y1), vbRed
 UserControl.Parent.PSet (.Left, .Top), .Цвет_поверхности
 End With
End Function

Public Function Выбери_цвет(ByVal Color As Long) As Variant
 SetFocus
 UserControl.Parent.ForeColor = Color
End Function

Private Sub Расчет_координат()
 With UserControl.Parent
  For i = 0 To .Controls.Count - 1
   If TypeOf .Controls(i) Is Cherepashka Then
    .Controls(i).X = .Controls(i).Left - X0
    .Controls(i).Y = Y0 - .Controls(i).Top
   End If
  Next
  .Refresh
 End With
End Sub

Private Sub Поворот(ByVal a As Single)
 SetFocus
 With UserControl
  x1 = .ScaleWidth / 2 + Rr * Sin(a * RAD)
  x2 = .ScaleWidth / 2
  y1 = .ScaleHeight / 2 - Rr * Cos(a * RAD)
  y2 = .ScaleHeight / 2
 End With
 Circle (x2, y2), R - 1, , , , Q
 Line (x1, y1)-(x2, y2)
 If UserControl.Parent.ActiveControl.Перо_опущено = _
                                           False Then
  PSet (x1, y1), vbRed
 End If
End Sub

И напоследок, добавим вызов функции Расчет_координат в конец процедур изменений значений свойств (Property Let) X0 и Y0. Тогда мы сможем наблюдать текущие координаты X и Y Черепашки прямо в окне свойств сразу после установки в этом окне значений X0, Y0. Вот, в частности, каким будет код одной из этих двух процедур после указанного добавления.

Public Property Let X0(ByVal New_X0 As Single)
    m_X0 = New_X0
    PropertyChanged "X0"
    Расчет_координат 'Этот вызов мы и добавили
End Property

Отладка ПЭУ в тестовой форме

Для начала убедимся, что мы можем помещать в отладочную форму любое количество Черепашек, менять их размер без ущерба для графических элементов на их поверхностях, а также задавать, через свойство Picture в окне свойств, вместо этих графических элементов – картинки (например – черепаху из пакета MS Office: Clipart\Popular\turtle.wmf) – рис. 9:

 
После этого начнем проверку управляемости.

Установим свойство AutoRedraw отладочной формы в True и толщину линии DrawWidth=2 . Для вызова методов, соответствующих одноименным, вводимым в поле ввода командам, используем следующий код обработчика события Click командной кнопки.

Private Sub cmdCom_Click()
Dim a As Single, s As Integer
 s = Len(txtCom.Text) - InStr(4, txtCom.Text, " ")
 If s < Len(txtCom.Text) Then
  If Left(txtCom.Text, 3) = "Выб" Then
   a = CLng(Right(txtCom.Text, s))
  Else
   a = CSng(Right(txtCom.Text, s))
  End If
 End If
 Select Case Left(txtCom.Text, 3)
  Case "Наз"
   ч.Назад a
  Case "Впе"
   ч.Вперед a
  Case "Нал"
   ч.Налево a
  Case "Нап"
   ч.Направо a
  Case "Опу"
   ч.Опусти_перо
  Case "Под"
   ч.Подними_перо
  Case "Выб"
   ч.Выбери_цвет a
  Case "Про"
   MsgBox "Текущий цвет поверхности " & _
                               CStr(ч.Проверка_цвета)
  Case Else
   MsgBox "Неправильная команда!"
 End Select
End Sub

Как мы видим, в коде процедуры использована инструкция множественного выбора Select Case, позволяющая по трем первым буквам вводимой в поле ввода команды осуществлять выбор нужного метода из альтернативных возможностей, задаваемых Case-ветвями. Подробности об использованных функциях работы со строками Len, Left, Right, InStr можно узнать из справочной системы. Функции CSng, CLng и CStr используются для преобразования их аргументов к типам Single, Long и String соответственно. Отметим, что цвет, представляющий данное типа Long, принято задавать шестнадцатеричной константой (префикс &h) , причем каждая из трех пар шестнадцатеричных цифр задает интенсивность одной из трех составляющих используемой цветовой модели RGB (красный-зеленый-голубой); красной составляющей соответствуют два младших разряда константы. (Внутри же программного кода цвет можно задавать и с помощью констант VB5, например, vbBlack, vbRed и т.д. ).

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

Опусти_перо
Направо 60
Вперед 20
Налево 30
Выбери_цвет &h0000ff
Назад 30

Отлаженный ПЭУ можно откомпилировать, получив файл с расширением OCX, и даже подготовить к распространению, создав дистрибутив ПЭУ мастером Application Setup Wizard, запускаемым из программной группы Microsoft Visual Basic главного меню.

Программирование Черепашки

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

Откроем демонстрационный проект с крупногабаритной экранной формой и внутренними размерами 900Х600 пользовательских единиц. Не забудем проверить, подключена ли Черепашка (диалог Components пункта Project главного меню). Установим Черепашку (с картинкой) достаточно маленького размера, чтобы не слишком загораживать рисуемые линии. Зададим Черепашке начало координат "среды обитания" в точке (450, 300) и установим проходящие через него оси, а также командную кнопку Пуск (рис. 11). Как и в тестовой форме, будем размещать коды программных фрагментов в обработчике события Click для этой кнопки.

Вот, например, как будет выглядеть запись циклического алгоритма по рисованию квадрата, приведенного на алгоритмическом языке Ершова в упомянутом "Курсе компьютерной технологии":

ч.Опусти_перо
ч.Выбери_цвет vbBlack
For i = 1 To 4
  ч.Вперед 100
  ч.Направо 90
Next
ч.Подними_перо

Одновременно можно изучить и организацию циклической структуры с помощью таймера. Элемент Timer , взятый из палитры инструментов, возбуждает событие Timer через промежуток времени, задаваемый его свойством Interval (в миллисекундах), все время, пока его свойство Enabled истинно. Регулируя значение Interval и величину перемещения Черепашки при каждом срабатывании таймера, можно организовать плавное движение Черепашки с той или иной скоростью. А возможно и совместное движение нескольких Черепашек с разными скоростями.

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

Private Sub Form_Load() 'Закрашиваем черным 
часть формы
 DrawWidth = 80
 ForeColor = vbBlack
 Line (450, 240)-(800, 240)
 DrawWidth = 3
End Sub

Private Sub cmd1_Click() 'Запускаем таймер (Interval=10)
 tmr1.Enabled = True
End Sub

Private Sub tmr1_Timer() 'Пошаговое рисование
 ч.Опусти_перо
 ч.Вперед 5
 If ч.Цвет_поверхности = vbBlack Then
  ч.Выбери_цвет vbWhite
 Else
  ч.Выбери_цвет vbBlack
 End If
 ч.Подними_перо
End Sub

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

 

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

Вот программный код этой задачи (при одной "собаке"):

DefSng L-Z
Dim фи As Single, s, u
Const GRAD = 180 / 3.1419527
Private Sub cmd1_Click()
 лиса.Налево 90
 s = (лиса.X - собака.X) / (лиса.Y - собака.Y)
 u = Atn(s) * GRAD
 собака.Направо u
 tmr1.Enabled = True
End Sub

Private Sub tmr1_Timer()
 собака.Опусти_перо
 собака.Вперед 5
 лиса.Опусти_перо
 лиса.Вперед 5
 s = (лиса.X - собака.X) / (лиса.Y - собака.Y)
 u = Atn(s) * GRAD
 фи = u - собака.Угол
 собака.Направо фи
 собака.Подними_перо
 лиса.Подними_перо
End Sub

Private Sub cmd1_Click()
 лиса.Налево 90
 s = (лиса.X - собака.X) / (лиса.Y - собака.Y)
 u = Atn(s) * GRAD
 собака.Направо u
 tmr1.Enabled = True
End Sub

Private Sub tmr1_Timer()
 собака.Опусти_перо
 собака.Вперед 5
 лиса.Опусти_перо
 лиса.Вперед 5
 s = (лиса.X - собака.X) / (лиса.Y - собака.Y)
 u = Atn(s) * GRAD
 фи = u - собака.Угол
 собака.Направо фи
 собака.Подними_перо
 лиса.Подними_перо
End Sub

На втором этапе использования Черепашки будем разрабатывать и реализовывать в виде процедур вспомогательные алгоритмы, расширяющие систему команд исполнителя. От уже имеющихся у исполнителя команд их будет отличать только способ вызова: не через навигационную точку после имени объекта – Объект.Команда аргументы, – а наоборот, с именем объекта в качестве первого аргумента – Команда Объект,  Другие_аргументы. Например, вызовы команд рисования Черепашкой ч1 окружности ( или правильного многоугольника) по координатам центра и радиусу (или числу сторон) могли бы выглядеть так:

Окружность ч1, x, y, r
Многоугольник ч1, x, y, n

Отлаженные процедуры-команды имеет смысл накапливать в отдельном модуле кода (файл с расширением .BAS), комплектующем Черепашку.

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

Private Sub Вращение(ч As Cherepashka,
 ш As Single, _
  ByVal ф As Single, Optional ByVal фмакс As Single = 360, _
                  Optional ByVal шаг_спирали As Single = 0)
'ш - шаг Черепашки (сторона многоугольника)
'ф - угол поворота на каждом шаге
'фмакс - суммарный поворот (размер дуги), 360° по умолчанию
'шаг_спирали - на него увеличивается на каждом шагу 
                            'шаг Черепашки, 0 по умолчанию
'Static s As Single
 ч.Направо ф
 ч.Вперед ш
 s = s + ф
 If s < фмакс Then
  Вращение ч, ш + шаг_спирали, ф, фмакс, шаг_спирали
 Else
  s = 0
 End If
End Sub

В данной процедуре, как видно, использована еще одна форма организации циклического алгоритма  – рекурсивный вызов функции. Вызываем эту команду с различными значениями аргументов:

Private Sub cmd1_Click()
 ч1.Опусти_перо
 Вращение ч1, 5, 5
 ч2.Опусти_перо
 Вращение ч2, 60, 72
 ч3.Опусти_перо
 Вращение ч3, 5, 20, 1800, 0.5
 ч4.Опусти_перо
 Вращение ч4, 150, 156, 7200
 ч5.Опусти_перо
 Вращение ч5, 5, 120, 3600, 5
End Sub

Результаты исполнения этой команды 5-ю Черепашками приведены на рис. 13.

 

Заключение

Если уважаемый читатель проникся, вслед за автором, осознанием методологических достоинств описанного исполнителя с открытой системой команд, но его пугают возможные трудности при воссоздании Черепашки у себя на компьютере  – воспользуйтесь вашим Internet-навигатором и щелкнете по картинке с черепашкой на упомянутой домашней странице автора. Откройте загружаемый файл с расширением .CAB и вы увидите в нем файл с расширением .OCX (это и есть Черепашка). Выполните команду Извлечь (например, двойным щелчком по этому файлу) и сохраните его в папке Windows\System. Открыв проект, в диалоге References посредством команды Browse добавьте ссылку на файл с Черепашкой, но флажок в добавленной ссылке снимите. После этого, в диалоге Components на вкладке Controls взведите флажок в ссылке на Черепашку.

Черепашка в палитре инструментов ждет ваших команд!