От переменных – к параметрам
Мы видим, что на рисунке деревья находятся в разных местах и имеют разный размер. Значит мы должны создать параметры, управляющие местоположением и размером дерева. Начнем с местоположения. Параметры местоположения дерева. Очевидно, положением дерева на форме управляют только две переменные: x – по горизонтали и y – по вертикали. Превратим их в параметры. Превратить переменную в параметр – это значит просто переписать ее объявление из тела процедуры в заголовок процедуры: Private Sub Рисуем_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Рисуем.Click Гр = Me.CreateGraphics Дерево(50, 20) Дерево(150, 40) End Sub
Sub Дерево(ByVal x As Single, ByVal y As Single) Dim Ширина_кроны As Single = 20 Dim Высота_кроны As Single = 60 Dim Длина_ствола As Single = 15 Гр.FillEllipse(Brushes.Green, x, y, Ширина_кроны, Высота_кроны) Гр.DrawEllipse(Pens.Black, x, y, Ширина_кроны, Высота_кроны) Гр.DrawLine(Pens.Black, x + Ширина_кроны / 2, y + Высота_кроны, _ x + Ширина_кроны / 2, y + Высота_кроны + Длина_ствола) End Sub Теперь, щелкнув по кнопке, вы увидите два дерева в разных местах. Уменьшаем число переменных. Размерами дерева в процедуре управляют три переменные: Ширина_кроны, Высота_кроны и Длина_ствола. Очень гибко, но многовато переменных. Хорошо бы вместо трех иметь одну переменную, определяющую размер дерева. Чтобы это сделать, придумаем математическую зависимость между тремя переменными. Посмотрим на их значения: 20, 60 и 15. Мы видим, что ширина кроны меньше высоты в 3 раза, а длина ствола – в 4 раза. Зададим новую переменную Размер. Пусть ее величина будет равна высоте кроны. Посмотрите, как упростится теперь наша процедура: Sub Дерево(ByVal x As Single, ByVal y As Single) Dim Размер As Single = 60 Гр.FillEllipse(Brushes.Green, x, y, Размер / 3, Размер) Гр.DrawEllipse(Pens.Black, x, y, Размер / 3, Размер) Гр.DrawLine(Pens.Black, x + Размер / 6, y + Размер, x + Размер / 6, y + Размер + Размер / 4) End Sub Благодаря запрограммированной нами связи между шириной и высотой кроны и длиной ствола, при изменении значения переменной Размер пропорции между частями дерева не изменятся. Параметр размера дерева. А теперь превратим переменную Размер в параметр: Private Sub Рисуем_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Рисуем.Click Гр = Me.CreateGraphics Дерево(50, 20, 200) Дерево(150, 50, 100) Дерево(200, 70, 40) End Sub
Sub Дерево(ByVal x As Single, ByVal y As Single, ByVal Размер As Single) Гр.FillEllipse(Brushes.Green, x, y, Размер / 3, Размер) Гр.DrawEllipse(Pens.Black, x, y, Размер / 3, Размер) Гр.DrawLine(Pens.Black, x + Размер / 6, y + Размер, x + Размер / 6, y + 5 * Размер / 4) End Sub Теперь, щелкнув по кнопке, вы увидите три дерева в разных местах и разных размеров. Процедура «Фонарь». Процедуру Фонарь в качестве упражнения сделайте сами. Параметры пусть будут такие же, как и у дерева. Вот что получилось у меня: Sub Фонарь(ByVal x As Single, ByVal y As Single, ByVal Размер As Single) Гр.FillRectangle(Brushes.Gold, x, y, Размер / 30, Размер) 'Столб Гр.DrawRectangle(Pens.Black, x, y, Размер / 30, Размер) 'Черный контур для столба Гр.FillPie(Brushes.DarkOrange, x + Размер / 30, y, Размер / 5, Размер / 10, 180, 180) 'Плафон Гр.DrawPie(Pens.Black, x + Размер / 30, y, Размер / 5, Размер / 10, 180, 180) 'Черный контур для плафона End Sub Вам не кажется, что, несмотря на наши старания, чисел в процедуре осталось многовато? В общем-то, да. В принципе, всех их надо было превратить в переменные. Но я не захотел затемнять изложение излишними подробностями. А теперь забегите немного вперед и напишите в теле процедуры Рисуем_Click пять операторов для рисования трех одиночных деревьев и двух одиночных фонарей над прудом примерно в тех местах и тех размеров, что вы видите на рисунке. Получилось? – Прекрасно! А теперь уберите из проекта этих пятерых выскочек, они нарушают стройный и размеренный шаг нашей бронированной армии. Но не уничтожайте их, переместите куда-нибудь или закомментируйте: они вам еще пригодятся. Делим задачу на части То, что мы сейчас делали – это учились писать процедуры с параметрами. Но мы еще не приступали к программированию нашего проекта как целого. Процедура Рисуем_Click у нас практически пуста. И вот теперь мы приступаем к планомерной осаде этой крепости. Когда Наполеон встречал превосходящего по силам врага, он бил его армию по частям. Когда программисту нужно решить сложную задачу, он делит ее на части и программирует каждую часть по-отдельности. Легко сказать – делит. А как ее разделить, если все в задаче перепутано и взаимосвязано. Здесь, конечно, помогают программистский опыт и мастерство. А если их пока еще нет? Тогда можно руководствоваться соображениями здравого смысла и общей «понятности» разбиения на части. В нашем случае разбиение напрашивается само собой: посмотри, из каких крупных кусков сделан пейзаж – на то и дели! Причем нужно примириться с тем, что мы можем пока и не представлять, как каждый из этих кусков запрограммировать. Перечислим, что мы видим на рисунке: · Звездное небо · Месяц · Земля · Пруд · Три одиночных дерева · Два одиночных фонаря · Ряд деревьев (на горизонте) · Ряд фонарей (на горизонте) · Аллея (состоящая из двух рядов деревьев и одного ряда фонарей)
Так разделил бы любой прохожий с улицы, ничего не ведающий о программировании. Удивитесь ли вы, если я скажу, что мнение этого прохожего я посчитаю истиной в последней инстанции и именно такие процедуры пользователя обязуюсь создать? Вот как примерно будет выглядеть в окончательном виде главная процедура рисования: Private Sub Рисуем_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Рисуем.Click Гр = Me.CreateGraphics Звездное_небо() Месяц() Земля() Пруд() Три_одиночных_дерева() Два_одиночных_фонаря() Ряд_деревьев() Ряд_фонарей() Аллея() End Sub Почему я послушался прохожего? Потому что он делил по принципу: как проще и очевидней. А это великий принцип. Будем и мы ему следовать. Потому что: Понятная программа – правильная программа! Не изящная, не замысловатая, не сверхкороткая, а именно понятная! Заставляйте компьютер думать так, как привычно человеку, а не наоборот. Потому что наоборот гены не позволят. Пока я у всех этих процедур не указал параметров. Но если вдруг выяснится, что параметры нужны, мы их, конечно, создадим. Почему я выбрал именно такой порядок рисования? Можно было бы выбрать и любой другой, только надо помнить, что фигуры, нарисованные, раньше, загораживаются фигурами, нарисованными позже, поэтому одиночные деревья, например, нельзя рисовать раньше пруда.
Популярное: Почему стероиды повышают давление?: Основных причин три... Как выбрать специалиста по управлению гостиницей: Понятно, что управление гостиницей невозможно без специальных знаний. Соответственно, важна квалификация... ©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (508)
|
Почему 1285321 студент выбрали МегаОбучалку... Система поиска информации Мобильная версия сайта Удобная навигация Нет шокирующей рекламы |