from OpenGL.GL import *
from OpenGL.GLUT import *
from OpenGL.GLU import *
from random import *
from math import *
from time import *
import sys
def R(x,y):
 m[x][y][2]=1
 k=[]
 if x>0: k.append((x-1,y))
 if x<30: k.append((x+1,y))
 else: m[x+1][y][0]=1
 if y>0: k.append((x,y-1))
 if y<30: k.append((x,y+1))
 else: m[x][y+1][1]=1
 while len(k):
  n=randint(0,len(k)-1)
  a,b=k[n]
  k.remove(k[n])
  if not m[a][b][2]: 
   if a<x:
    m[x][y][1]=1
   if a>x:
    m[a][b][1]=1
   if b<y:
    m[x][y][0]=1
   if b>y:
    m[a][b][0]=1
   R(a,b)
def D():
 global o,p,k,l,T,F,G,H,I,P,A,B,n,c,d
 O=clock()
 if not B and A!=1:
  if A=='i' and m[o][p+1][0]:
   d=0
   p=p+1
  if A=='k' and m[o][p][0]:
   d=180
   p=p-1
  if A=='l' and m[o][p][1]:
   d=-90
   o=o-1
  if A=='j' and m[o+1][p][1]:
   d=90
   o=o+1
  A=1
  if n-o+c-p: B=B+1
 elif not B%3: B=0
 else: B=B+1
 if not B:
  n=o
  c=p
 
 if (o==k)*(p==l):
  T=T*.9
  F=(9*F+o+1)*.1
  G=(9*G+p+1)*.1
 else: 
  T=18
  F=(9*F+o-9)*.1
  G=(9*G+p-12)*.1
 if T<1:
  print 'time: ',clock()-P, ":D "*5
  sys.exit(0)
 H=(4*H+o)*.2
 I=(4*I+p)*.2
 glClear(16640)
 glMatrixMode(5889)
 glLoadIdentity()
 gluPerspective(45,1.3,.1,190)
 gluLookAt(F,T,G,H,0,I,0,1,0)
 glMatrixMode(5888)
 glLoadIdentity()
 glTranslate(n+.5+(o-n)*B/3.,.5,c+.5+(p-c)*B/3.)
 glRotate(d,0,1,0)
 glRotate(30*B,1,0,0)
 glColor(0,0,1)
 glutSolidCube(.8)
 
 glLoadIdentity()
 glColor(1,0,0)
 glTranslate(k+.5,.5,l+.5)
 glutSolidCube(.8)
 glLoadIdentity()
 a=0
 glBegin(7)
 for a in range(32):
  b=0
  for b in range(32):
   if not m[a][b][0]:
    glColor(0,.5,0)
    glVertex(a,1,b)
    glVertex(a+1,1,b)
    glColor(0,.3,0)
    glVertex(a+1,0,b)
    glVertex(a,0,b)
   if not m[a][b][1]:
    glColor(0,.5,0)
    glVertex(a,1,b)
    glVertex(a,1,b+1)
    glColor(0,.3,0)
    glVertex(a,0,b+1)
    glVertex(a,0,b)
 glEnd()
 glutSwapBuffers()
 while clock()-O<.05: pass; 
def K(*b):
 global A
 A=b[0]
glutInit([])
glutInitDisplayMode(26)
glutInitWindowSize(640,480)
glutCreateWindow('')
glutDisplayFunc(D)
glutKeyboardFunc(K)
glutIdleFunc(D)
m=[]
for a in range(32):
 l=[]
 for b in range(32):
  l.append([0]*3)
 m.append(l)
A=d=B=n=c=o=p=0
l=randint(9,30)
k=randint(9,30)
F,G,H,I=(200,200,o,p)
R(k,l)
m[31][31]=[1]*3
glEnable(2929)
P=clock()
glutMainLoop()

