КАТЕГОРИИ:
АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника
|
Записываем программу целикомПока у вас на экране – правильно работающий «скелет» программы. Наша задача – постепенно наполнить этот скелет мышцами. Ниже вы можете посмотреть готовую программу мультфильма. А сейчас я поясню порядок ее написания, отладки и отдельные трудные места. При работе на компьютере ни в коем случае не вводите сразу всю программу из сотни строк, чтобы потом, запустив ее, не схватиться за голову! Почему? Потому что профессиональный программист в среднем допускает одну описку или ошибку в 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; VARDevice, 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.
|