#include <curses.h>
#include <stdlib.h>
#define V(a,b) rand()%(b-(a))+a
#define L(a,b,c) for(a=b;a<c;++a)
#define M m[r][c]
#define E 16
#define f 46
#define w 35
int l,R[E],C[E];main(){int i,r,c,k,d;char *s,m[E][E];initscr();cbreak();srand(time(0));keypad(stdscr,1);A:L(r,0,E)L(c,0,E)M=r&&r<15&&c&&c<15?f:w;r=V(2,13);c=V(2,13);L(i,1,E)m[r][i]=m[i][c]=w;m[r][V(1,c)]=m[r][V(c+1,14)]=m[V(1,r)][c]=m[V(r+1,14)][c]=f;while(m[r=V(1,E)][c=V(1,E)]^f);M=60;++l;L(i,0,(l<E?l+1:E)){while(r=V(1,E),c=V(1,E),M^f);R[i]=r;C[i]=c;M=i?'e':64;}while(1)L(i,0,E){r=R[i];c=C[i];if(i){if(!r)goto B;d=(*R-r>0)-(*R-r<0);k=m[r+d][c];r+=k^64&&k^f?0:d;k=R[i]^r?0:(*C-c>0)-(*C-c<0);d=m[r][c+k];c+=d^64&&d^f?0:k;if(s="Died",M==64)goto Q;}else{L(k,0,E)mvaddnstr(k,0,m[k],E);k=getch();k^258||++r;k^259||--r;k^260||--c;k^261||++c;if(s="Quit",k=='q')goto Q;if(M==60)goto A;if(M^'e'&&M^f)break;if(M^f)L(k,0,E)if(R[k]==r&&C[k]==c){M=f;R[k]=0;goto B;}}M^f||(M=i?'e':64,m[R[i]][C[i]]=f,R[i]=r,C[i]=c);B:;}Q:endwin();printf("%s on level %d.\n",s,l);exit(0);}
