
f00 = [76.79491924311228, 150, 134.52994616207485, 183.33333333333334, 134.52994616207485, 250, 76.79491924311228, 216.66666666666669]
f01 = [134.52994616207485, 183.33333333333334, 192.26497308103743, 216.66666666666669, 192.26497308103743, 283.33333333333337, 134.52994616207485, 250]
f02 = [192.26497308103743, 216.66666666666669, 250, 250, 250, 316.6666666666667, 192.26497308103743, 283.33333333333337]
f10 = [76.79491924311228, 216.66666666666669, 134.52994616207485, 250, 134.52994616207485, 316.6666666666667, 76.79491924311228, 283.33333333333337]
f11 = [134.52994616207485, 250, 192.26497308103743, 283.3333333333333, 192.26497308103743, 350.0, 134.52994616207485, 316.6666666666667]
f12 = [192.26497308103743, 283.3333333333333, 250.0, 316.66666666666663, 250.0, 383.3333333333333, 192.26497308103743, 350.0]
f20 = [76.79491924311228, 283.33333333333337, 134.52994616207485, 316.6666666666667, 134.52994616207485, 383.33333333333337, 76.79491924311228, 350.00000000000006]
f21 = [134.52994616207485, 316.66666666666663, 192.26497308103743, 349.99999999999994, 192.26497308103743, 416.66666666666663, 134.52994616207485, 383.3333333333333]
f22 = [192.26497308103743, 350, 250.0, 383.3333333333333, 250.0, 450.0, 192.26497308103743, 416.6666666666667]
u20 = [76.79491924311228, 150, 134.52994616207485, 116.66666666666666, 192.26497308103743, 150, 134.52994616207485, 183.33333333333331]
u10 = [134.52994616207485, 116.66666666666666, 192.26497308103743, 83.33333333333331, 250.0, 116.66666666666666, 192.26497308103743, 150.0]
u00 = [192.26497308103743, 83.33333333333333, 250.0, 49.99999999999999, 307.7350269189626, 83.33333333333333, 250.0, 116.66666666666666]
u21 = [134.52994616207485, 183.33333333333334, 192.26497308103743, 150.0, 250.0, 183.33333333333334, 192.26497308103743, 216.66666666666669]
u11 = [192.26497308103743, 150, 250.0, 116.66666666666666, 307.7350269189626, 150, 250.0, 183.33333333333331]
u01 = [250.0, 116.66666666666666, 307.7350269189626, 83.33333333333331, 365.47005383792515, 116.66666666666666, 307.7350269189626, 150.0]
u22 = [192.26497308103743, 216.66666666666669, 250.0, 183.33333333333334, 307.7350269189626, 216.66666666666669, 250.0, 250.0]
u12 = [250.0, 183.33333333333334, 307.7350269189626, 150.0, 365.47005383792515, 183.33333333333334, 307.7350269189626, 216.66666666666669]
u02 = [307.7350269189626, 150, 365.4700538379252, 116.66666666666666, 423.20508075688775, 150, 365.4700538379252, 183.33333333333331]
r00 = [250, 250, 307.7350269189626, 216.66666666666666, 307.7350269189626, 283.3333333333333, 250, 316.6666666666667]
r01 = [307.7350269189626, 216.66666666666666, 365.4700538379252, 183.33333333333331, 365.4700538379252, 250.0, 307.7350269189626, 283.3333333333333]
r02 = [365.47005383792515, 183.33333333333331, 423.2050807568877, 149.99999999999997, 423.2050807568877, 216.66666666666663, 365.47005383792515, 250.0]
r10 = [250, 316.6666666666667, 307.7350269189626, 283.33333333333337, 307.7350269189626, 350.00000000000006, 250, 383.33333333333337]
r11 = [307.7350269189626, 283.3333333333333, 365.4700538379252, 249.99999999999997, 365.4700538379252, 316.66666666666663, 307.7350269189626, 350.0]
r12 = [365.47005383792515, 250, 423.2050807568877, 216.66666666666666, 423.2050807568877, 283.3333333333333, 365.47005383792515, 316.6666666666667]
r20 = [250, 383.33333333333337, 307.7350269189626, 350.00000000000006, 307.7350269189626, 416.66666666666674, 250, 450.00000000000006]
r21 = [307.7350269189626, 350, 365.4700538379252, 316.6666666666667, 365.4700538379252, 383.33333333333337, 307.7350269189626, 416.6666666666667]
r22 = [365.47005383792515, 316.6666666666667, 423.2050807568877, 283.33333333333337, 423.2050807568877, 350.00000000000006, 365.47005383792515, 383.33333333333337]
F00 = [76.79491924311228, 150, 134.52994616207485, 116.66666666666666, 134.52994616207485, 183.33333333333331, 76.79491924311228, 216.66666666666669]
F01 = [134.52994616207485, 116.66666666666666, 192.26497308103743, 83.33333333333331, 192.26497308103743, 150.0, 134.52994616207485, 183.33333333333331]
F02 = [192.26497308103743, 83.33333333333333, 250.0, 49.99999999999999, 250.0, 116.66666666666666, 192.26497308103743, 150.0]
F10 = [76.79491924311228, 216.66666666666669, 134.52994616207485, 183.33333333333334, 134.52994616207485, 250.0, 76.79491924311228, 283.33333333333337]
F11 = [134.52994616207485, 183.33333333333334, 192.26497308103743, 150.0, 192.26497308103743, 216.66666666666669, 134.52994616207485, 250.0]
F12 = [192.26497308103743, 150, 250.0, 116.66666666666666, 250.0, 183.33333333333331, 192.26497308103743, 216.66666666666669]
F20 = [76.79491924311228, 283.33333333333337, 134.52994616207485, 250.00000000000003, 134.52994616207485, 316.6666666666667, 76.79491924311228, 350.00000000000006]
F21 = [134.52994616207485, 250, 192.26497308103743, 216.66666666666666, 192.26497308103743, 283.3333333333333, 134.52994616207485, 316.6666666666667]
F22 =  [192.26497308103743, 216.66666666666666, 250.0, 183.33333333333331, 250.0, 250.0, 192.26497308103743, 283.3333333333333]
R00 = [250, 50, 307.7350269189626, 83.33333333333334, 307.7350269189626, 150.0, 250, 116.66666666666667]
R01 = [307.7350269189626, 83.33333333333334, 365.4700538379252, 116.66666666666669, 365.4700538379252, 183.33333333333337, 307.7350269189626, 150.0]
R02 = [365.47005383792515, 116.66666666666667, 423.2050807568877, 150.0, 423.2050807568877, 216.66666666666669, 365.47005383792515, 183.33333333333334]
R10 = [250, 116.66666666666667, 307.7350269189626, 150.0, 307.7350269189626, 216.66666666666669, 250, 183.33333333333334]
R11 = [307.7350269189626, 150, 365.4700538379252, 183.33333333333334, 365.4700538379252, 250.0, 307.7350269189626, 216.66666666666669]
R12 = [365.47005383792515, 183.33333333333334, 423.2050807568877, 216.66666666666669, 423.2050807568877, 283.33333333333337, 365.47005383792515, 250.0]
R20 = [250, 183.33333333333334, 307.7350269189626, 216.66666666666669, 307.7350269189626, 283.33333333333337, 250, 250.0]
R21 = [307.7350269189626, 216.66666666666666, 365.4700538379252, 250.0, 365.4700538379252, 316.6666666666667, 307.7350269189626, 283.3333333333333]
R22 = [365.47005383792515, 250, 423.2050807568877, 283.3333333333333, 423.2050807568877, 350.0, 365.47005383792515, 316.6666666666667]
D00 = [76.79491924311228, 350, 134.52994616207485, 316.6666666666667, 192.26497308103743, 350, 134.52994616207485, 383.33333333333337]
D01 = [134.52994616207485, 316.6666666666667, 192.26497308103743, 283.33333333333337, 250.0, 316.6666666666667, 192.26497308103743, 350.00000000000006]
D02 = [192.26497308103743, 283.3333333333333, 250.0, 249.99999999999997, 307.7350269189626, 283.3333333333333, 250.0, 316.66666666666663]
D10 = [134.52994616207485, 383.3333333333333, 192.26497308103743, 350.0, 250.0, 383.3333333333333, 192.26497308103743, 416.6666666666667]
D11 = [192.26497308103743, 350, 250.0, 316.6666666666667, 307.7350269189626, 350, 250.0, 383.33333333333337]
D12 = [250.0, 316.6666666666667, 307.7350269189626, 283.33333333333337, 365.47005383792515, 316.6666666666667, 307.7350269189626, 350.00000000000006]
D20 = [192.26497308103743, 416.6666666666667, 250.0, 383.33333333333337, 307.7350269189626, 416.6666666666667, 250.0, 450.00000000000006]
D21 = [250, 383.3333333333333, 307.7350269189626, 350.0, 365.47005383792515, 383.3333333333333, 307.7350269189626, 416.6666666666667]
D22 = [307.7350269189626, 350, 365.4700538379252, 316.6666666666667, 423.20508075688775, 350, 365.4700538379252, 383.33333333333337]
from tkinter import *
import time
from color_information import create_color_information
from whether_gameover import whether_the_game_is_over
from scramble import scramble
from move_a_face import move_the_up_face_CW
from move_a_face import move_the_up_face_ACW
from move_a_face import move_the_down_face_CW
from move_a_face import move_the_down_face_ACW
from move_a_face import move_the_left_face_CW
from move_a_face import move_the_left_face_ACW
from move_a_face import move_the_right_face_CW
from move_a_face import move_the_right_face_ACW
from change_face import change_face_left
from change_face import change_face_right
window = Tk()
window.title('Rubik Cube')
window.geometry('500x630')
window.resizable(width=FALSE,height=FALSE)
canvas = Canvas(window,height=500,width=500,bg='grey')
canvas.pack()
movement_instruction = Canvas(window,height=130,width=500)
movement_instruction.create_text(250,65,text='                           MOVEMENT INSTRUCTIONS:\nR : Right face CLOCK-WISE       r : Right face ANTI-CLOCK-WISE\nL : Left face CLOCK-WISE          l : Left face ANTI-CLOCK-WISE\nU : Up face CLOCK-WISE          u : Up face ANTI-CLOCK-WISE\nD : Down face CLOCK-WISE      d : Down face ANTI-CLOCK-WISE\n                          arrow keys : View the cube\nLeft-click to scramble     Right-click to show the status solved')
movement_instruction.pack()
puzzel = 0
flag = 0
start_time=0
total_move=0
shortest_time=[]
fewest_move=[]
def color_the_cube_WITH_UP(window):   
    canvas.create_polygon(f00,fill='%s'%(FRONT_COLOR[0][0]),outline='black',width=5)
    canvas.create_polygon(f01,fill='%s'%(FRONT_COLOR[0][1]),outline='black',width=5)
    canvas.create_polygon(f02,fill='%s'%(FRONT_COLOR[0][2]),outline='black',width=5)
    canvas.create_polygon(f10,fill='%s'%(FRONT_COLOR[1][0]),outline='black',width=5)
    canvas.create_polygon(f11,fill='%s'%(FRONT_COLOR[1][1]),outline='black',width=5)
    canvas.create_polygon(f12,fill='%s'%(FRONT_COLOR[1][2]),outline='black',width=5)
    canvas.create_polygon(f20,fill='%s'%(FRONT_COLOR[2][0]),outline='black',width=5)
    canvas.create_polygon(f21,fill='%s'%(FRONT_COLOR[2][1]),outline='black',width=5)
    canvas.create_polygon(f22,fill='%s'%(FRONT_COLOR[2][2]),outline='black',width=5)
    
    canvas.create_polygon(u00,fill='%s'%(UP_COLOR[0][0]),outline='black',width=5)
    canvas.create_polygon(u01,fill='%s'%(UP_COLOR[0][1]),outline='black',width=5)
    canvas.create_polygon(u02,fill='%s'%(UP_COLOR[0][2]),outline='black',width=5)
    canvas.create_polygon(u10,fill='%s'%(UP_COLOR[1][0]),outline='black',width=5)
    canvas.create_polygon(u11,fill='%s'%(UP_COLOR[1][1]),outline='black',width=5)
    canvas.create_polygon(u12,fill='%s'%(UP_COLOR[1][2]),outline='black',width=5)
    canvas.create_polygon(u20,fill='%s'%(UP_COLOR[2][0]),outline='black',width=5)
    canvas.create_polygon(u21,fill='%s'%(UP_COLOR[2][1]),outline='black',width=5)
    canvas.create_polygon(u22,fill='%s'%(UP_COLOR[2][2]),outline='black',width=5)
    canvas.create_polygon(r00,fill='%s'%(RIGHT_COLOR[0][0]),outline='black',width=5)
    canvas.create_polygon(r01,fill='%s'%(RIGHT_COLOR[0][1]),outline='black',width=5)
    canvas.create_polygon(r02,fill='%s'%(RIGHT_COLOR[0][2]),outline='black',width=5)
    canvas.create_polygon(r10,fill='%s'%(RIGHT_COLOR[1][0]),outline='black',width=5)
    canvas.create_polygon(r11,fill='%s'%(RIGHT_COLOR[1][1]),outline='black',width=5)
    canvas.create_polygon(r12,fill='%s'%(RIGHT_COLOR[1][2]),outline='black',width=5)
    canvas.create_polygon(r20,fill='%s'%(RIGHT_COLOR[2][0]),outline='black',width=5)
    canvas.create_polygon(r21,fill='%s'%(RIGHT_COLOR[2][1]),outline='black',width=5)
    canvas.create_polygon(r22,fill='%s'%(RIGHT_COLOR[2][2]),outline='black',width=5)
    
    global puzzel
    global total_time
    global total_move
    puzzel = whether_the_game_is_over(UP_COLOR,DOWN_COLOR,FRONT_COLOR,BACK_COLOR,LEFT_COLOR,RIGHT_COLOR)
    if puzzel == 9 and flag==1:
        total_time=int(time.time()-start_time)
        shortest_time.append(total_time)
        fewest_move.append(total_move)
        t=len(shortest_time)
        ave=0
        for i in range (t):
            ave=ave+shortest_time[i]
        ave=int(ave/t)
        canvas.create_rectangle(0,0,500,500,fill='pink')
        canvas.create_text(250,250,text='                          PUZZEL SOLVED !\n\n                         TOTAL TIME : %ss\n                         TOTAL MOVE : %s\n\nPERSONAL BEST : Shortest time:%ss  Fewest move:%s\n                         TIMES SOLVED : %s\n                            AVERAGE : %ss\n\n                  LEFT CLICK TO START AGAIN'%(total_time,total_move,min(shortest_time),min(fewest_move),len(shortest_time),ave))
        total_move=0
