Читайте также:
|
|
Пока у вас на экране – правильно работающий «скелет» программы. Наша задача – постепенно наполнить этот скелет мышцами.
Ниже вы можете посмотреть готовую программу мультфильма. А сейчас я поясню порядок ее написания, отладки и отдельные трудные места.
При работе на компьютере ни в коем случае не вводите сразу всю программу из сотни строк, чтобы потом, запустив ее, не схватиться за голову! Почему? Потому что профессиональный программист в среднем допускает одну описку или ошибку в 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.
Дата добавления: 2015-11-14; просмотров: 55 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Постановка задачи | | | Порядок описания переменных, процедур и других конструкций Паскаля |