Студопедия

Главная страница Случайная страница

КАТЕГОРИИ:

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Записываем программу целиком






Пока у вас на экране – правильно работающий «скелет» программы. Наша задача – постепенно наполнить этот скелет мышцами.

Ниже вы можете посмотреть готовую программу мультфильма. А сейчас я поясню порядок ее написания, отладки и отдельные трудные места.

При работе на компьютере ни в коем случае не вводите сразу всю программу из сотни строк, чтобы потом, запустив ее, не схватиться за голову! Почему? Потому что профессиональный программист в среднем допускает одну описку или ошибку в 10 строках. Значит, в вашей программе будет порядка 10 опечаток или ошибок. Все 10 сразу вы не найдете и за сутки. Потому что сразу 10 ошибок искать в 100 раз труднее, чем 10 раз по одной. Хорошо, если вам одновременно врет только один человек. А если вам в уши одновременно врут 10 человек, и все по-разному?

Поэтому, следуя не спеша за материалом этого параграфа, действуйте в таком порядке.

Прочтите часть материала, посвященную горизонту (она чуть ниже). Введите в программу строки, необходимые для рисования горизонта: Прежде всего в раздел VAR нужно добавить описание y_goriz. Затем введите строку y_goriz: =240. Затем строку Line (0, y_goriz, 640, y_goriz). Запустите программу. Если горизонт на месте и все в порядке, сверьтесь с текстом программы в учебнике и сотрите репортаж горизонта о своей работе.

Все. С горизонтом разделались. Что дальше должно рисоваться на экране? Синева. Введите пару строк про синеву. Запустите программу. Все в порядке, сверьтесь с текстом. Сотрите репортаж синевы.

И так далее. Вводите за один раз не больше одной-двух строк, после чего запускайте программу и смотрите, как она работает.

Старайтесь не списывать с учебника, а придумывайте программу сами, с учебником только сверяясь.

 

А теперь приступим к объяснениям в самой программе.

Поскольку у нас первым будет рисоваться горизонт из процедуры Пейзаж, с него и начнем. Я буду исходить из того, что размер вашего экрана - 640´ 480. Если другой, то вам нетрудно будет внести изменения в текст моей программы.

Пусть горизонт делит экран пополам. Тогда подойдет оператор Line(0, 240, 640, 240). Посмотрим, какие числа здесь целесообразно заменить переменными величинами. Числа 0 и 640 нам менять не понадобится, а вот высоту горизонта мы вполне можем захотеть изменить. Придумаем переменную величину y_goriz и поставим ее вместо числа 240. У нас вместо одного оператора получится пара:

y_goriz: =240;

Line (0, y_goriz, 640, y_goriz)

Оператор y_goriz: =240 я помещу в начало раздела операторов, так как значение y_goriz понадобится и части Звезды и процедуре Летающая тарелка и мало ли кому еще может понадобиться.

Части Синева, Луна, Звезды понятны без пояснений. Попробуем теперь сделать процедуру Дерево. Начнем с того дерева, что в левом нижнем углу:

PROCEDURE Tree;

BEGIN

SetColor(White);

{Рисуем крону: }

Ellipse (100, 400, 0, 360, 15, 30);

SetFillStyle(1, LightGreen);

FloodFill(100, 400, White);

{Рисуем ствол: }

Rectangle (97, 430, 103, 460);

SetFillStyle(1, Brown);

FloodFill(100, 440, White);

END;

Сделаем переменными все величины, от которых зависит местоположение дерева, а величины, от которых зависят форма и размеры, для простоты трогать не будем. Будем считать “координатами дерева” координаты центра эллипса, образующего крону. Придумаем им имена x_tree и y_tree и от них будем отсчитывать все остальные координаты дерева. Тогда процедура будет выглядеть так:

PROCEDURE Tree;

BEGIN

SetColor(White);

{Рисуем крону: }

Ellipse (x_tree, y_tree, 0, 360, 15, 30);

SetFillStyle(1, LightGreen);

FloodFill(x_tree, y_tree, White);

{Рисуем ствол: }

Rectangle (x_tree - 3, y_tree + 30, x_tree + 3, y_tree + 60);

SetFillStyle(1, Brown);

FloodFill (x_tree, y_tree + 40, White);

END;

Теперь для того, чтобы дерево было нарисовано в нужном месте, нужно перед выполнением процедуры Tree присвоить координатам дерева нужные значения: x_tree: = 100, y_tree: = 400. В программе процедура выполняется три раза, причем каждый раз перед ее выполнением координатам дерева присваиваются разные значения.

Аналогично составляем процедуру Дом. Сначала напишем ее без переменных:

PROCEDURE House;

BEGIN

SetColor(White);

{Рисуем стену: }

