Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Понятно о Visual Basic.NET. Самоучитель.Ч2.2005...docx
Скачиваний:
46
Добавлен:
25.11.2019
Размер:
4.02 Mб
Скачать
      1. Делим задачу на части

То, что мы сейчас делали – это учились писать процедуры с параметрами. Но мы еще не приступали к программированию нашего проекта как целого. Процедура Рисуем_Click у нас практически пуста. И вот теперь мы приступаем к планомерной осаде этой крепости.

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

Легко сказать – делит. А как ее разделить, если все в задаче перепутано и взаимосвязано. Здесь, конечно, помогают программистский опыт и мастерство. А если их пока еще нет? Тогда можно руководствоваться соображениями здравого смысла и общей «понятности» разбиения на части. В нашем случае разбиение напрашивается само собой: посмотри, из каких крупных кусков сделан пейзаж – на то и дели! Причем нужно примириться с тем, что мы можем пока и не представлять, как каждый из этих кусков запрограммировать.

Перечислим, что мы видим на рисунке:

  • Звездное небо

  • Месяц

  • Земля

  • Пруд

  • Три одиночных дерева

  • Два одиночных фонаря

  • Ряд деревьев (на горизонте)

  • Ряд фонарей (на горизонте)

  • Аллея (состоящая из двух рядов деревьев и одного ряда фонарей)

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

Private Sub Рисуем_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Рисуем.Click

Гр = Me.CreateGraphics

Звездное_небо()

Месяц()

Земля()

Пруд()

Три_одиночных_дерева()

Два_одиночных_фонаря()

Ряд_деревьев()

Ряд_фонарей()

Аллея()

End Sub

Почему я послушался прохожего? Потому что он делил по принципу: как проще и очевидней. А это великий принцип. Будем и мы ему следовать. Потому что:

Понятная программа – правильная программа!

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

Пока я у всех этих процедур не указал параметров. Но если вдруг выяснится, что параметры нужны, мы их, конечно, создадим.

Почему я выбрал именно такой порядок рисования? Можно было бы выбрать и любой другой, только надо помнить, что фигуры, нарисованные, раньше, загораживаются фигурами, нарисованными позже, поэтому одиночные деревья, например, нельзя рисовать раньше пруда.

      1. Программируем части по-отдельности

Ну что ж. Начинаем программировать отдельные части. В каком порядке? Все равно. Но логичнее в том порядке, в каком они появляются на рисунке, а значит в порядке сверху-вниз в теле главной процедуры рисования. Следовательно, начинаем со звездного неба.

Вы спросите, а как же наши процедуры Дерево и Фонарь, над которыми мы так долго трудились? Неужели они не понадобятся? Понадобятся в свое время, причем в полном объеме.

Звездное небо. Прежде чем рисовать звездное небо, надо задать, на каком уровне по вертикали кончается небо и начинается земля. Если мы зададим этот уровень числом, то наверняка это число встретится также при рисовании на горизонте деревьев и фонарей, а может быть и в других процедурах. Так что надо задать это число переменной величиной, а чтобы этой переменной могли пользоваться все процедуры, объявим ее не в теле процедуры, а вне процедур.

Поскольку звездное небо вы уже раньше рисовали, то дальнейшие пояснения не требуются. Вот какое у меня получилось на этом этапе окно кода:

Public Class Form1

Inherits System.Windows.Forms.Form

Windows Form Designer generated code

Dim Гр As Graphics

Dim Уровень_горизонта As Single = 200

Private Sub Рисуем_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Рисуем.Click

Гр = Me.CreateGraphics

Звездное_небо()

End Sub

Sub Звездное_небо()

Dim i, Размер_звезды As Single

Гр.FillRectangle(Brushes.Black, 0, 0, Me.Width, Уровень_горизонта) 'Черный прямоугольник неба

For i = 1 To 100 'Рисуем сто звезд

Размер_звезды = 5 * Rnd()

Гр.FillEllipse(Brushes.White, _

Me.Width * Rnd(), Уровень_горизонта * Rnd(), Размер_звезды, Размер_звезды)

Гр.FillEllipse(Brushes.Yellow, _

Me.Width * Rnd(), Уровень_горизонта * Rnd(), Размер_звезды, Размер_звезды)

Гр.FillEllipse(Brushes.LightBlue, _

Me.Width * Rnd(), Уровень_горизонта * Rnd(), Размер_звезды, Размер_звезды)

Гр.FillEllipse(Brushes.LightPink, _

Me.Width * Rnd(), Уровень_горизонта * Rnd(), Размер_звезды, Размер_звезды)

Next i

End Sub

End Class

Небо – это просто большой черный прямоугольник во всю ширину формы выше уровня горизонта. Мы не видим его краев, так как они совпадают с краями формы или выходят за них После нажатия на кнопку рисования мы увидим черный прямоугольник неба, заполненный разноцветными звездами.