# More games at ti84calcwiz.com
AF=Exception
A2='caught'
w='m'
v='won'
u=max
q='ey'
p='ex'
o=str
h='t'
f='v'
e='my'
d='mx'
c=False
a='n'
Z='w'
Y=min
V=len
S=int
M='f'
L='y'
J='x'
I=True
E=range
import random
try:import ti_draw as A,ti_system as i;r=I
except ImportError:r=c
D=11
F=[0,1,0,-1]
G=[-1,0,1,0]
def AG(rand):
	K=[[15]*D for A in E(D)];L=[[c]*D for A in E(D)];L[0][0]=I;H=[(0,0)]
	while H:
		M,N=H[-1];J=[]
		for A in E(4):
			B,C=M+F[A],N+G[A]
			if 0<=B<D and 0<=C<D and not L[C][B]:J.append(A)
		if not J:H.pop();continue
		A=J[rand(0,V(J)-1)];B,C=M+F[A],N+G[A];K[N][M]&=~(1<<A);K[C][B]&=~(1<<(A+2)%4);L[C][B]=I;H.append((B,C))
	return K
def AH(w,rand,pct=55):
	for B in E(D):
		for C in E(D):
			K=0
			for A in E(4):
				if w[B][C]&1<<A:K+=1
			if K==3 and rand(1,100)<=pct:
				H=[]
				for A in E(4):
					I,J=C+F[A],B+G[A]
					if w[B][C]&1<<A and 0<=I<D and 0<=J<D:H.append(A)
				if H:A=H[rand(0,V(H)-1)];I,J=C+F[A],B+G[A];w[B][C]&=~(1<<A);w[J][I]&=~(1<<(A+2)%4)
def A3(w,sx,sy):
	A=[[-1]*D for A in E(D)];A[sy][sx]=0;B=[(sx,sy)];C=0
	while C<V(B):
		H,I=B[C];C+=1
		for J in E(4):
			if w[I][H]&1<<J:continue
			K,L=H+F[J],I+G[J]
			if A[L][K]<0:A[L][K]=A[I][H]+1;B.append((K,L))
	return A
def AI(rand,braid_pct=55,cadence=0):
	K=AG(rand);AH(K,rand,braid_pct);C=A3(K,0,0);F,G,H=0,0,0
	for A in E(D):
		for B in E(D):
			if C[A][B]>H:H=C[A][B];F,G=B,A
	N,O,H=F,G,-1
	for A in E(D):
		for B in E(D):
			if C[A][B]>H and(B,A)!=(F,G)and abs(B-F)+abs(A-G)>=4:H=C[A][B];N,O=B,A
	P=[[c]*D for A in E(D)];P[0][0]=I;Q=1 if not K[0][0]&2 else 2;return{Z:K,J:0,L:0,M:Q,p:F,q:G,d:N,e:O,f:P,a:0,h:C[O][N],'md':cadence}
def AJ(st):
	A=st;H=A[M]
	if A[Z][A[L]][A[J]]&1<<H:return'bump'
	A[J]+=F[H];A[L]+=G[H];A[a]+=1;A[f][A[L]][A[J]]=I
	if A[J]==A[p]and A[L]==A[q]:return v
	B=A3(A[Z],A[J],A[L]);Q=1;R=A.get('md',0)
	if R and A[a]%R==0:Q=2
	for T in E(Q):
		K,N=A[d],A[e];S,C=B[N][K],-1
		for D in E(4):
			if A[Z][N][K]&1<<D:continue
			O,P=K+F[D],N+G[D]
			if B[P][O]>=0 and B[P][O]<S:S,C=B[P][O],D
		if C>=0:A[d]+=F[C];A[e]+=G[C]
		A[h]=B[A[e]][A[d]]
		if A[h]==0:return A2
	return'ok'
def AK(st,depth):
	A,B,C=st[J],st[L],st[M];D=[]
	for I in E(depth):
		H=bool(st[Z][B][A]&1<<C);D.append((A,B,H))
		if H:break
		A+=F[C];B+=G[C]
	return D
P,b=319,209
Q=20
R,j=159,114
l=[1.,.54,.33,.21,.135]
W=4
K=[]
for A4 in E(W+1):A5=S(159*l[A4]);A6=S(94*l[A4]);K.append((R-A5,R+A5,j-A6,j+A6))
def T(c,f):return S(c[0]*f),S(c[1]*f),S(c[2]*f)
X=[1.,.8,.63,.49,.38]
AL=[(214,182,130),(198,126,98),(148,182,122),(134,154,194),(188,144,176),(124,182,172)]
def U(w,x,y,dr):
	A=dr
	if A==2:y+=1;A=0
	elif A==1:x+=1;A=3
	B=0 if A==0 else 1;return AL[(x*13+y*29+B*7)%6]
