%: include %: include %: include %: include %: 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,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=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 &&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 ;}