Rectangle (300, 400, 340, 440);

SetFillStyle(1, LightBlue);

FloodFill (301, 401, White);

{Рисуем окно: }

Rectangle (315, 410, 325, 420);

SetFillStyle(1, DarkGray);

FloodFill (320, 415, White);

{Рисуем крышу: }

Line(295, 400, 345, 400);

Line(295, 400, 320, 370);

Line(345, 400, 320, 370);

SetFillStyle(1, Red);

FloodFill (320, 399, White);

END;

Выберем левый верхний угол стены точкой начала отсчета. Ее координаты x_house: =300; y_house: =400. Окончательный вид процедуры House вы можете видеть в программе.

Вот полный текст программы:

USES Graph, CRT;

VAR Device, Mode, i: Integer;

y_goriz, x_tree, y_tree, x_house, y_house,

x_tar, y_tar, shirina_tar, visota_tar: Integer;

 

PROCEDURE Tree;

BEGIN

SetColor(White);

{Рисуем крону: }

Ellipse (x_tree, y_tree, 0, 360, 15, 30);

SetFillStyle(1, LightGreen);

FloodFill(x_tree, y_tree, White);

{Рисуем ствол: }

Rectangle (x_tree - 3, y_tree + 30, x_tree + 3, y_tree + 60);

SetFillStyle(1, Brown);

FloodFill (x_tree, y_tree + 40, White);

END;

 

PROCEDURE House;

BEGIN

SetColor(White);

{Рисуем стену: }

Rectangle (x_house, y_house, x_house+40, y_house+40);

SetFillStyle(1, LightBlue);

FloodFill (x_house+1, y_house+1, White);

{Рисуем окно: }

Rectangle (x_house+15, y_house+10, x_house+25, y_house+20);

SetFillStyle(1, DarkGray);

FloodFill (x_house+20, y_house+15, White);

{Рисуем крышу: }

Line(x_house-5, y_house, x_house+45, y_house);

Line(x_house-5, y_house, x_house+20, y_house-30);

Line(x_house+45, y_house, x_house+20, y_house-30);

SetFillStyle(1, Red);

FloodFill (x_house+20, y_house-1, White);

END;

 

PROCEDURE Landscape;

BEGIN

{ горизонт: }

Line(0, y_goriz, 640, y_goriz);

{ синева: }

SetFillStyle(1, Blue);

FloodFill(10, 10, White);

{ луна: }

SetColor(Yellow);

Circle(500, 100, 30);

SetFillStyle(1, Yellow);

FloodFill(500, 100, Yellow);

{ звезды: }

for i: =1 to 100 do PutPixel (Random(640), Random(y_goriz), Random(16));

{Три дерева: }

x_tree: =100; y_tree: =400; Tree;

x_tree: =300; y_tree: =300; Tree;

x_tree: =550; y_tree: =380; Tree;

{Два дома: }

x_house: =300; y_house: =400; House;

x_house: =470; y_house: =300; House;

{ трава: }

SetFillStyle(1, Green);

FloodFill(10, 470, White);

END;

 

PROCEDURE Music;

BEGIN

Sound(200); Delay(1000);

Sound(500); Delay(1000);

Sound(300); Delay(1000);

NoSound

END;

 

PROCEDURE Flying_Saucer;

BEGIN

{Задаем начальные координаты летающей тарелки и ее размеры.

Их не обязательно задавать в начале раздела операторов, так как они

больше никакой процедуре не нужны}

x_tar: =100; y_tar: =40; shirina_tar: =30; visota_tar: =15;

repeat {Цикл движения тарелки }

SetColor(White);

Ellipse (x_tar, y_tar, 0, 360, shirina_tar, visota_tar);

Delay(20); {Чтобы замедлить движение }

SetColor(Blue);

Ellipse (x_tar, y_tar, 0, 360, shirina_tar, visota_tar);

y_tar: =y_tar+1

until y_tar > y_goriz;

{Прорисовываем последний раз тарелку на горизонте: }

SetColor(White);

Ellipse (x_tar, y_tar, 0, 360, shirina_tar, visota_tar);

END;

 

BEGIN

Device: =0;

InitGraph(Device, Mode, '< путь к граф.драйверам> ’);

y_goriz: =240;

Landscape; { рисуем пейзаж }

Delay(3000); { пауза три секунды }

Music; { музыка }

Flying_Saucer; { движение тарелки }

Music; { музыка }

SetFillStyle(1, Yellow); { свет в окне }

FloodFill (x_house+20, y_house+15, White); { свет в окне }

ReadLn;

CloseGraph

END.


Поделиться с друзьями:

mylektsii.su - Мои Лекции - 2015-2024 год. (0.015 сек.)Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав Пожаловаться на материал