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