logo
TurboProlog / Документация / TOM_1

Применение предиката inkey

В заключение данного раздела мы дадим пример использования стандарт-

ного предиката inkey, который имеет вид

inkey(CharParam)

Если клавиша была нажата дважды с того момента, как была выполнена

последняя операция чтения, то предикат inkey присваивает переменной

CharParam значение кода ASCII нажатой клавиши. Если ни одна клавиша не

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

inkey, в отличие от readchar, позволяет продолжить выполнение программы

даже тогда, когда клавиша не была нажата.

В приведенном ниже примере предикаты inkey и time используются для

оценки времени реакции программиста.

/* Program CH18EX10.PRO */

predicates

wait(char)

equal(char, char)

test(string)

goal

makewindow(3, 7, 0, "", 0, 0, 25, 80),

makewindow(2, 7, 7, "Key to press now", 2, 5, 6, 70),

makewindow(1, 7, 7, "Accepted letters", 8, 10, 10, 60),

Word = "Peter Piper picked a peck of pickled peppers",

write("Please type :\n\t", Word,"\n\t"),

time(0, 0, 0, 0), test(Word),

time(_, _, S, H),

shiftwindow(1),

write("\nYou took ", S, " seconds and ", H, " hundredths").

clauses

wait(X) :- inkey(Y), equal(X, Y).

wait(X) :- shiftwindow(2), write(X), wait(X).

test(W) :- frontchar(W, Ch, R), wait(Ch),

shiftwindow(2), write(Ch), test(R).

test("").

equal(X, X) :- !.

equal(_, _) :- beep, fail.