home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / prolog / library / prolo_c / exampl28.pro < prev    next >
Text File  |  1986-10-06  |  4KB  |  121 lines

  1. /* Program 28 */
  2.  
  3. domains
  4.     monsters=integer*
  5.  
  6. predicates
  7.     delay(integer)
  8.     zapGun(integer,integer)
  9.     delete(integer,monsters,monsters)
  10.     testresult(monsters,integer)
  11.     test(char,integer,integer)
  12.     doit(integer,monsters,integer)
  13.     showThem(monsters,integer,char)
  14. /*
  15.   The following predicates have been added to allow the user
  16.   to select the number of monsters, to generate a random
  17.   starting point, and to move the monsters either up or down
  18.   on the screen randomly.
  19. */
  20.     init(integer,monsters)
  21.     init1(integer,monsters,monsters)
  22.     append(monsters,monsters,monsters)
  23.     int_real(integer,real)
  24.     increment(integer)
  25.     randcol(integer)
  26.  
  27. goal
  28.     makewindow(1,7,0,"",0,0,25,80),
  29.     init(Start,Monsters),
  30.     doit(Start,Monsters,0).
  31.  
  32. clauses
  33.     doit(Initial,Monsters,Row):-
  34.         testresult(Monsters,Row),    /* test to see if game is over */
  35.         showThem(Monsters,Row,'\1'), /* display monsters */
  36.         readchar(Ch),                /* get direction to move */
  37.         test(Ch,Initial,Final),      /* move */
  38.         zapGun(24,Final),            /* FIRE!!! */
  39.         delete(Final,Monsters,LiveMonsters),
  40.         increment(X),                /* get a random direction to move */
  41.         NewRow = Row + X,
  42.         cursor(24,Final),
  43.         showThem(Monsters,Row,' '),  /* erase old monsters */
  44.         doit(Final,LiveMonsters,NewRow).
  45.  
  46.     testresult([],_):-
  47.         write("\nWell done champion zapper !"),
  48.         readchar(_), exit.
  49.     testresult(_,Row) :- Row<24,!.
  50.     testresult(_,_) :-
  51.         write("\nToo late, YOU have been zapped !"),
  52.         readchar(_), exit.
  53.  
  54.     showThem([],_,_) :-!.
  55.     showThem([Monster|TheRest],Row,Char) :-
  56.         Row > -1, !,                 /* negative rows illegal */
  57.         scr_char(Row,Monster,Char),
  58.         showThem(TheRest,Row,Char).
  59.     showThem(_,_,_) :- !.
  60.  
  61.     zapGun(N,C):-
  62.         N>0,!,scr_char(N,C,'^'),delay(150),
  63.         scr_char(N,C,' '),N1=N-1,zapGun(N1,C).
  64.     zapGun(_,_).
  65.  
  66.     test('z',0,79):-!.               /* changed to make the screen wrap */
  67.     test('\75',0,79):-!.             /* and use arrow keys */
  68.     test('x',79,0):-!.
  69.     test('\77',79,0):-!.
  70.     test('t',_,Col):-randcol(Col),!. /* t-port to a random spot */
  71. /*
  72.   the following clauses move the cursor right or left
  73. */
  74.  
  75.     test('z',OldCol,NewCol):-!,NewCol=OldCol-1.
  76.     test('\75',OldCol,NewCol):-!,NewCol=OldCol-1.
  77.     test('x',OldCol,NewCol):-!,NewCol=OldCol+1.
  78.     test('\77',OldCol,NewCol):-!,NewCol=OldCol+1.
  79.     test(_,C,C).                     /* anything else, stay put */
  80.  
  81.     delete(_,[],[]).
  82.     delete(X,[X|R],R):-!.
  83.     delete(X,[Y|R],[Y|R2]) :- !,delete(X,R,R2).
  84.  
  85.     delay(N):-N>0,!,N1=N-1,delay(N1).
  86.     delay(0).
  87.     randcol(Col) :-
  88.         random(X),
  89.         C = X * 79,
  90.         int_real(Col,C), !.
  91.  
  92.     int_real(X,Y) :-
  93.         X = Y.
  94.  
  95.     init(Start, Monsters) :-
  96.         write("How many monsters do you want to fight? "),
  97.         readint(N),                  /* integer number of monsters */
  98.         init1(N, [], Monsters),      /* generate list of monsters */
  99.         randcol(Start),              /* generate start location */
  100.         clearwindow,
  101.         write("z moves left, x moves right, t to teleport\n"),
  102.         write("press any key to begin..."),
  103.         readchar(_),
  104.         clearwindow, !.
  105.  
  106.     init1(0,Monsters,Monsters).      /* no monsters left to make */
  107.     init1(N,OldMonst,Monsters) :-
  108.         N1 = N - 1,
  109.         randcol(Col),
  110.         append(OldMonst,[Col],NewMonst),
  111.         !,init1(N1,NewMonst,Monsters).
  112.  
  113.     append([],L,L).
  114.     append([H|L1],L2,[H|L3]) :-
  115.         append(L1,L2,L3).
  116.  
  117.     increment(I) :-
  118.         random(Y),
  119.         X = Y * 3 - 1,
  120.         int_real(I,X).
  121.