home *** CD-ROM | disk | FTP | other *** search
Prolog Source | 1986-10-07 | 3.7 KB | 121 lines |
- /* Program 28 */
-
- domains
- monsters=integer*
-
- predicates
- delay(integer)
- zapGun(integer,integer)
- delete(integer,monsters,monsters)
- testresult(monsters,integer)
- test(char,integer,integer)
- doit(integer,monsters,integer)
- showThem(monsters,integer,char)
- /*
- The following predicates have been added to allow the user
- to select the number of monsters, to generate a random
- starting point, and to move the monsters either up or down
- on the screen randomly.
- */
- init(integer,monsters)
- init1(integer,monsters,monsters)
- append(monsters,monsters,monsters)
- int_real(integer,real)
- increment(integer)
- randcol(integer)
-
- goal
- makewindow(1,7,0,"",0,0,25,80),
- init(Start,Monsters),
- doit(Start,Monsters,0).
-
- clauses
- doit(Initial,Monsters,Row):-
- testresult(Monsters,Row), /* test to see if game is over */
- showThem(Monsters,Row,'\1'), /* display monsters */
- readchar(Ch), /* get direction to move */
- test(Ch,Initial,Final), /* move */
- zapGun(24,Final), /* FIRE!!! */
- delete(Final,Monsters,LiveMonsters),
- increment(X), /* get a random direction to move */
- NewRow = Row + X,
- cursor(24,Final),
- showThem(Monsters,Row,' '), /* erase old monsters */
- doit(Final,LiveMonsters,NewRow).
-
- testresult([],_):-
- write("\nWell done champion zapper !"),
- readchar(_), exit.
- testresult(_,Row) :- Row<24,!.
- testresult(_,_) :-
- write("\nToo late, YOU have been zapped !"),
- readchar(_), exit.
-
- showThem([],_,_) :-!.
- showThem([Monster|TheRest],Row,Char) :-
- Row > -1, !, /* negative rows illegal */
- scr_char(Row,Monster,Char),
- showThem(TheRest,Row,Char).
- showThem(_,_,_) :- !.
-
- 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,79):-!. /* changed to make the screen wrap */
- test('\75',0,79):-!. /* and use arrow keys */
- test('x',79,0):-!.
- test('\77',79,0):-!.
- test('t',_,Col):-randcol(Col),!. /* t-port to a random spot */
- /*
- the following clauses move the cursor right or left
- */
-
- test('z',OldCol,NewCol):-!,NewCol=OldCol-1.
- test('\75',OldCol,NewCol):-!,NewCol=OldCol-1.
- test('x',OldCol,NewCol):-!,NewCol=OldCol+1.
- test('\77',OldCol,NewCol):-!,NewCol=OldCol+1.
- test(_,C,C). /* anything else, stay put */
-
- 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).
- randcol(Col) :-
- random(X),
- C = X * 79,
- int_real(Col,C), !.
-
- int_real(X,Y) :-
- X = Y.
-
- init(Start, Monsters) :-
- write("How many monsters do you want to fight? "),
- readint(N), /* integer number of monsters */
- init1(N, [], Monsters), /* generate list of monsters */
- randcol(Start), /* generate start location */
- clearwindow,
- write("z moves left, x moves right, t to teleport\n"),
- write("press any key to begin..."),
- readchar(_),
- clearwindow, !.
-
- init1(0,Monsters,Monsters). /* no monsters left to make */
- init1(N,OldMonst,Monsters) :-
- N1 = N - 1,
- randcol(Col),
- append(OldMonst,[Col],NewMonst),
- !,init1(N1,NewMonst,Monsters).
-
- append([],L,L).
- append([H|L1],L2,[H|L3]) :-
- append(L1,L2,L3).
-
- increment(I) :-
- random(Y),
- X = Y * 3 - 1,
- int_real(I,X).
-