def color_the_cube_WITH_DOWN(window):    
    canvas.create_polygon(F00,fill='%s'%(FRONT_COLOR[0][0]),outline='black',width=5)
    canvas.create_polygon(F01,fill='%s'%(FRONT_COLOR[0][1]),outline='black',width=5)
    canvas.create_polygon(F02,fill='%s'%(FRONT_COLOR[0][2]),outline='black',width=5)
    canvas.create_polygon(F10,fill='%s'%(FRONT_COLOR[1][0]),outline='black',width=5)
    canvas.create_polygon(F11,fill='%s'%(FRONT_COLOR[1][1]),outline='black',width=5)
    canvas.create_polygon(F12,fill='%s'%(FRONT_COLOR[1][2]),outline='black',width=5)
    canvas.create_polygon(F20,fill='%s'%(FRONT_COLOR[2][0]),outline='black',width=5)
    canvas.create_polygon(F21,fill='%s'%(FRONT_COLOR[2][1]),outline='black',width=5)
    canvas.create_polygon(F22,fill='%s'%(FRONT_COLOR[2][2]),outline='black',width=5)
    
    canvas.create_polygon(D00,fill='%s'%(DOWN_COLOR[0][0]),outline='black',width=5)
    canvas.create_polygon(D01,fill='%s'%(DOWN_COLOR[0][1]),outline='black',width=5)
    canvas.create_polygon(D02,fill='%s'%(DOWN_COLOR[0][2]),outline='black',width=5)
    canvas.create_polygon(D10,fill='%s'%(DOWN_COLOR[1][0]),outline='black',width=5)
    canvas.create_polygon(D11,fill='%s'%(DOWN_COLOR[1][1]),outline='black',width=5)
    canvas.create_polygon(D12,fill='%s'%(DOWN_COLOR[1][2]),outline='black',width=5)
    canvas.create_polygon(D20,fill='%s'%(DOWN_COLOR[2][0]),outline='black',width=5)
    canvas.create_polygon(D21,fill='%s'%(DOWN_COLOR[2][1]),outline='black',width=5)
    canvas.create_polygon(D22,fill='%s'%(DOWN_COLOR[2][2]),outline='black',width=5)
    canvas.create_polygon(R00,fill='%s'%(RIGHT_COLOR[0][0]),outline='black',width=5)
    canvas.create_polygon(R01,fill='%s'%(RIGHT_COLOR[0][1]),outline='black',width=5)
    canvas.create_polygon(R02,fill='%s'%(RIGHT_COLOR[0][2]),outline='black',width=5)
    canvas.create_polygon(R10,fill='%s'%(RIGHT_COLOR[1][0]),outline='black',width=5)
    canvas.create_polygon(R11,fill='%s'%(RIGHT_COLOR[1][1]),outline='black',width=5)
    canvas.create_polygon(R12,fill='%s'%(RIGHT_COLOR[1][2]),outline='black',width=5)
    canvas.create_polygon(R20,fill='%s'%(RIGHT_COLOR[2][0]),outline='black',width=5)
    canvas.create_polygon(R21,fill='%s'%(RIGHT_COLOR[2][1]),outline='black',width=5)
    canvas.create_polygon(R22,fill='%s'%(RIGHT_COLOR[2][2]),outline='black',width=5)
    
    global puzzel
    global total_time
    global total_move
    puzzel = whether_the_game_is_over(UP_COLOR,DOWN_COLOR,FRONT_COLOR,BACK_COLOR,LEFT_COLOR,RIGHT_COLOR)
    if puzzel == 9 and flag==1:
        total_time=int(time.time()-start_time)
        shortest_time.append(total_time)
        fewest_move.append(total_move)
        t=len(shortest_time)
        ave=0
        for i in range (t):
            ave=ave+shortest_time[i]
        ave=int(ave/t)
        canvas.create_rectangle(0,0,500,500,fill='pink')
        canvas.create_text(250,250,text='                          PUZZEL SOLVED !\n\n                         TOTAL TIME : %ss\n                         TOTAL MOVE : %s\n\nPERSONAL BEST : Shortest time:%ss  Fewest move:%s\n                         TIMES SOLVED : %s\n                            AVERAGE : %ss\n\n                  LEFT CLICK TO START AGAIN'%(total_time,total_move,min(shortest_time),min(fewest_move),len(shortest_time),ave))
        total_move=0
