Скачиваний:
201
Добавлен:
17.06.2016
Размер:
2.69 Mб
Скачать

Window_attr/1

Вы можете изменить атрибуты активного окна с помощью предиката

window_attr.

window_attr(Аttr) /* (i) */

После обработки предиката window_attr все активное окно получает ат-

рибут Аttr.

Простая игра.

Чтобы почувствовать широту и мощь средств работы с окнами в Турбо

Прологе, попробуем с помощью scr_char создать простую игровую программу.

После запуска программы в верхней части экрана будут появляться монстры,

которые постепенно будут спускаться вниз по направлению к вашей пушке,

которая расположена внизу экрана. Направление стрельбы из пушки можно ме-

нять используя клавиши X и Z. Задача состоит в том, чтобы поразить монст-

ра, до того как он поразит вас.

Так как Турбо Пролог работает быстро, вам необходимо ввести в прог-

рамму задержку, чтобы улавливать происходящее на экране. Иначе игра будет

протекать так быстро, что вы ее не заметите. Для замедления игры опреде-

лим предикат delay, который вводит временную задержку, длительность кото-

рого зависит от целого аргумента, и имеет вид:

delay(N) :- N>0,!, N1=N-1, delay(N1).

delay(_).

Определим также предикат zarGun, который после обращения к нему в

виде:

zarGun(24, Column)

иммитирует стрельбу лазерным пучком из нижней части экрана вверх, вдоль

столбца с номером Column. Иммитация происходит путем высвечивания и сти-

рания символа "каре" (^):

zarGun(N, C) :- N>0, !,

scr_char(N, C, '^'),

delay(150),

scr_char(N, C, ' '),

N1 = N-1, zarGun(N1, C).

zarGun(_, _).

Атакующие монстры предсталены списком целых чисел, обозначающих но-

мера колонок, вдоль которых монстры двигаются вниз. Для имитации движения

монстров необходимо их высвечивать, а потом их стирать (монстр представ-

ляется ASCII - кодом '\1'). Предикат предназначенный для этого, называет-

ся showThem и имеет три аргумента: список колонок, занятых монстрами,

строка, в которой они должны высвечиваться, и символ, который высвечива-

ется в каждой позиции, занятой монстром.

showThem([], _, _) :- !.

showThem([Monster|TheRest], Row, Char) :-

scr_char(Row, Monster,Char),

showThem(TheRest, Row,Char).

В различные моменты игры вы можете проверить, какие монстры еще живы

и какой строки они достигли.

testresult([], _) :- !,

Write("\nWell done, Champion Zapper!"),

delay(32000),fail.

testresult(_, Row) :- Row < 24, !.

testresult(_, _) :-

Write("\nToo late: YOU have been zapped!"),

delay(32000),fail.

После того как монстр "убит", он удаляется из списка живых с помощью

предиката delete:

delete(_, [],[]).

delete(X,[X|R],R) :- !.

delete(X,[Y|R], [Y|R2]) :-!, delete(X,R,R2).

Еще несколько подробностей. Придерживайтесь следующих указаний:

- не допускайте, чтобы пушка вышла за пределы экрана;

- нажатие клавиши Z передвигает пушку на одну колонку влево;

- нажатие клавиши Х передвигает пушку на одну колонку вправо.

Нажатие любой другой клавиши игнорируется. Вот соответствующий учас-

ток текста:

test('z', 0, 0) :- !.

test('x', 79, 79) :- !.

test('z', OldCol, NewCol) :- !, NewCol = OldCol-1.

test('x', OldCol, NewCol) :- !, NewCol = OldCol+1.

test('_', C, C).

В программу встроена цель

do_it(56[42,45,50,55,56,59],0),

согласно которой игра начинается при пушке, расположенной в колонке 56, а

монстры появляются в позициях 42,45,50,55,56,59 нулевой строки. Определе-

ние do_it:

do_it(Initial, Monsters, Row) :-

testresult(Monsters, Row),

showThem(Monsters, Row, '\1'),

readchar(Ch), test(Ch, Initial, Final),

zapGun(24, Final),

delete(Final, Monsters, LiveMonsters),

NewRow = Row +1,

cursor(24, Final),

showThem(Monsters, Row, ' '),

do_it(Final, MovedMonsters, NewRow).

Программа CH14EX05.PRO содержит описанную выше игру:

domains

monsters = integer*

predicates

delay(integer)

zapGun(integer, integer)

delete(integer, monsters, monsters)

testresult(monsters, integer)

test(char, integer, integer)

do_it(integer, monsters, integer)

showThem(monsters, integer, char)

goal

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

do_it(56, [42, 45, 50, 55, 56, 59], 0).

clauses

do_it(Initial, Monsters, Row) :-

testresult(Monsters, Row),

showThem(Monsters, Row, '\1'),

readchar(Ch),

test(Ch, Initial, Final),

zapGun(24, Final),

delete(Final, Monsters, LiveMonsters),

NewRow = Row+1,

cursor(24, Final),

showThem(Monsters, Row, ' '),

do_it(Final, LiveMonsters, NewRow).

testresult([], _) :-

write("\nWell done, Champion Zapper!"),

delay(32000), exit.

testresult(_, Row) :- Row<24, !.

testresult(_, _) :-

write("\nToo late, YOU have been zapped !"),

delay(32000), exit.

showThem([], _, _) :- !.

showThem([Monster|TheRest], Row, Char) :-

scr_char(Row, Monster, Char),

showThem(TheRest, Row, Char).

zapGun(N, C) :-

N>0, !, scr_char(N, C, '^'), delay(150),

scr_char(N, C, ' '), N1 = N-1, zapGun(N1, C).

zapGun(_, _).

test('z', 0, 0) :- !.

test('x', 79, 79) :- !.

test('z', OldCol, NewCol) :- !, NewCol = OldCol-1.

test('x', OldCol, NewCol) :- !, NewCol = OldCol+1.

test(_, C, C).

delete(_, [], []).

delete(X, [X|R], R) :- !.

delete(X, [Y|R], [Y|R2]) :- !, delete(X, R, R2).

delay(N) :- N>0, !, N1 = N-1, delay(N1).

delay(0).

В файле MONSTERS.PRO каталога программ содержится более проработан-

ная версия этой программы.

Соседние файлы в папке Документация