Files

72 lines
3.5 KiB
C

%: include <curses.h>
%: include <unistd.h>
%: include <time.h>
%: include <stdlib.h>
%: define d =strtoul(z,NULL,0));
%: define m(n)COLOR_%:%:n
%: define v stdscr
%: define q mvaddch(
%: define Z(x) %:x
%: define F(x) z = getenv(Z(x)); z&&(
%: define J Z(X:%d/%d Y:%d/%d S:%zu/%zu B:%zu\n),Y, y<:-2\
:>,X,*y,A,g,c);
%: define f(a,b) ((a)<(b)?(a):(b))
typedef size_t a; typedef unsigned long k; a g=997,c,A=5,I,N=5
,G=5; k p<:5:>={ 1} , W =300; int l,Y,X,*j=(int<:8:>){ 231} ,*
U,*V,*e,*n,Q,P,x,* y, *D; void b(a h){ c +=h; mvprintw(0,0,J }
int E(const char * L){ static int h; !h && endwin(); h=*y; L&&
puts(L) ; return 1; } void C(int L, int h) { attroff(m(PAIR(L
))); h && attron(m(PAIR(L))); } int R(int h, int L) { return
(rand()%(L-h+1)) + h ;} void S(a o) { static const char *s =Z
( ; +<>^v); q n <:0:>,e<: 0:>,' '); A=f(A+o,g); if(A>=g){ E(Z(
YOU WIN! ) ) ; Q = l; return ; } C(3,1); for (I=0; A &&I<A-(A
-A||A); ++I){ I&&q n<:I:>,e<: I:>,'o') ; e<:I:>= e<:I+1:>; n<:
I:>=n<: I +1:>; } A>1&&q n<:I:>,e<:I:>,'o'); e<:I:>=Y; n<:I:>=
X; while(++I<g)e<:I:>=n<:I:>=0; C
(2,1); q X,Y,s<:*D+2&(1<<3)-!Q:>)
; } void B(a o){ if(o){ S(N); b(1
); } if(Q)return; p<:1:>=0; !o&&q
*U,*V,' '); x:y<:3:>=R(1,y<:-2:>-
1); y<:2:>=R(2,*y-1); for(I=0; I<
A; ++ I)if (* V==e<:I:>&&*U== n<:
I:>) goto x; } int main(void) { l
=++(int) { 3 } ; char *z; y = j+3
; void(*H<::>) (a) = { b, S, B};
srand((unsigned)time(NULL)); if(!
initscr())return 1; getmaxyx(v,*y,y<:-2:>);--*y; --y<:-2:>; if
(y<:-2:><9||*y<9)return E(Z(screen too small)); F(MAXSIZE) g d
g=f((a)((*y-2)*(y<:-2:>-2)),g); F(GROW)N d F(SIZE)A d F(WAIT)y
<:-3:>=(int)strtol(z,NULL,0)); F(EVADE)W d U=y+2;F(WALLS) *p d
F(CANNIBAL)p<:4:>d F(SHED)p<:3:>d F(SHEDS )G d e=calloc(g + 1,
sizeof*e); n=calloc(g+1,sizeof*n); if(!e||!n)return E(Z(memory
error)); V=U+1; Y=y<:-2:>/2; X=*y/2; D=1 + V; attron(A_BOLD) ;
curs_set(0); nonl(); intrflush(v, 0); keypad (v, 1); noecho();
cbreak (); start_color (); init_pair(1,WALL, WB); init_pair(2,
HEAD,HB); init_pair(3,BODY,BS); S(0); B(0); x:if(Q)goto y;x=1;
getmaxyx(v,1<:y:>,y<:-1:>); C(1,1); mvhline(1,0,'#',y<:-2:>) ;
mvvline(1,0,'#',*y); mvhline(*
y,0,'#',y<:-2:>);mvvline(1,y<:
-2:>,'#', *y); C(1,0); q*U,*V,
'*' ) ; (*H) (0) ; refresh() ;
timeout(y<:-3:>); switch(getch
()){ case KEY_LEFT:V<:1:>=l-3;
break; case KEY_RIGHT : V<:l/l
:>=l/2; break; case KEY_UP:V<:
l-3:>=l-1; break;case KEY_DOWN
: V <:l/4:>=l; break; case 'q'
:case'Q':Q=l; case' ':(!P&&(P=
1))||(P=0); default:x=0; } if(
x)P=0; if(Q||P) goto x ; if(!Q&&!1<:V:>) goto x; switch(1<:V:>
){ case 1: --Y; break; case 2: ++Y; break; case 3: -- X; break
; case 4: ++X; break; } if (Y<1||Y>=y<:-2:>||X<2||X>=*y||y<:-2
:>>=y<: -1 :>|| *y>=1<:y:>){ if(*p&&!(*y>=1<:y:>||y<:-2:>>=y<:
-1:>)){ if(Y <1||Y>=y<:-2:>)Y=Y<1?y<:-2:>-1:1; if(X<2||X>=*y)X
=X<2?*y- 1:2 ; } else{ E(Z(OUCH!)); goto y; } } for(I=0; !4<:p
:>&&I <A; ++I)if(Y == e<:I:>&&X==n<:I:>){ E(Z(OW!)); goto y; }
if(Y== *V &&X==*U)B(1); else{ if(W&& !(++1<:p:>%W) )H<:2:>(
0) ; if( 3 <:p:>){ if(!( ++p<:2:>% 3<:p:>)){ H <:1:>(G); 2 <:p
:> = 0 ; } else S (0);} else S ( 0); } goto x; y:E( NULL ) ;
printf (J free ( e ); free (n) ; return 0 ;}