def key_press(event):
    global ud
    global total_move
    dir=(event.keysym).lower()
    if dir in ['r','l','u','d']:
        if dir == 'r':
            move_the_right_face_ACW(RIGHT_COLOR,FRONT_COLOR,BACK_COLOR,UP_COLOR,DOWN_COLOR)
            total_move=total_move+1
        elif dir == 'l':
            move_the_left_face_ACW(FRONT_COLOR,UP_COLOR,DOWN_COLOR,RIGHT_COLOR,LEFT_COLOR)
            total_move=total_move+1
        elif dir == 'u':
            move_the_up_face_ACW(UP_COLOR,FRONT_COLOR,BACK_COLOR,LEFT_COLOR,RIGHT_COLOR)
            total_move=total_move+1
        else:
            move_the_down_face_ACW(DOWN_COLOR,FRONT_COLOR,BACK_COLOR,LEFT_COLOR,RIGHT_COLOR)
            total_move=total_move+1
        
        if ud == 1:
            canvas.delete(ALL)
            color_the_cube_WITH_UP(window)
        else:
            canvas.delete(ALL)
            color_the_cube_WITH_DOWN(window)
      
def UP_FACE_CW(event):
    global ud
    global total_move
    total_move=total_move+1
    move_the_up_face_CW(UP_COLOR,FRONT_COLOR,BACK_COLOR,LEFT_COLOR,RIGHT_COLOR)
    if ud == 1:
        canvas.delete(ALL)
        color_the_cube_WITH_UP(window)
    else:
        canvas.delete(ALL)
        color_the_cube_WITH_DOWN(window)
