мерцающими, если к значению атрибута экрана добавить 128.
Чтобы вычислить значение Screen_attribute для различных комбинаций цветов, прежде всего, выберите необходимый цвет текста и цвет фона. Затем сложите соответствующие значения атрибутов. Если вы хотите, чтобы символы мерцали, прибавьте к результирующему значению 128. Вычисленное значение используется как второй аргумент в предикате makewindow, т.е. Screen_attribute.
Чтобы создать окно с белыми символами на черном фоне, сложите 7 (белый текст) и 0 (черный фон), результат будет 7.
Аргумент Frame_attribute предиката makewindow есть целое число, значение которого определяет рамку окна. Если значение атрибута - 0, окно не имеет видимой границы. Другие значения определяют рамку окна с параметрами, указанными в табл. 3.
Часть значений атрибута рамки окна задает ее цвет. Это делается аналогично заданию значения атрибута экрана. Если задается мерцающая граница, то она всегда будет белой, с мерцающей тонкой линией (в середине границы), имеющей указанный цвет.
Аргумент Frame_string задает метку окна. Например, меткой окна может быть "Главное Меню", "Окно Вывода". Строка, задаваемая в качестве атрибута Frame_string, будет размещена в центре верхней линии рамки окна. Значение метки окна также может быть не определено, что соответствует отсутствию метки. В этом случае вводится аргумент, состоящий из двух последовательных знаков кавычки.
Таблица 3. Значение атрибута, определяющего цвет рамки окна в Турбо-Прологе.
Значение атрибута |
Вид рамки окна |
0 |
Нет рамки |
1 |
Синяя рамка |
2 |
Зеленая рамка |
3 |
Светло-синяя рамка |
11
4 |
Красная рамка |
5 |
Фиолетовая рамка |
6 |
Желтая рамка |
7 |
Белая рамка |
8 |
Коричневая рамка |
-1 |
Мерцающая белая рамка |
-2 |
Мерцающая желтая рамка |
-3 |
Мерцающая фиолетовая рамка |
-4 |
Мерцающая красная рамка |
-5 |
Мерцающая светло-синяя рамка |
-6 |
Мерцающая светло-зеленая рамка |
-7 |
Мерцающая синяя рамка |
-8 |
Мерцающая серая рамка |
Аргумент Starting_row есть целое число, определяющее верхнюю строку (линию) создаваемого окна. Максимальное количество строк, умещающихся на экране, 25. Значение 4 указывает, что окно начинается с четвертой строки. Нумерация начинается с 0.
Аргумент Starting_column указывает крайний левый столбец окна. Значения аргумента изменяются от 0 до 79.
Аргумент Window_height определяет количество строк, занимаемых создаваемым окном.
Аргумент Window_width указывает число столбцов, занимаемых окном. Предикат shiftwindow используется для смены текущего окна
(переключения). Его форма: shiftwindow(Window_number).
Параметр window_number является целым числом, приписываемым окну при его создании.
В то же время Турбо-Пролог "помнит" предыдущие окна и их атрибуты. Например, если окно 3 имеет такие атрибуты, что оно будет перекрывать текущее окно (окно 4), то выполнение предиката shiftwindow (3) вызовет появление окна 3, в которое вложено окно 4. Информация из окна 4, частично закрытая окном 3, сохраняется и появится на экране, когда произойдет переключение и окно 4 вновь станет текущим.
12
Предикат gotowindow позволяет выполнять быстрое переключение между двумя окнами, которые не перекрываются. Его форма: gotowindow (Window_number).
Этот предикат выполняется быстрее, чем shiftwindow, и поэтому его следует использовать для переключения между окнами, содержащими большое количество текста.
Предикат clearwindow. Данный предикат удаляет из текущего окна все текстовые и графические изображения. Предикат не имеет аргументов. Окно и рамка окна, если она имеется, не разрушаются. Окно целиком закрашивается соответствующим цветом фона.
Предикат removewindow удаляет текущее окно с экрана. Предикат аргументов не имеет. Все текстовые и графические изображения, находящиеся в окне, также удаляются. Если за данным окном находится другое окно, то это окно и его содержимое становятся видимыми. Если удаляется последнее из заданных окон, на экране появляется то изображение, которое было на нем до создания окон.
Использование окон для ввода и вывода С любым текущим окном работают стандартные предикаты ввода и
вывода – readln,readint,readchar - также.
По умолчанию, курсор расположен в верхнем левом углу окна. Используя предикат cursor и помещать курсор в любую позицию текущего окна. Этот предикат имеет вид: cursor (Row_number, Col_number ).
Аргументы Row_number и Col_number являются целыми числами, задающими номера строки и столбца, по отношению к верхней строке и крайнему левому столбцу экрана. Строки и столбцы нумеруются, начиная с нуля: предикат cursor(0,0) обеспечивает вывод текста, начиная с верхнего левого угла экрана.
Например, следующие предикаты могут быть использованы для вывода
13
сообщения в центре экрана.
makewindow( 1,7,7,"", 1,1, 8,28), cursor(4,12),
write("Доброе утро!").
Пример 1.
Predicates start run(integer) do_sums
Программа 1. Работа с окнами
set_up_windows clear_windows
Clauses
start:- set_up_windows, do_sums. set_up_windows :-
makewindow(l, 7, 7, “”, 0, 0, 25, 80), makewindow( 1, 7, 7, "Left operand", 2, 5, 5, 25), makewindow(2, 7, 7,"", 2, 35, 5, 10),
nl, write(" PLUS"),
makewindow(2, 7, 7, "Right operand", 2, 50, 5, 25), makewindow(3, 7, 7, "Gives", 10, 27, 5, 25), makewindow(4, 7, 7,"", 17, 22, 5, 35).
do_sums :- run(_), clear_windows, do_sums. run(Z) :-
shiftwindow(l), cursor(2, 1), readint(X), shiftwindow(2),
cursor(2, 10), readint(Y),
shiftwindow(3), Z=X+Y, cursor(2, 10), write(Z), shiftwindow(4),
write(" Please press the space bar"), readchar(_).
Clear_windows :-
shiftwindow(l), clearwindow, shiftwindow(2), clearwindow, shiftwindow(3), clearwindow, shiftwindow(4), clearwindow.
Пролог поддерживает два предиката генерации звука: sound и beep. Предикат beep генерирует звук высокой частоты. Он не имеет параметров. Правило, генерирующее три звуковых сигнала, имеет вид:
beep:- beep, beep, beep.
Предикат sound имеет вид: sound(Duration, Frequency). Первый параметр задает продолжительность звукового сигнала в сотых долях секунды, второй-частоту генерируемого звука.
14
Таблица 4.
Работа со звуком
Нота |
До |
До |
Ре |
Ре |
Ми |
Фа |
Фа |
Соль |
Соль |
Ля |
Ля |
Си |
До |
|
|
диез |
|
диез |
|
|
диез |
|
диез |
|
диез |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Частота |
262 |
278 |
294 |
302 |
330 |
350 |
370 |
392 |
416 |
440 |
466 |
494 |
524 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Рассмотрим программу обучения сложению, демонстрирующую возможности пролог управления окнами и звуком.
Predicates gen_rand_num(integer) say_good_work say_more_work
test_and_reward(integer, integer) make_exercise_set(integer) do_cal
Goal
do_cal.
Clauses
do_cal:-
makewindow(1,7,7, “Тренажер для обучения сложению”, 2,20,20,34), nl,
write(“Вашему вниманию предлагаем упражнения для выполнения”), make_exercise_set(3),
nl, write(“Желаем удачи! Пока!”),
nl, write(“Нажмите на любую клавишу”), readchar(_),
removewindow. make_exercise_set(0):-!. make_exercise_set(Count):-
gen_rand_num(A),
nl, write(“1-е число ”,A), nl, gen_rand_num(B),
nl, write(“2-е число ”,B), nl, C=A+B,
write(“Чему равна сумма?”), nl, readint(U), test_and_reward(C,U), Newcount=Count-1,
make_ exercise_set(NewCount). gen_rand_num(X):-random(Y), X=Y*5+1. test_and_reward(C,C):-say_good_work,!. test_and_reward(_,_):-say_more_work. say_good_work:-
makewindow(2,7,7, “Хорошая работа!”, 12, 40, 8, 30), nl, write(“Вы правы”), nl, nl,
write(“Музыка для победителя!”),nl,nl, sound(4, 262), sound(4, 350),
sound(4, 440), sound(8, 516), sound(4, 440), sound(112, 516),
nl, nl, write(“Нажмите на любую клавишу”), readchar(_),
15