A7=30,26,44
A8=100,88,64
s=18,14,26
g=244,202,66
A9=128,26,22
AM=255,230,80
def B(c):A.set_color(c[0],c[1],c[2])
def H(y,txt):A.draw_text((P-(V(txt)*10-2))//2,y,txt)
def x(w,x,y,f):
	A=0
	while not w[y][x]&1<<f:x+=F[f];y+=G[f];A+=1
	return x,y,A
def AA(w,ax,aw,k,cx2,cy2,f,sdir):
	Q=sdir;P=aw;H=ax;Z,j=K[k+1][2],K[k+1][3];q,r,A3=x(w,cx2,cy2,f);m=k+1+A3;a=Y(m,W);J,O=K[a][2],K[a][3]
	if J-Z>=2 and j-O>=2:B(A7);A.fill_rect(H,Z,P,J-Z+1);B(A8);A.fill_rect(H,O,P,j-O+1)
	else:J,O=Z,j
	b=-1 if Q==(f+3)%4 else 1;n=X[a]*(1. if m<=W else .55);B(T(U(w,q,r,f),n));A.fill_rect(H,J,P,O-J);s=159*l[a];t=c
	for d in E(1,D):
		v=R+b*S(s*(2*d-1));y=R+b*S(s*(2*d+1));C=u(Y(v,y),H);L=Y(u(v,y),H+P-1);e=q+F[Q]*(d-1);g=r+G[Q]*(d-1)
		if L-C<2 or not(0<=e<D and 0<=g<D):
			if t:break
			continue
		t=I
		if w[g][e]&1<<f:B(T(U(w,e,g,f),n))
		else:A4,A5,A6=x(w,e,g,f);B(T(U(w,A4,A5,f),n*.5))
		A.fill_rect(C,J,L-C+1,O-J)
	o,p=cx2,cy2
	for M in E(k+1,Y(m,W)):
		o+=F[f];p+=G[f]
		if not w[p][o]&1<<Q:continue
		N=R+b*S(159*l[M]*3);V=R+b*S(159*l[M+1]*3)
		if N==V:continue
		C=u(Y(N,V),H);L=Y(u(N,V),H+P-1)
		if L-C<3:continue
		h,i=K[M][2],K[M][3];z,A0=K[M+1][2],K[M+1][3];A1=(C-N)*1000//(V-N);A2=(L-N)*1000//(V-N);B(T(U(w,o,p,Q),X[M]*.55));A.fill_poly([C,L,L,C],[h+(z-h)*A1//1000,h+(z-h)*A2//1000,i+(A0-i)*A2//1000,i+(A0-i)*A1//1000])
def k(st):
	a=st;B(A7);A.fill_rect(0,Q,P,j-Q);B(A8);A.fill_rect(0,j,P,b-j-1);H=a[M];h,i=(H+3)%4,(H+1)%4;D=a[Z];k=AK(a,W);s=[]
	for C in E(V(k)):
		J,L,A6=k[C]
		if(J,L)==(a[p],a[q])and C>0:s.append(('exit',C))
		if(J,L)==(a[d],a[e])and C>0:s.append(('mino',C))
		Y,f,n,N=K[C];O,S,I,c=K[C+1];A0=D[L][J];A1=A0&1<<h;A2=A0&1<<i
		if A1:B(T(U(D,J,L,h),X[C]*.62));A.fill_poly([Y,O,O,Y],[n,I,c,N])
		if A2:B(T(U(D,J,L,i),X[C]*.62));A.fill_poly([f,S,S,f],[n,I,c,N])
		if not A1:
			t,u=J+F[h],L+G[h]
			if D[u][t]&1<<H:B(T(U(D,t,u,H),X[C+1]));A.fill_rect(Y,I,O-Y+1,c-I)
			else:AA(D,Y,O-Y+1,C,t,u,H,h)
		if not A2:
			v,w=J+F[i],L+G[i]
			if D[w][v]&1<<H:B(T(U(D,v,w,H),X[C+1]));A.fill_rect(S,I,f-S+1,c-I)
			else:AA(D,S,f-S+1,C,v,w,H,i)
		if A6:B(T(U(D,J,L,H),X[C+1]));A.fill_rect(O,I,S-O+1,c-I)
	if not k[-1][2]and V(k)==W:J,L,AE=k[-1];AB,AC,AF=x(D,J,L,H);O,S,I,c=K[W];B(T(U(D,AB,AC,H),X[W]*.55));A.fill_rect(O,I,S-O+1,c-I)
	B((140,122,96));A.draw_text(4,b-3,'ENTER = MAP')
	for(AD,C)in s:
		Y,f,n,N=K[C];A3,y=f-Y,N-n
		if AD=='exit':A4=A3*2//5;A5=y*7//10;B(g);A.fill_rect(R-A4//2,N-A5,A4,A5)
		else:
			z=A3//3;l=y*5//10;B(A9);A.fill_rect(R-z//2,N-l,z,l);o=z*2//3;r=y//5;A.fill_rect(R-o//2,N-l-r,o,r)
			if C<=2:B(AM);m=3 if C<2 else 2;A.fill_rect(R-o//4-m,N-l-r*2//3,m,m);A.fill_rect(R+o//4,N-l-r*2//3,m,m)
AN=['N','E','S','W']
AO=[([0,-6,6],[-7,5,5]),([7,-5,-5],[0,-6,6]),([0,-6,6],[7,-5,-5]),([-7,5,5],[0,-6,6])]
y=[('ROAR!!',(255,70,50)),('GROWLING',(250,150,40)),('FOOTSTEPS',(235,210,90)),('',(110,110,130))]
def AP(dist):A=dist;return 0 if A<=3 else 1 if A<=5 else 2 if A<=8 else 3
def AQ():B(s);A.fill_rect(0,0,P,Q)
def z(st,force=c):
	H=force;C=st;F=C.setdefault('h',{});G=AP(C[h])
	if H or F.get('b')!=G:
		F['b']=G;B(s);A.fill_rect(0,0,140,Q);B((52,48,66))
		for D in E(4):A.fill_rect(4+D*9,12-D*3,6,5+D*3)
		B(y[G][1])
		for D in E(4-G):A.fill_rect(4+D*9,12-D*3,6,5+D*3)
		if y[G][0]:A.draw_text(44,20,y[G][0])
	if H or F.get(M)!=C[M]:F[M]=C[M];B(s);A.fill_rect(140,0,46,Q);B((150,170,210));I,J=152,10;K,L=AO[C[M]];A.fill_poly([I+K[0],I+K[1],I+K[2]],[J+L[0],J+L[1],J+L[2]]);A.draw_text(168,20,AN[C[M]])
	if H or F.get('s')!=C[a]:F['s']=C[a];N=o(C[a]);B(s);A.fill_rect(P-62,0,62,Q);B((190,190,205));A.draw_text(P-4-V(N)*10,20,N)
C=15
N=(P-D*C)//2
O=Q+2
t=88,78,96
AR=235,80,60
def A0(st):D=st;B(AR);A.fill_rect(N+D[J]*C+4,O+D[L]*C+4,C-8,C-8);B((255,220,210));E=D[M];H=N+D[J]*C+C//2;I=O+D[L]*C+C//2;A.fill_rect(H-1+F[E]*4,I-1+G[E]*4,3,3)
def AS(st,ox,oy):
	D=st;B(t);A.fill_rect(N+ox*C+2,O+oy*C+2,C-4,C-4);A.fill_rect(N+D[J]*C+2,O+D[L]*C+2,C-4,C-4);E=N+Y(ox,D[J])*C+2;F=O+Y(oy,D[L])*C+2
	if ox!=D[J]:A.fill_rect(E,F+2,2*C-4,C-8)
	else:A.fill_rect(E+2,F,C-8,2*C-4)
	A0(D)
def AT(st):B(t);A.fill_rect(N+st[J]*C+2,O+st[L]*C+2,C-4,C-4);A0(st)
def AB(st):
	D=st;G=D.setdefault('h',{});H=G.get(w)
	if H:
		E,F=H;B(t if D[f][F][E]else(12,12,18));A.fill_rect(N+E*C+2,O+F*C+2,C-4,C-4)
		if(E,F)==(D[p],D[q]):B(g);A.fill_rect(N+E*C+3,O+F*C+3,C-6,C-6)
		G[w]=None
	if D[h]<=3:B(A9);A.fill_rect(N+D[d]*C+3,O+D[e]*C+3,C-6,C-6);G[w]=D[d],D[e]
def AC(st):
	G=st;B((12,12,18));A.fill_rect(0,Q,P,b-Q-1);B((150,150,170));A.draw_text(4,b-3,'WALK HERE OR ENTER = 3D');B(t)
	for H in E(D):
		F=0
		while F<D:
			if not G[f][H][F]:F+=1;continue
			I=F
			while I+1<D and G[f][H][I+1]and not G[Z][H][I]&2:I+=1
			A.fill_rect(N+F*C+2,O+H*C+2,(I-F)*C+C-4,C-4);F=I+1
	for H in E(D-1):
		for F in E(D):
			if G[f][H][F]and G[f][H+1][F]and not G[Z][H][F]&4:A.fill_rect(N+F*C+4,O+H*C+C-4,C-8,8)
	B(g);A.fill_rect(N+G[p]*C+3,O+G[q]*C+3,C-6,C-6);G.setdefault('h',{})[w]=None;AB(G);A0(G)
def A1(k):
	try:return S(k)
	except(ValueError,TypeError):return 0
def m():
	while A1(i.get_key(0))!=0:pass
	while I:
		A=A1(i.get_key(0))
		if A!=0:
			while A1(i.get_key(0))!=0:pass
			return A
n=[('NORMAL',0,55,'HMINN'),('HUNTER',3,55,'HMINH'),('NIGHTMARE',2,40,'HMINX')]
def AD(name):
	if not r:return 0
	try:return S(list(i.recall_list(name))[0])
	except AF:return 0
def AU(name,v):
	if r:
		try:i.store_list(name,[float(v)])
		except AF:pass
def AE(sel):B((14,12,22));A.fill_rect(40,152,240,26);B(g);D=n[sel][0];C=AD(n[sel][3]);E='< '+D+' >'+('   best '+o(C)if C else'');H(172,E)
def AV(sel):
	C=sel;B((14,12,22));A.fill_rect(0,0,P,b);B(g);H(46,'M I N O T A U R');B((190,180,200));H(78,'Something lives down here.');H(98,'Find the gold door. Get out.');B((150,150,170));H(126,'UP = walk      < > = turn');H(146,'DOWN turns around  ENTER = map');AE(C);B((120,200,130));H(200,'ENTER start    CLEAR quit')
	while I:
		D=m()
		if D==45:return-1
		if D==105:return C
		if D in(24,26):C=(C+(1 if D==26 else-1))%V(n);AE(C)
def AW():B((14,12,22));A.fill_rect(0,0,P,b);B((255,90,60));H(40,'HOW IT HUNTS');B((200,195,210));H(76,'It always knows where you are.');H(96,'Each step you WALK, it walks.');H(116,'Turning and the map are FREE --');H(136,'it only moves when you move.');B((235,210,90));H(164,'More bars top-left = closer.');B((120,200,130));H(196,'Press any key...');m()
def AX(lines,cols):
	C=lines;D,F=224,40+26*V(C);J=(P-D)//2;G=Q+(b-Q-F)//2;B((240,226,190));A.fill_rect(J,G,D,F);B((24,18,30));A.fill_rect(J+3,G+3,D-6,F-6)
	for I in E(V(C)):B(cols[I]);H(G+30+26*I,C[I])
	return m()
def AY(mode):
	K,E,F,N=n[mode];A=AI(random.randint,F,E);AQ();k(A);z(A,I);B=c
	while I:
		C=m()
		if C==45:return'quit',0,A
		if C==105:
			B=not B
			if B:AC(A)
			else:k(A)
			continue
		if C in(24,26,34):
			A[M]=(A[M]+{24:3,26:1,34:2}[C])%4
			if B:AT(A)
			else:k(A)
			z(A)
		elif C==25:
			G,H=A[J],A[L];D=AJ(A)
			if D==v:return v,A[a],A
			if D==A2:
				if not B:k(A)
				return A2,A[a],A
			if D!='bump':
				if B:AS(A,G,H);AB(A)
				else:k(A)
			z(A)
def AZ():
	P='CLEAR menu';O='ENTER again  DOWN map';N='Steps  ';E=c;B=0
	while I:
		B=AV(B)
		if B<0:break
		if not E:AW();E=I
		F=I
		while F:
			G,D,H=AY(B)
			if G=='quit':break
			if G==v:
				J=n[B][3];C=AD(J)
				if C==0 or D<C:C=D;AU(J,C)
				K=['YOU ESCAPED!',N+o(D),'Best   '+o(C),O,P];L=[(120,220,130),(230,230,240),g,(150,170,200),(150,170,200)]
			else:K=['IT FOUND YOU',N+o(D),O,P];L=[(255,80,60),(230,230,240),(150,170,200),(150,170,200)]
			while I:
				M=AX(K,L)
				if M==34:H[h]=0;AC(H);m();continue
				F=M==105;break
	A.clear()
if r:AZ()