def DOWN_FACE_CW(event):
    global ud
    global total_move
    total_move=total_move+1
    move_the_down_face_CW(DOWN_COLOR,FRONT_COLOR,BACK_COLOR,LEFT_COLOR,RIGHT_COLOR)
    if ud == 1:
        canvas.delete(ALL)
        color_the_cube_WITH_UP(window)
    else:
        canvas.delete(ALL)
        color_the_cube_WITH_DOWN(window)  
def LEFT_FACE_CW(event):
    global ud
    global total_move
    total_move=total_move+1
    move_the_left_face_CW(FRONT_COLOR,UP_COLOR,DOWN_COLOR,RIGHT_COLOR,LEFT_COLOR)
    if ud == 1:
        canvas.delete(ALL)
        color_the_cube_WITH_UP(window)
    else:
        canvas.delete(ALL)
        color_the_cube_WITH_DOWN(window)
def RIGHT_FACE_CW(event):
    global ud
    global total_move
    total_move=total_move+1
    move_the_right_face_CW(RIGHT_COLOR,FRONT_COLOR,BACK_COLOR,UP_COLOR,DOWN_COLOR)
    if ud == 1:
        canvas.delete(ALL)
        color_the_cube_WITH_UP(window)
    else:
        canvas.delete(ALL)
        color_the_cube_WITH_DOWN(window)
