# More games at calcplex.com
g='miss'
a='quit'
Z=Exception
Y=list
U=str
P=range
J=len
E=False
B=True
import random as h
try:import ti_draw as C,ti_system as K,time as b;Q=B
except ImportError:Q=E
i,j,k,l=0,1,2,3
V={25:i,26:j,34:k,24:l}
F=45,
L=[('CLASSIC',.46,.17,.16,E,'HISMC'),('SPEED',.3,.1,.09,E,'HISMS'),('REVERSE',.46,.17,.16,B,'HISMR')]
def m(randint):return randint(0,3)
def n(seq,randint):seq.append(m(randint));return seq
def o(seq,reverse):return Y(reversed(seq))if reverse else Y(seq)
def p(round_num,mode):A,D,B,A,A,A=mode;C=D-(round_num-1)*.02;return B if C<B else C
c=[((120,26,26),(255,66,66)),((26,58,122),(86,148,255)),((22,100,38),(78,244,118)),((122,100,22),(255,226,74))]
M=14,16,22
W=210,216,228
G=26
X=[(129,26,60,60),(189,86,60,60),(129,146,60,60),(69,86,60,60)]
N,O=159,116
def R(k):
	try:return int(k)
	except(ValueError,TypeError):return 0
def A(c):C.set_color(c[0],c[1],c[2])
def D(y,txt):C.draw_text((319-(J(txt)*10-2))//2,y,txt)
def d(cx,y,txt):C.draw_text(cx-(J(txt)*10-2)//2,y,txt)
def H(t):
	if t<=0:return R(K.get_key(0))in F
	A=b.monotonic()
	while b.monotonic()-A<t:
		if R(K.get_key(0))in F:return B
	return E
def I(i,lit):B,D,E,F=X[i];G,H=c[i];A(H if lit else G);C.fill_rect(B,D,E,F)
def e(round_num):A(M);C.fill_rect(N-30,O-30,60,60);A((120,128,145));d(N,O-8,'RND');A(W);d(N,O+16,U(round_num))
def q(mode_name,phase):A((22,26,36));C.fill_rect(0,0,319,G-1);A((120,128,145));C.draw_text(6,20,mode_name);S(phase)
def S(phase):
	B=phase;A((22,26,36));C.fill_rect(150,0,169,G-1)
	if B:A(W);C.draw_text(319-(J(B)*10-2)-6,20,B)
def r(mode_name,round_num,phase):
	A(M);C.fill_rect(0,0,319,209)
	for B in P(4):I(B,E)
	e(round_num);q(mode_name,phase)
def s():
	while B:
		A=R(K.get_key(0))
		if A!=0:return A
def T():
	while R(K.get_key(0))!=0:pass
	return s()
def f(name):
	if not Q:return 0
	try:return int(Y(K.recall_list(name))[0])
	except Z:return 0
def t(name,v):
	if Q:
		try:K.store_list(name,[float(v)])
		except Z:pass
def u(seq,mode,round_num):
	if H(.45):return B
	C=p(round_num,mode);D=mode[3]
	for A in seq:
		I(A,B)
		if H(C):return B
		I(A,E)
		if H(D):return B
	return E
def v(expected):
	for D in expected:
		A=T()
		if A in F:return a
		if A not in V:
			while A not in V and A not in F:A=T()
			if A in F:return a
		C=V[A];I(C,B);H(.13);I(C,E)
		if C!=D:return g
	return'ok'
def w(seq):
	for C in P(2):
		for A in P(4):I(A,B)
		H(.12)
		for A in P(4):I(A,E)
		H(.1)
def x(mode):
	G='WATCH';D=mode;I=D[0];K=D[4];A=[];C=0;r(I,1,G)
	while B:
		n(A,h.randint);e(J(A));S(G)
		if u(A,D,J(A)):return C,B
		S('YOUR TURN');F=v(o(A,K))
		if F==a:return C,B
		if F==g:w(A);return C,E
		C+=1;S('GOOD!')
		if H(.4):return C,B
def y():
	A(M);C.fill_rect(0,0,319,209);E=[(139,26),(169,46),(139,66),(109,46)]
	for B in P(4):A(c[B][1]);C.fill_rect(E[B][0],E[B][1],24,24)
	A((235,238,245));D(112,'S I M O N');A((150,158,172));D(134,'Watch the pattern, repeat it');A((120,128,145));D(182,'<- -> mode    ENTER play');D(200,'Arrows = pads    CLEAR quit')
def z(sel):
	A(M);C.fill_rect(0,140,319,18);F=L[sel][0];B=f(L[sel][5]);A((255,226,120));E='< '+F+' >'
	if B>0:E+='    BEST '+U(B)
	D(160,E)
def A0(sel):
	A=sel;y()
	while B:
		z(A);C=T()
		if C in F:return-1
		if C==105:return A
		if C==24:A=(A-1)%J(L)
		elif C==26:A=(A+1)%J(L)
def A1(score,hi,best_new):
	A(M);C.fill_rect(0,0,319,209);A((255,92,92));D(52,'GAME OVER');A(W);D(92,'Rounds  '+U(score))
	if best_new:A((120,244,140));D(118,'NEW BEST!')
	else:A((235,205,90));D(118,'Best  '+U(hi))
	A((120,128,145));D(164,'ENTER = play again');D(188,'CLEAR = quit');B=T();return B not in F
def A2(sw,sh):
	global X,N,O,G;G=26;D=sw//2;E=G+(sh-G)//2;F=sh-G;A=min(64,(F-8)//3);C=(F-A)//2-1
	if C<A//2+2:C=A//2+2
	B=A//2;X=[(D-B,E-C-B,A,A),(D+C-B,E-B,A,A),(D-B,E+C-B,A,A),(D-C-B,E-B,A,A)];N,O=D,E
def A3():
	try:J,K=C.get_screen_dim();A2(J,K)
	except Z:pass
	A=0
	while B:
		A=A0(A)
		if A<0:break
		F=L[A];G=F[5];D=f(G);H=B
		while H:
			E,M=x(F)
			if M:break
			I=E>D
			if I:D=E;t(G,D)
			H=A1(E,D,I)
	C.clear()
if Q:A3()