rubiks_cube.py

Created by ojddjo

Created on March 11, 2023

12 KB

Model of a rubiks cube


import random
from kandinsky import fill_rect as fill

moves = ("U", "U'", "U2", "D", "D'", "D2", "L", "L'", "L2", "R", "R'", "R2", "F", "F'", "F2", "B", "B'", "B2")

def getScramble(times):
    scramble = ""
    lastMoves = [" ", " "]
    while len(scramble.split(sep=" ")) <= times:
        move = moves[random.randint(0, len(moves)-1)]
        if not move[0] in lastMoves:
            scramble += move + " "
            lastMoves[1] = lastMoves[0]
            lastMoves[0] = move[0]
    return scramble

class Cube():
    #cube 3x3x3 model
    def __init__(self):
        self.cube = [[[0 for i in range(3)] for j in range(3)] for k in range(6)]
        #white = 0, yellow = 1, red = 2, orange = 3, green = 4, blue = 5
        self.cube[0] = [[0 for i in range(3)] for j in range(3)] #white UP
        self.cube[1] = [[4 for i in range(3)] for j in range(3)] #green FRONT
        self.cube[2] = [[1 for i in range(3)] for j in range(3)] #yellow DOWN
        self.cube[3] = [[3 for i in range(3)] for j in range(3)] #orange LEFT
        self.cube[4] = [[2 for i in range(3)] for j in range(3)] #red RIGHT
        self.cube[5] = [[5 for i in range(3)] for j in range(3)] #blue BACK


    def drawCube(self, scramble):
        #draw cube pattern
        #get colors from cube model
        colors = {
            0: (255, 255, 255),
            1: (255, 255, 0),
            2: (255, 0, 0),
            3: (255, 165, 0),
            4: (0, 255, 0),
            5: (0, 0, 255)
        }
        matrix = self.getMatrix(scramble)
        #draw cube pattern on image
        #draw UP face
        pos = [95, 0]
        for i in range(3):
            for j in range(3):
                fill(pos[0]+j*30, pos[1]+i*30, pos[0]+(j+1)*30, pos[1]+(i+1)*30, colors[matrix[0][i][j]])
        #draw FRONT face
        pos = [95, 95]
        for i in range(3):
            for j in range(3):
                fill(pos[0]+j*30, pos[1]+i*30, pos[0]+(j+1)*30, pos[1]+(i+1)*30, colors[matrix[1][i][j]])
        #draw DOWN face
        pos = [95, 190]
        for i in range(3):
            for j in range(3):
                fill(pos[0]+j*30, pos[1]+i*30, pos[0]+(j+1)*30, pos[1]+(i+1)*30, colors[matrix[2][i][j]])
        #draw LEFT face
        pos = [0, 95]
        for i in range(3):
            for j in range(3):
                fill(pos[0]+j*30, pos[1]+i*30, pos[0]+(j+1)*30, pos[1]+(i+1)*30, colors[matrix[3][i][j]])
        #draw RIGHT face
        pos = [190, 95]
        for i in range(3):
            for j in range(3):
                fill(pos[0]+j*30, pos[1]+i*30, pos[0]+(j+1)*30, pos[1]+(i+1)*30, colors[matrix[4][i][j]])
        #draw BACK face
        pos = [285, 95]
        for i in range(3):
            for j in range(3):
                fill(pos[0]+j*30, pos[1]+i*30, pos[0]+(j+1)*30, pos[1]+(i+1)*30, colors[matrix[5][i][j]])

    def getMatrix(self, scramble:str):
        for move in scramble.split(" "):
            if move == "U":
                self.rotateU()
            elif move == "U'":
                self.rotateUp()
            elif move == "U2":
                self.rotateU2()
            elif move == "D":
                self.rotateD()
            elif move == "D'":
                self.rotateDp()
            elif move == "D2":
                self.rotateD2()
            elif move == "F":
                self.rotateF()
            elif move == "F'":
                self.rotateFp()
            elif move == "F2":
                self.rotateF2()
            elif move == "B":
                self.rotateB()
            elif move == "B'":
                self.rotateBp()
            elif move == "B2":
                self.rotateB2()
            elif move == "L":
                self.rotateL()
            elif move == "L'":
                self.rotateLp()
            elif move == "L2":
                self.rotateL2()
            elif move == "R":
                self.rotateR()
            elif move == "R'":
                self.rotateRp()
            elif move == "R2":
                self.rotateR2()
        return self.cube
    
    #rotation functions
    #self.cube[face][row][column]
    def rotateL(self):
        for i in range(3):
            self.cube[0][i][0], self.cube[1][i][0], self.cube[2][i][0], self.cube[5][2-i][2] = self.cube[5][2-i][2], self.cube[0][i][0], self.cube[1][i][0], self.cube[2][i][0]
        #rotation of LEFT face 2 times clockwise
        for i in range(2):
            self.cube[3][0][0], self.cube[3][0][1], self.cube[3][0][2], self.cube[3][1][2], self.cube[3][2][2], self.cube[3][2][1], self.cube[3][2][0], self.cube[3][1][0] = self.cube[3][1][0], self.cube[3][0][0], self.cube[3][0][1], self.cube[3][0][2], self.cube[3][1][2], self.cube[3][2][2], self.cube[3][2][1], self.cube[3][2][0]

    def rotateLp(self):
        for i in range(3):
            self.cube[0][i][0], self.cube[1][i][0], self.cube[2][i][0], self.cube[5][2-i][2] = self.cube[1][i][0], self.cube[2][i][0], self.cube[5][2-i][2], self.cube[0][i][0]
        #rotation of LEFT face 2 times counter-clockwise
        for i in range(2):
            self.cube[3][0][0], self.cube[3][0][1], self.cube[3][0][2], self.cube[3][1][2], self.cube[3][2][2], self.cube[3][2][1], self.cube[3][2][0], self.cube[3][1][0] = self.cube[3][0][1], self.cube[3][0][2], self.cube[3][1][2], self.cube[3][2][2], self.cube[3][2][1], self.cube[3][2][0], self.cube[3][1][0], self.cube[3][0][0]

    def rotateR(self):
        for i in range(3):
            self.cube[0][i][2], self.cube[1][i][2], self.cube[2][i][2], self.cube[5][2-i][0] = self.cube[1][i][2], self.cube[2][i][2], self.cube[5][2-i][0], self.cube[0][i][2]
        #rotation of RIGHT face 2 times clockwise
        for i in range(2):
            self.cube[4][0][0], self.cube[4][0][1], self.cube[4][0][2], self.cube[4][1][2], self.cube[4][2][2], self.cube[4][2][1], self.cube[4][2][0], self.cube[4][1][0] = self.cube[4][1][0], self.cube[4][0][0], self.cube[4][0][1], self.cube[4][0][2], self.cube[4][1][2], self.cube[4][2][2], self.cube[4][2][1], self.cube[4][2][0]

    def rotateRp(self):
        for i in range(3):
            self.cube[0][i][2], self.cube[1][i][2], self.cube[2][i][2], self.cube[5][2-i][0] = self.cube[5][2-i][0], self.cube[0][i][2], self.cube[1][i][2], self.cube[2][i][2]
        #rotation of RIGHT face 2 times counter-clockwise
        for i in range(2):
            self.cube[4][0][0], self.cube[4][0][1], self.cube[4][0][2], self.cube[4][1][2], self.cube[4][2][2], self.cube[4][2][1], self.cube[4][2][0], self.cube[4][1][0] = self.cube[4][0][1], self.cube[4][0][2], self.cube[4][1][2], self.cube[4][2][2], self.cube[4][2][1], self.cube[4][2][0], self.cube[4][1][0], self.cube[4][0][0]

    def rotateU(self):
        for i in range(3):
            self.cube[1][0][i], self.cube[3][0][i], self.cube[5][0][i], self.cube[4][0][i] = self.cube[4][0][i], self.cube[1][0][i], self.cube[3][0][i], self.cube[5][0][i]
        #rotation of UP face 2 times clockwise
        for i in range(2):
            self.cube[0][0][0], self.cube[0][0][1], self.cube[0][0][2], self.cube[0][1][2], self.cube[0][2][2], self.cube[0][2][1], self.cube[0][2][0], self.cube[0][1][0] = self.cube[0][1][0], self.cube[0][0][0], self.cube[0][0][1], self.cube[0][0][2], self.cube[0][1][2], self.cube[0][2][2], self.cube[0][2][1], self.cube[0][2][0]

    def rotateUp(self):
        for i in range(3):
            self.cube[1][0][i], self.cube[3][0][i], self.cube[5][0][i], self.cube[4][0][i] = self.cube[3][0][i], self.cube[5][0][i], self.cube[4][0][i], self.cube[1][0][i]
        #rotation of UP face 2 times counter-clockwise
        for i in range(2):
            self.cube[0][0][0], self.cube[0][0][1], self.cube[0][0][2], self.cube[0][1][2], self.cube[0][2][2], self.cube[0][2][1], self.cube[0][2][0], self.cube[0][1][0] = self.cube[0][0][1], self.cube[0][0][2], self.cube[0][1][2], self.cube[0][2][2], self.cube[0][2][1], self.cube[0][2][0], self.cube[0][1][0], self.cube[0][0][0]

    def rotateD(self):
        for i in range(3):
            self.cube[1][2][i], self.cube[3][2][i], self.cube[5][2][i], self.cube[4][2][i] = self.cube[3][2][i], self.cube[5][2][i], self.cube[4][2][i], self.cube[1][2][i]
        #rotation of DOWN face 2 times clockwise
        for i in range(2):
            self.cube[2][0][0], self.cube[2][0][1], self.cube[2][0][2], self.cube[2][1][2], self.cube[2][2][2], self.cube[2][2][1], self.cube[2][2][0], self.cube[2][1][0] = self.cube[2][1][0], self.cube[2][0][0], self.cube[2][0][1], self.cube[2][0][2], self.cube[2][1][2], self.cube[2][2][2], self.cube[2][2][1], self.cube[2][2][0]

    def rotateDp(self):
        for i in range(3):
            self.cube[1][2][i], self.cube[3][2][i], self.cube[5][2][i], self.cube[4][2][i] = self.cube[4][2][i], self.cube[1][2][i], self.cube[3][2][i], self.cube[5][2][i]
        #rotation of DOWN face 2 times counter-clockwise
        for i in range(2):
            self.cube[2][0][0], self.cube[2][0][1], self.cube[2][0][2], self.cube[2][1][2], self.cube[2][2][2], self.cube[2][2][1], self.cube[2][2][0], self.cube[2][1][0] = self.cube[2][0][1], self.cube[2][0][2], self.cube[2][1][2], self.cube[2][2][2], self.cube[2][2][1], self.cube[2][2][0], self.cube[2][1][0], self.cube[2][0][0]

    def rotateF(self):
        for i in range(3):
            self.cube[0][2][i], self.cube[3][2-i][2], self.cube[2][0][2-i], self.cube[4][i][0] = self.cube[3][2-i][2], self.cube[2][0][2-i], self.cube[4][i][0], self.cube[0][2][i]
        #rotation of FRONT face 2 times clockwise
        for i in range(2):
            self.cube[1][0][0], self.cube[1][0][1], self.cube[1][0][2], self.cube[1][1][2], self.cube[1][2][2], self.cube[1][2][1], self.cube[1][2][0], self.cube[1][1][0] = self.cube[1][1][0], self.cube[1][0][0], self.cube[1][0][1], self.cube[1][0][2], self.cube[1][1][2], self.cube[1][2][2], self.cube[1][2][1], self.cube[1][2][0]
    
    def rotateFp(self):
        for i in range(3):
            self.cube[0][2][i], self.cube[3][2-i][2], self.cube[2][0][2-i], self.cube[4][i][0] = self.cube[4][i][0], self.cube[0][2][i], self.cube[3][2-i][2], self.cube[2][0][2-i]
        #rotation of FRONT face 2 times counter-clockwise
        for i in range(2):
            self.cube[1][0][0], self.cube[1][0][1], self.cube[1][0][2], self.cube[1][1][2], self.cube[1][2][2], self.cube[1][2][1], self.cube[1][2][0], self.cube[1][1][0] = self.cube[1][0][1], self.cube[1][0][2], self.cube[1][1][2], self.cube[1][2][2], self.cube[1][2][1], self.cube[1][2][0], self.cube[1][1][0], self.cube[1][0][0]

    def rotateB(self):
        for i in range(3):
            self.cube[0][0][i], self.cube[4][i][2], self.cube[2][2][2-i], self.cube[3][2-i][0] = self.cube[4][i][2], self.cube[2][2][2-i], self.cube[3][2-i][0], self.cube[0][0][i]
        #rotation of BACK face 2 times clockwise
        for i in range(2):
            self.cube[5][0][0], self.cube[5][0][1], self.cube[5][0][2], self.cube[5][1][2], self.cube[5][2][2], self.cube[5][2][1], self.cube[5][2][0], self.cube[5][1][0] = self.cube[5][1][0], self.cube[5][0][0], self.cube[5][0][1], self.cube[5][0][2], self.cube[5][1][2], self.cube[5][2][2], self.cube[5][2][1], self.cube[5][2][0]
    
    def rotateBp(self):
        for i in range(3):
            self.cube[0][0][i], self.cube[4][i][2], self.cube[2][2][2-i], self.cube[3][2-i][0] = self.cube[3][2-i][0], self.cube[0][0][i], self.cube[4][i][2], self.cube[2][2][2-i]
        #rotation of BACK face 2 times counter-clockwise
        for i in range(2):
            self.cube[5][0][0], self.cube[5][0][1], self.cube[5][0][2], self.cube[5][1][2], self.cube[5][2][2], self.cube[5][2][1], self.cube[5][2][0], self.cube[5][1][0] = self.cube[5][0][1], self.cube[5][0][2], self.cube[5][1][2], self.cube[5][2][2], self.cube[5][2][1], self.cube[5][2][0], self.cube[5][1][0], self.cube[5][0][0]

    def rotateL2(self):
        self.rotateL()
        self.rotateL()
    
    def rotateR2(self):
        self.rotateR()
        self.rotateR()
    
    def rotateU2(self):
        self.rotateU()
        self.rotateU()
    
    def rotateD2(self):
        self.rotateD()
        self.rotateD()
    
    def rotateF2(self):
        self.rotateF()
        self.rotateF()
    
    def rotateB2(self):
        self.rotateB()
        self.rotateB()

cube = Cube()
cube.drawCube(getScramble(15))