Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Тurbo Pascal 7+.doc
Скачиваний:
12
Добавлен:
24.12.2018
Размер:
10.09 Mб
Скачать

9.6. Использование случайных величин при рисовании

Как получить случайное число?

Давайте сначала напечатаем его. Для этого подойдет функция Random из раздела 4.9. WriteLn(Random(100)) напечатает целое неотрицательное число, какое - мы заранее не знаем, знаем только, что меньше 100. Легко догадаться, что WriteLn (500 + Random(100)) напечатает случайное число из диапазона от 500 до 599.

Попробуем нарисовать "звездное небо". Для этого достаточно в случайных местах экрана нарисовать некоторое количество разноцветных точек (скажем, 1000). Точка ставится процедурой PutPixel. Как сделать координаты и цвет точки случайными? Посредством той — же функции Random. Если ваш экран имеет размер 640x480 пикселов, то обращение к процедуре рисования одной точки случайного цвета будет выглядеть так:

PutPixel (Random(640), Random(480), Random(16))

Число 16 взято по той причине, что все цвета в Паскале имеют номера от 0 до 15.

Для того чтобы таких точек было 1000, используем цикл for:

for i:=1to1000 do PutPixel (Random(640), Random(480), Random(16))

Имейте в виду, что, сколько бы раз вы ни запускали программу с указанным фрагментом, картина созвездий на экране будет абсолютно одинакова. Если вам нужно, чтобы от запуска к запуску набор значений случайной величины менялся (а значит, и созвездия), употребите один раз до использования функции Random процедуру Randomize. Вот так:

Randomize;

for i:=1 to 1000 do PutPixel (Random(640), Random(480), Random(16))

Задание 85

"Дождь в луже". Заполните экран окружностями радиуса 20 в случайных местах..

Задание 86

"Цирк ". То же самое, но случайных радиусов и цветов.

Задание 87

"Звезды в окне". Изобразите звездное небо в пределах прямоугольника.

9.7. Движение картинок по экрану

Идею создания иллюзии движения картинок по экрану было объяснено в разделе 2.8. Попробуем заставить двигаться по экрану слева направо окружность. Для этого сначала нарисуем слева окружность и тут же сотрем ее, для чего нарисуем ее на том же месте, но черным цветом. Несмотря на то что окружность тут же стерли, она успеет мелькнуть на экране и глаз это заметит. Затем надо нарисовать и стереть такую же окружность чуть правее, затем еще правее и т. д.

USES Graph;

VAR x, Device, Mode :Integer;

BEGIN

Device:=0;

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

ReadLn; {Переключение в графический режим иногда занимает одну-две секунды, поэтому, если вы хотите увидеть движение с самого начала, щелкните по клавише ввода через пару секунд}

x:=40;

repeat

SetColor(White);

Circle(x,100,10); {Рисуем белую окружность}

SetColor(Black);

Circle(x,100,10); {Рисуем черную окружность}

x:=x+1 {Перемещаемся немного направо}

until x>600;

CloseGraph;

END.

Когда вы попробуете выполнить эту программу на компьютере, изображение движущейся окружности может получиться некачественным: окружность в процессе движения может мерцать и пульсировать. Это связано с разверткой электронно-лучевой трубки вашего монитора. Попробуйте изменить радиус окружности или шаг движения по горизонтали или введите между рисованием и стиранием окружности небольшую паузу процедурой Delay, ситуация почти наверняка улучшится.

Задание 88

Измените скорость движения. Если окружность движется небыстро, увеличьте скорость (х:=х+2), если слишком быстро - уменьшите процедурой Delay.

Задание 89

Пусть одновременно движутся две окружности.

Задание 90

То же, но одна движется вниз, другая - направо.

Задание 91

Заставьте окружность отскочить от правого края экрана.

Задание 92

Заставьте окружность бесконечно двигаться, отскакивая от правого и левого края экрана.

Если вы будете рисовать окружности толстой линией, то увидите, что движение сильно замедлилось, так как толстая линия рисуется гораздо дольше тонкой. То же относится и к закрашенной окружности.

Задание 93 (сложное)

"Биллиардный шар". Нарисуйте "биллиардный стол" - большой прямоугольник. Окружность летает по столу, отскакивая от его краев по закону отражения. Попав "в лузу" (любой из четырех углов стола), останавливается.

Задание 94

Изобразите полет камня, брошенного с башни, для задания из раздела 6.3.

Напоминаем условие задания. Камень бросили горизонтально со 100-метровой башни со скоростью v = 20 м/с. Его расстояние от башни по горизонтали (s) выражается формулой s = v * t, где t - время полета камня в секундах. Высота над землей h выражается формулой h = 100 - 9.81 * t2/2.

Нарисуйте башню, землю, камень (маленькая окружность). Затем камень летит. Добейтесь, чтобы время полета камня на экране примерно соответствовало реальному времени, полученному в разделе 6.3. Нарисуйте траекторию полета камня. Для этого достаточно, чтобы камень оставлял за собой след в виде точек.

Указание. В задаче говорится о метрах, а на экране расстояние измеряется в пикселах. Поэтому вам придется задать масштаб, то есть вообразить, что 1 пиксел равен, скажем, одному метру. Тогда высота башни будет равна 100 пикселам, а скорость камня - 20 пикселам в секунду. Правда, картинка на экране в этом случае может показаться вам маловатой. Тогда можете задать другой масштаб: 4 пиксела, например равны одному метру. Тогда высота башни будет равна 400 пикселам, скорость камня - 80 пикселам в секунду, а формула изменится: h = 4 * (100 - 9.81 * t2/2).

Задание 95 (сложное)

Создайте игру, в которой пушка на экране стреляет в цель ядрами. С какого выстрела она поразит цель? Между пушкой и целью расположена небольшая гора. Перед началом игры случайно задается горизонтальная координата цели. Затем рисуется картинка:

Перед каждым выстрелом компьютер отображает на экране номер выстрела и запрашивает у человека стартовую скорость ядра v и угол а наклона ствола пушки к земле. Затем летит ядро. Полет ядра подчиняется двум уравнениям: s = v * t * cosa и h = v * t * sin - 9.81 * t2/2 (см. предыдущее задание). Считается, что цель поражена, если ядро "оторвало" от нее хоть маленький кусочек.

Указание. В начале программы вам может понадобиться написать оператор DirectVideo := false. Пояснения см. в разделе 10,3.

Мы рассмотрели основные простые возможности модуля Graph. Некоторые другие средства модуля будут рассмотрены в главе 15.