16.3.21. Пример использования подпрограмм модуля CRT
В качестве примера использования ресурсов модуля CRT рассмотрим программу, которая случайным образом выбирает размер и местонахождение окна на экране, закрашивает его в цвет, выбранный случайным образом, помещает в него текст и включает источник звука.
Пример.
program EXAMPLE28; |
|
uses CRT; |
|
const Text = 'Привет!'; |
|
TextLen = 7; |
{Размер текста} |
MinLen = TextLen+6; |
{Мин. размер окна по горизонтали.} |
Pause = 500; |
|
var XI, Yl, Х2, Y2: Word; |
{Координаты окна} |
Background: Word; |
{Цвет фона} |
Color: Word; |
{Цвет символов} |
SetBlink: Byte; |
{Признак мигания} |
Freq: Word; |
{Частота звука} |
{ Процедура формирования двойной рамки } |
procedure DoubleFrame; |
|
var i: Byte; |
|
begin |
|
GotoXY(2, 1); |
|
Write(' é '); |
{Левый верхний угол рамки} |
for i := 3 to X2 - 2 do |
|
Write('-'); |
{Верхняя часть рамки} |
Write(' ù '); |
{Правый верхний угол рамки} |
for i := 2 to Y2 - 1 do |
|
begin |
|
GotoXY(2, i); |
{Боковые части рамки} |
Write('|'); |
|
GotoXY(X2 - 1, i); |
|
Write('|') |
|
end; |
|
GotoXY(2, Y2); |
|
Write(' ë '); |
{Левый нижний угол рамки} |
for i := 3 to X2 - 2 do |
|
Write('-'); |
{Нижняя часть рамки} |
Write(' û ') |
{Правый нижний угол рамки} |
end; |
|
{ Основная часть программы } |
begin |
|
TextBackGround(Black); |
|
ClrScr; |
{Очистка экрана} |
Randomize; |
{Инициализация генератора случайных чисел} |
while not KeyPressed do |
{Организация цикла до нажатия клавиши} |
begin |
|
{ Формирование окна } |
|
X1 := 1 + Random(80 - MinLen); |
{Координата левого верхнего угла} |
Х2 := MinLen + Random(80 - XI - MinLen); |
{Горизонтальный размер рамки} |
Y2 := Round(X2 * 25 / 80) - 1; |
{Вертикальный размер рамки} |
Y1 := 1 + Random(24 - Y2); |
{Координата левого верхнего угла} |
Window(Xl, Yl, XI + Х2 - 1, Yl + Y2 - 1); |
|
BackGround : = Random(8); |
{Цвет фона} |
Color := Random(16); |
{Цвет символов} |
SetBlink : = Random(2); |
{Мигание} |
TextBackGround(BackGround); |
|
ClrScr; |
|
TextColor(Color + Blink * SetBlink); |
|
GotoXY((X2 - TextLen) div 2+1, (Y2 - 1) div 2+1); |
|
Write(Text); |
|
DoubleFrame; |
|
{ Формирование звука } |
|
BackGround:=(TextAttr and $70) shr 4; |
{Выделение цвета фона} |
case BackGround of |
|
0: Freq := 262; |
{До} |
1: Freq := 294; |
{Pe} |
2: Freq := 330; |
{Ми} |
3: Freq := 349; |
{Фа} |
4: Freq := 392; |
{Соль} |
5: Freq := 440; |
{Ля} |
6: Freq := 494; |
{Си} |
7: Freq := 524; |
{До} |
end; |
|
Sound(Freq); |
|
Delay(Pause); |
|
NoSound |
|
end; |
|
Window (1, 1, 80, 25); |
{Полный размер экрана} |
TextBackGround(Black); |
|
TextColor(LightGray); |
|
ClrScr |
{Очистка экрана} |
end. |
|
В этой программе организован цикл формирования на экране случайным образом окон с соответствующим заполнением и выдачи звука в зависимости от выбранного цвета фона окна. Цикл продолжается до первого нажатия любой клавиши. В программе используются различные подпрограммы модуля CRT (ClrScr, Delay, GotoXY, NoSound, Sound, TextBackGround, TextColor, Window), a также ряд констант и переменных (Black, Blink, TextAttr). Относительно программы следует сделать ряд замечаний.
В программе введена константа Text, определяющая выводимый на экран текст. В языке Паскаль идентификатор Text определяет текстовый файл (см. п. 6.6). Но т. к. он не является зарезервированным словом, его можно переопределять по своему усмотрению. Однако делать это нежелательно, потому что его первоначальное назначение становится недоступным в программе. В связи с тем, что в данной программе текстовые файлы не используются, такое определение идентификатора в данном случае допустимо. Так можно поступать с большинством типов данных, стандартными процедурами и функциями.
В процедуре формирования двойной рамки DoubleFrame используются символы псевдографики. Для того чтобы поместить такой символ в текст программы, следует, нажав клавишу Alt и не отпуская ее, набрать на правой вспомогательной панели клавиатуры код символа, после чего отпустить клавишу Alt.
При формировании звука в программе используется получение цвета фона из содержимого переменной TextAttr. Можно заметить, что эта операция в данном случае необязательна, т. к. в переменной BackGround уже находится текущий цвет фона. В программе оператор введен для того, чтобы показать, как можно использовать содержимое переменной TextAttr.
|