def left_view(event):
    change_face_left(FRONT_COLOR, BACK_COLOR, LEFT_COLOR, RIGHT_COLOR, UP_COLOR, DOWN_COLOR)
    global ud
    if ud == 1:
        canvas.delete(ALL)
        color_the_cube_WITH_UP(window)
    else:
        canvas.delete(ALL)
        color_the_cube_WITH_DOWN(window)
def right_view(event):
    change_face_right(FRONT_COLOR, BACK_COLOR, LEFT_COLOR, RIGHT_COLOR, UP_COLOR, DOWN_COLOR)
    global ud
    if ud == 1:
        canvas.delete(ALL)
        color_the_cube_WITH_UP(window)
    else:
        canvas.delete(ALL)
        color_the_cube_WITH_DOWN(window)
def up_view(event):
    global ud
    ud=1
    canvas.delete(ALL)
    color_the_cube_WITH_UP(window)
def down_view(event):
    global ud
    ud=0
    canvas.delete(ALL)
    color_the_cube_WITH_DOWN(window)
UP_COLOR=[]
DOWN_COLOR=[]
FRONT_COLOR=[]
BACK_COLOR=[]
LEFT_COLOR=[]
RIGHT_COLOR=[]
UP_COLOR,DOWN_COLOR,FRONT_COLOR,BACK_COLOR,LEFT_COLOR,RIGHT_COLOR=create_color_information(UP_COLOR,DOWN_COLOR,FRONT_COLOR,BACK_COLOR,LEFT_COLOR,RIGHT_COLOR)
ud=1
color_the_cube_WITH_UP(window)
def begin_game(enevt):
    scramble(UP_COLOR,DOWN_COLOR,FRONT_COLOR,BACK_COLOR,LEFT_COLOR,RIGHT_COLOR)
    global ud
    global flag
    global start_time
    if ud == 1:
        canvas.delete(ALL)
        color_the_cube_WITH_UP(window)
    else:
        canvas.delete(ALL)
        color_the_cube_WITH_DOWN(window)
    flag=1
    start_time=time.time()
def end_game(enevt):
    global UP_COLOR
    global DOWN_COLOR
    global FRONT_COLOR
    global BACK_COLOR
    global LEFT_COLOR
    global RIGHT_COLOR
    UP_COLOR,DOWN_COLOR,FRONT_COLOR,BACK_COLOR,LEFT_COLOR,RIGHT_COLOR=create_color_information(UP_COLOR,DOWN_COLOR,FRONT_COLOR,BACK_COLOR,LEFT_COLOR,RIGHT_COLOR)
    global ud
    global flag
    global total_move
    flag=0
    total_move=0
    if ud == 1:
        canvas.delete(ALL)
        color_the_cube_WITH_UP(window)
    else:
        canvas.delete(ALL)
        color_the_cube_WITH_DOWN(window)
window.bind('<Key>',key_press)
window.bind('U',UP_FACE_CW)
window.bind('D',DOWN_FACE_CW)
window.bind('L',LEFT_FACE_CW)
window.bind('R',RIGHT_FACE_CW)
window.bind('<Left>',left_view)
window.bind('<Right>',right_view)
window.bind('<Up>',up_view)
window.bind('<Down>',down_view)
window.bind('<Button-1>',begin_game)
window.bind('<Button-3>',end_game)
window.mainloop()