i'm using the canned colors ("pink", "orange", etc). should i try changing to explicit color specifications to see if that makes a difference? i'm not sure what the other guy meant by a "soft toy", but i take it the idea is to try and construct a correctness proof for the script, and see what keeps it (the proof) from working. it's a sound idea, of course, but the script is pretty darn straightforward, as you can see (below). anyway, i'll let you know how it turns out.
peace ############################ green = 'green' orange = 'orange' pink = 'pink' yellow = 'yellow' red = 'red' blue = 'blue' fb = 'frontback' ud = 'updown' lr = 'leftright' def select(x,a,b): return b[a.index(x)] def frontback(orientation): return select(orientation,[fb,ud,lr],[fb,lr,ud]) def updown(orientation): return select(orientation,[fb,ud,lr],[lr,ud,fb]) def leftright(orientation): return select(orientation,[fb,ud,lr],[ud,fb,lr]) class cell: def __init__(self, circlecolor, pointercolor, orientation, coordinates): self.circlecolor = circlecolor self.pointercolor = pointercolor self.orientation = orientation self.coordinates = coordinates def endpoint(self): a,b = self.coordinates if self.orientation==fb: if abs(a)==1: return [2*a,2*b] if abs(a)==2: return [a/2,b/2] if self.orientation==ud: return [+a,-b] if self.orientation==lr: return [-a,+b] class cube: def __init__(self): self.ful = cell(green, blue, fb, [-2,+2]) self.fur = cell(orange, blue, fb, [+2,+2]) self.fdl = cell(pink, blue, fb, [-2,-2]) self.fdr = cell(yellow, blue, fb, [+2,-2]) self.bul = cell(green, red, fb, [-1,+1]) self.bur = cell(orange, red, fb, [+1,+1]) self.bdl = cell(pink, red, fb, [-1,-1]) self.bdr = cell(yellow, red, fb, [+1,-1]) self.cells = [self.ful,self.fur,self.fdl,self.fdr,self.bul,self.bur,self.bdl,self.bdr] def redraw(self,*cells): for x in cells: A = x.coordinates B = x.endpoint() erase(*A) drawpointer(color=x.pointercolor,*(A+B)) drawcircle(color=x.circlecolor,*A) def display(self): self.redraw(*self.cells) def cycle(self,a,b,c,d,funct): x = d.circlecolor y = d.pointercolor z = funct(d.orientation) d.circlecolor = c.circlecolor d.pointercolor = c.pointercolor d.orientation = funct(c.orientation) c.circlecolor = b.circlecolor c.pointercolor = b.pointercolor c.orientation = funct(b.orientation) b.circlecolor = a.circlecolor b.pointercolor = a.pointercolor b.orientation = funct(a.orientation) a.circlecolor = x a.pointercolor = y a.orientation = z rubik = cube() def F1_(): rubik.cycle(rubik.ful,rubik.fur,rubik.fdr,rubik.fdl,frontback) def F2_(): rubik.cycle(rubik.fdl,rubik.fdr,rubik.fur,rubik.ful,frontback) def B1_(): rubik.cycle(rubik.bdl,rubik.bdr,rubik.bur,rubik.bul,frontback) def B2_(): rubik.cycle(rubik.bul,rubik.bur,rubik.bdr,rubik.bdl,frontback) def U1_(): rubik.cycle(rubik.bul,rubik.bur,rubik.fur,rubik.ful,updown) def U2_(): rubik.cycle(rubik.ful,rubik.fur,rubik.bur,rubik.bul,updown) def D1_(): rubik.cycle(rubik.bdl,rubik.bdr,rubik.fdr,rubik.fdl,updown) def D2_(): rubik.cycle(rubik.fdl,rubik.fdr,rubik.bdr,rubik.bdl,updown) def L1_(): rubik.cycle(rubik.ful,rubik.bul,rubik.bdl,rubik.fdl,leftright) def L2_(): rubik.cycle(rubik.fdl,rubik.bdl,rubik.bul,rubik.ful,leftright) def R1_(): rubik.cycle(rubik.fur,rubik.bur,rubik.bdr,rubik.fdr,leftright) def R2_(): rubik.cycle(rubik.fdr,rubik.bdr,rubik.bur,rubik.fur,leftright) def F1(): F1_(); rubik.redraw(rubik.ful,rubik.fur,rubik.fdr,rubik.fdl) def F2(): F2_(); rubik.redraw(rubik.fdl,rubik.fdr,rubik.fur,rubik.ful) def B1(): B1_(); rubik.redraw(rubik.bdl,rubik.bdr,rubik.bur,rubik.bul) def B2(): B2_(); rubik.redraw(rubik.bul,rubik.bur,rubik.bdr,rubik.bdl) def U1(): U1_(); rubik.redraw(rubik.bul,rubik.bur,rubik.fur,rubik.ful) def U2(): U2_(); rubik.redraw(rubik.ful,rubik.fur,rubik.bur,rubik.bul) def D1(): D1_(); rubik.redraw(rubik.bdl,rubik.bdr,rubik.fdr,rubik.fdl) def D2(): D2_(); rubik.redraw(rubik.fdl,rubik.fdr,rubik.bdr,rubik.bdl) def L1(): L1_(); rubik.redraw(rubik.ful,rubik.bul,rubik.bdl,rubik.fdl) def L2(): L2_(); rubik.redraw(rubik.fdl,rubik.bdl,rubik.bul,rubik.ful) def R1(): R1_(); rubik.redraw(rubik.fur,rubik.bur,rubik.bdr,rubik.fdr) def R2(): R2_(); rubik.redraw(rubik.fdr,rubik.bdr,rubik.bur,rubik.fur) def solve(): rubik.__init__() rubik.display() def scramble(): n = 15 from random import randint f = [F1_,F2_,B1_,B2_,U1_,U2_,D1_,D2_,L1_,L2_,R1_,R2_] for i in range(n): f[randint(0,11)]() rubik.display() canvaswidth = 380 canvasheight = 330 def coordinates(x,y): return (canvaswidth/2+68*x),(canvasheight/2-68*y) def drawcircle(x,y,color): r = (20,15)[abs(x)==1] a,b = coordinates(x,y) canvas.create_oval(a-r,b-r,a+r,b+r,fill=color) def drawpointer(x1,y1,x2,y2,color): a1,b1 = coordinates(x1,y1) a2,b2 = coordinates(float(x1+x2)/2,float(y1+y2)/2) canvas.create_line(a1,b1,a2,b2,width=2,fill=color,arrow=LAST) def erase(x,y): a,b = coordinates(x,y) p = canvas.find_overlapping(a-10,b-10,a+10,b+10) q = [x for x in p if canvas.type(x) in ('oval','line')] for x in q: canvas.delete(x) def drawbackground(): A = coordinates(+1,+1) B = coordinates(+1,-1) C = coordinates(-1,+1) D = coordinates(-1,-1) E = coordinates(+2,+2) F = coordinates(+2,-2) G = coordinates(-2,+2) H = coordinates(-2,-2) canvas.create_polygon(fill='',outline='black',*(C+A+E+G+C)) canvas.create_polygon(fill='',outline='black',*(C+G+H+D+C)) canvas.create_polygon(fill='',outline='black',*(A+E+F+B+A)) canvas.create_polygon(fill='',outline='black',*(H+F+B+D+H)) from Tkinter import * root = Tk() ######################################################## back = Frame(root,borderwidth=3) back.pack(side=TOP) Button(back,text='<<<<',command=B1).pack(side=LEFT) Label(back,width=10,text='BACK').pack(side=LEFT) Button(back,text='>>>>',command=B2).pack(side=LEFT) ######################################################## top = Frame(root,borderwidth=3) top.pack(side=TOP) Button(top,text='<<<<',command=U1).pack(side=LEFT) Label(top,width=10,text='TOP').pack(side=LEFT) Button(top,text='>>>>',command=U2).pack(side=LEFT) ######################################################## mid = Frame(root) mid.pack(side=TOP) left = Frame(mid,borderwidth=5) left.pack(side=LEFT) Button(left,text='^\n^',width=3,command=L1).pack(side=TOP) Label(left,height=6,text='L\nE\nF\nT').pack(side=TOP) Button(left,text='v\nv',width=3,command=L2).pack(side=TOP) canvas = Canvas(mid,width=canvaswidth,height=canvasheight) canvas.pack(side=LEFT,expand=1,fill=BOTH) right = Frame(mid,borderwidth=5) right.pack(side=LEFT) Button(right,text='^\n^',width=3,command=R1).pack(side=TOP) Label(right,height=6,text='R\nI\nG\nH\nT').pack(side=TOP) Button(right,text='v\nv',width=3,command=R2).pack(side=TOP) ######################################################## bottom = Frame(root,borderwidth=3) bottom.pack(side=TOP) Button(bottom,text='<<<<',command=D1).pack(side=LEFT) Label(bottom,width=10,text='BOTTOM').pack(side=LEFT) Button(bottom,text='>>>>',command=D2).pack(side=LEFT) ######################################################## front = Frame(root,borderwidth=3) front.pack(side=TOP) Button(front,text='<<<<',command=F1).pack(side=LEFT) Label(front,width=10,text='FRONT').pack(side=LEFT) Button(front,text='>>>>',command=F2).pack(side=LEFT) ######################################################## ctrl = Frame(root,borderwidth=20) ctrl.pack(side=TOP) Button(ctrl,text='SOLVE',command=solve).pack(side=LEFT) Label(ctrl,width=3,text='').pack(side=LEFT) Button(ctrl,text='SCRAMBLE',command=scramble).pack(side=LEFT) ######################################################## root.title('rubik') drawbackground() rubik.display() root.mainloop() -- http://mail.python.org/mailman/listinfo/python-list