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

  • docx
  • 06.05.2020
Публикация на сайте для учителей

Публикация педагогических разработок

Бесплатное участие. Свидетельство автора сразу.
Мгновенные 10 документов в портфолио.

0.1. Записываем программу целиком
Иконка файла материала 60..docx

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

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

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

При работе на компьютере ни в коем случае не вводите сразу всю программу из сотни строк, чтобы потом, запустив ее, не схватиться за голову! Почему? Потому что профессиональный программист в среднем допускает одну описку или ошибку в 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:=300y_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.


 

Скачано с www.znanio.ru