[net.sources.games] An exciting game in PROLOG

joe@erix.UUCP (Joe Armstrong) (10/11/85)

# This is a shell archive.  Remove anything before this line, then
# unpack it by saving it in a file and typing "sh file".  (Files
# unpacked will be owned by you and have default permissions.)
#
# This archive contains:
# READ_ME game.pl

echo x - READ_ME
cat > "READ_ME" << '//E*O*F READ_ME//'

A THRILLING GAME IN PROLOG WITH HIGH SPEED HIGH RESOLUTION VT100 GRAPHICS

This program is donated to the public domain and may be used, modified
re-distributed, or simply throw away as seen fit by the user.

With this program I hope to fill a 'gap' in the market - I have often seen
requests for "really badly written banal games written in FORTRAN" - since
PROLOG has been described as the FORTRAN of logic programming I hope this
program fills that gap.

I make no apologies for the code, though I suspect that purests may object
to the "(cut,...,fail);true" constructs that are liberally sprinkled
throughout the program.

Plans are underway to write yet more thrilling, exciting, spectacular,
addictive, brilliant, wonderful, enchanting games in SASL, HOPE, PARLOG, 
ML, etc.

--- Joe Armstrong.
//E*O*F READ_ME//

echo x - game.pl
cat > "game.pl" << '//E*O*F game.pl//'
/*------------------------------------------------------------*/
/* to run this program: enter prolog and type ['game.pl'],go. */
/*------------------------------------------------------------*/

go :-
	noscroll,
	system('stty cbreak',_),
	start,!,
	play.

play :-
	putat(24,1,"type space to spin the chamber"),
	get0(_),
	putat(24,1,"                              "),
	random(6,N),
	move(24,60),put("you spun "),write(N),
	possibly_die(N),
	play.
	
possibly_die(6) :- die.
possibly_die(N).

putat(X,Y,Text) :- move(X,Y),put(Text).

start  :-
	cls,print_thing_at(2,5,gun),print_thing_at(1,60,head).
	
die :-
	put(7),
	print_thing_at(11,20,bang),
	un_print_thing_at(11,20,bang),
	move_thing_at(2,39,30),
	print_thing_at(2,69,bullit),
	print_thing_at(11,20,aagh),
	un_print_thing_at(11,20,aagh),            
	un_print_thing_at(1,60,head),
	cls,
	system('echo "your game got played" | mail joe@erix.UUCP',_),
	putat(24,1,"like to dice (sic) with death again (y/n):"),
	get0(X),                    
	possibly_doit_again(X).
	
possibly_doit_again(121) :- start,!,play.
possibly_doit_again(110) :- abort.

move_thing_at(X,Y,N) :- 
    (for(I,1,N),
    Y1 is Y + I -1,
    print_thing_at(X,Y1,bullit),
    un_print_thing_at(X,Y1,bullit),
    fail);true.
    

un_print_thing_at(X,Y,Z) :- un_print_thing_at_1(X,Y,Z);true.

un_print_thing_at_1(X1,Y,Z) :-
    F =.. [Z,N,L],!,
    call(F),                
    X is X1 + N - 1,
    move(X,Y),
    undraw(L),nl,fail.
    
undraw(L) :-
    (length(L,M),!,for(I,1,M),put(32),fail);true.

print_thing_at(X,Y,Z) :- print_thing_at_1(X,Y,Z);true.

print_thing_at_1(X1,Y,Z) :-
    F =.. [Z,N,L],!,
    call(F),
    X is X1 + N - 1,
    move(X,Y),
    put(L),nl,fail.

for(I,I,Upper).
for(I,Lower,Upper) :-
    Lower < Upper,
    Next is Lower + 1,
    for(I,Next,Upper).

move(X,Y) :- printf("%c%c%d%c%d%c",[27,91,X,59,Y,72]).

scroll(X,Y) :- printf("%c%c%d%c%d%c",[27,91,X,59,Y,114]),move(24,1).

noscroll :- scroll(1,24).

cls :- printf("%c%c%c%c",[27,91,50,74]).

seed(13).

random(R,N) :-
	retract(seed(S)),
	N is (S mod R) +1,
	NewSeed is (125*S+1) mod 4096,
	asserta(seed(NewSeed)),!.
	
gun(1, "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx").
gun(2, "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx").
gun(3, "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx").
gun(4, "xxxxxxxxxxxxxxxxxxxxxxxxx").
gun(5, "xxxxxxxxxxxxx x    x").
gun(6, "xxxxxxxxxxxxx  x  x").
gun(7, "xxxxxxxxxxxxx  x x").
gun(8, "xxxxxxxxxxxxxxxxx").
gun(9, "xxxxxxxxxxx").
gun(10,"xxxxxxxxxxx").
gun(11,"xxxxxxx").
gun(12,"xxxxxxx").
gun(13,"xxxxxxx").
gun(14,"xxxxxxx").
gun(15,"xxxxxxx").
gun(16,"xxxxxxx").

head(1, "        xxxxxxxxx").
head(2, "      xxxxxxxxxxxx").
head(3, "     xx          xxx").
head(4, "    x         xxxxxxx").
head(5, "   x  xxx      xxxxxx").
head(6, "   x xxxxx  x    xxx").
head(7, "    x xxxx    xx  xx").
head(8, "    x  xx       x  x").
head(9, "    x  xx        x x").
head(10,"   x  x          x x").
head(11,"  x               x").
head(12," x               x").
head(13,"x               x").
head(14,"x               x").
head(15,"xxxxx           x").
head(16," xx              x").
head(17," xxx              x").
head(18,"  xx   xxx        x").
head(19,"   xxxx   x      x").
head(20,"          x      x").
head(21,"          x      x").

bullit(1,"==>").
bullit(2,"===>").
bullit(3,"==>").

bang(1, "xxxx     xx    x    x   xxx  ").
bang(2, "x   x   x  x   xx   x  x   x ").
bang(3, "x  x   x    x  x x  x  x   x ").
bang(4, "xxx    xxxxxx  x x  x  x     ").
bang(5, "x  x   x    x  x  x x  x  xxx").
bang(6, "x   x  x    x  x   xx   x  x ").
bang(7, "xxxx   x    x  x    x    xx  ").

aagh(1, "  xx     xx     xxx   x    x").
aagh(2, " x  x   x  x   x   x  x    x").
aagh(3, "x    x x    x  x   x  x    x").
aagh(4, "xxxxxx xxxxxx  x      xxxxxx").
aagh(5, "x    x x    x  x  xxx x    x").
aagh(6, "x    x x    x  x  x   x    x").
aagh(7, "x    x x    x   xx    x    x").

//E*O*F game.pl//

exit 0