Advertisement
Guest User

Rubik's cube simulator in Python

a guest
Aug 30th, 2012
231
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 8.58 KB | None | 0 0
  1.  
  2. colors = ["W", "Y", "G", "B", "O", "R"]
  3. dirs = ["U", "D", "F", "B", "L", "R"]
  4.  
  5. class Node:
  6.     def __init__(self, coloration):
  7.         """Create a single part of the cube,
  8.        
  9.        Node([Up, Down, Front, Back, Left, Right])"""
  10.        
  11.         self.coloration = coloration
  12.    
  13.    
  14.     def get_side(self, side):
  15.         return self.coloration[dirs.index(side)]
  16.    
  17.     def set_side(self, side1, side2, color = ""):
  18.         """Set color of side. If side2 != "" then it swaps side1 and side2 colors"""
  19.         if side2 == "" or side2 == " ":
  20.             self.coloration[dirs.index(side1)] = color
  21.         else:
  22.             self.coloration[dirs.index(side1)] = self.coloration[dirs.index(side2)]
  23.        
  24.     def rotate(self, axis, clockwise = True):
  25.         """Rotate a single cubelet 90 degrees"""
  26.         if not clockwise:
  27.             self.rotate(axis, True)
  28.             self.rotate(axis, True)
  29.             self.rotate(axis, True)
  30.             return
  31.            
  32.         if axis == "X":
  33.             t = self.get_side("B")
  34.             self.set_side("B", "U")
  35.             self.set_side("U", "F")
  36.             self.set_side("F", "D")
  37.             self.set_side("D", "", t)
  38.            
  39.         if axis == "Z":
  40.             t = self.get_side("B")
  41.             self.set_side("B", "L")
  42.             self.set_side("L", "F")
  43.             self.set_side("F", "R")
  44.             self.set_side("R", "", t)
  45.            
  46.         if axis == "Y":
  47.             t = self.get_side("L")
  48.             self.set_side("L", "D")
  49.             self.set_side("D", "R")
  50.             self.set_side("R", "U")
  51.             self.set_side("U", "", t)
  52.    
  53.     def __repr__(self):
  54.        
  55.         return "Node({})".format(repr(["{}={}".format(a,b) for a,b in zip(dirs, self.coloration)]))
  56.            
  57. class Cube:
  58.     def __init__(self):
  59.         self.cube = [[[Node([" "]*6) for _ in xrange(3)] for _ in xrange(3)] for _ in xrange(3)]
  60.         sr = [(i,j) for i in range(3) for j in range(3)]
  61.        
  62.         for x,y in sr:
  63.             self.cube[x][y][0].set_side("D", "", "Y")
  64.             self.cube[x][y][2].set_side("U", "", "W")
  65.            
  66.         for x,z in sr:
  67.             self.cube[x][0][z].set_side("F", "", "G")
  68.             self.cube[x][2][z].set_side("B", "", "B")
  69.            
  70.         for y,z in sr:
  71.             self.cube[0][y][z].set_side("L", "", "O")
  72.             self.cube[2][y][z].set_side("R", "", "R")
  73.    
  74.     def rotate(self, face, clockwise = True):
  75.    
  76.         if not clockwise:
  77.             self.rotate(face)
  78.             self.rotate(face)
  79.             self.rotate(face)
  80.             return
  81.            
  82.         sr = [(i,j) for i in range(3) for j in range(3)]
  83.        
  84.         if face == "U":
  85.             for x,y in sr:
  86.                 self.cube[x][y][2].rotate("Z")
  87.            
  88.             t = self.cube[0][0][2]
  89.            
  90.             self.cube[0][0][2] = self.cube[2][0][2]
  91.             self.cube[2][0][2] = self.cube[2][2][2]
  92.             self.cube[2][2][2] = self.cube[0][2][2]
  93.             self.cube[0][2][2] = t
  94.            
  95.             t = self.cube[1][0][2]
  96.            
  97.             self.cube[1][0][2] = self.cube[2][1][2]
  98.             self.cube[2][1][2] = self.cube[1][2][2]
  99.             self.cube[1][2][2] = self.cube[0][1][2]
  100.             self.cube[0][1][2] = t
  101.        
  102.         if face == "D":
  103.             for x,y in sr:
  104.                 self.cube[x][y][0].rotate("Z", False)
  105.                
  106.  
  107.            
  108.             t = self.cube[0][0][0]
  109.            
  110.             self.cube[0][0][0] = self.cube[0][2][0]
  111.             self.cube[0][2][0] = self.cube[2][2][0]
  112.             self.cube[2][2][0] = self.cube[2][0][0]
  113.             self.cube[2][0][0] = t
  114.            
  115.             t = self.cube[1][0][0]
  116.            
  117.             self.cube[1][0][0] = self.cube[0][1][0]
  118.             self.cube[0][1][0] = self.cube[1][2][0]
  119.             self.cube[1][2][0] = self.cube[2][1][0]
  120.             self.cube[2][1][0] = t
  121.            
  122.         if face == "F":
  123.            
  124.             for x,z in sr:
  125.                 self.cube[x][0][z].rotate("Y")
  126.                
  127.             t = self.cube[0][0][0]
  128.            
  129.             self.cube[0][0][0] = self.cube[2][0][0]
  130.             self.cube[2][0][0] = self.cube[2][0][2]
  131.             self.cube[2][0][2] = self.cube[0][0][2]
  132.             self.cube[0][0][2] = t
  133.            
  134.             t = self.cube[1][0][0]
  135.            
  136.             self.cube[1][0][0] = self.cube[2][0][1]
  137.             self.cube[2][0][1] = self.cube[1][0][2]
  138.             self.cube[1][0][2] = self.cube[0][0][1]
  139.             self.cube[0][0][1] = t
  140.        
  141.         if face == "B":
  142.             for x,z in sr:
  143.                 self.cube[x][2][z].rotate("Y", False)
  144.                
  145.             t = self.cube[0][2][0]
  146.            
  147.             self.cube[0][2][0] = self.cube[0][2][2]
  148.             self.cube[0][2][2] = self.cube[2][2][2]
  149.             self.cube[2][2][2] = self.cube[2][2][0]
  150.             self.cube[2][2][0] = t
  151.            
  152.             t = self.cube[1][2][0]
  153.            
  154.             self.cube[1][2][0] = self.cube[0][2][1]
  155.             self.cube[0][2][1] = self.cube[1][2][2]
  156.             self.cube[1][2][2] = self.cube[2][2][1]
  157.             self.cube[2][2][1] = t
  158.            
  159.         if face == "L":
  160.             for y,z in sr:
  161.                 self.cube[0][y][z].rotate("X", False)
  162.            
  163.             t = self.cube[0][0][0]
  164.            
  165.             self.cube[0][0][0] = self.cube[0][0][2]
  166.             self.cube[0][0][2] = self.cube[0][2][2]
  167.             self.cube[0][2][2] = self.cube[0][2][0]
  168.             self.cube[0][2][0] = t
  169.            
  170.             t = self.cube[0][0][1]
  171.            
  172.             self.cube[0][0][1] = self.cube[0][1][2]
  173.             self.cube[0][1][2] = self.cube[0][2][1]
  174.             self.cube[0][2][1] = self.cube[0][1][0]
  175.             self.cube[0][1][0] = t
  176.            
  177.         if face == "R":
  178.             for y,z in sr:
  179.                 self.cube[2][y][z].rotate("X")
  180.                
  181.             t = self.cube[2][0][0]
  182.            
  183.             self.cube[2][0][0] = self.cube[2][2][0]
  184.             self.cube[2][2][0] = self.cube[2][2][2]
  185.             self.cube[2][2][2] = self.cube[2][0][2]
  186.             self.cube[2][0][2] = t
  187.            
  188.             t = self.cube[2][1][0]
  189.            
  190.             self.cube[2][1][0] = self.cube[2][2][1]
  191.             self.cube[2][2][1] = self.cube[2][1][2]
  192.             self.cube[2][1][2] = self.cube[2][0][1]
  193.             self.cube[2][0][1] = t
  194.    
  195.     def execute_moves(self, moves):
  196.         charlist = "UDFBLR"
  197.        
  198.         if isinstance(moves, str):
  199.             move_list = []
  200.             i = 0
  201.            
  202.             while i < len(moves):
  203.                 if moves[i] not in charlist:
  204.                     i+=1
  205.                     continue
  206.                    
  207.                 basic = moves[i]
  208.                 i+=1
  209.                
  210.                 if i < len(moves) and moves[i] == "'":
  211.                     move_list.append((basic, False))
  212.                     i+=1
  213.                 elif i < len(moves) and moves[i] == "2":
  214.                     move_list.append((basic, True))
  215.                     move_list.append((basic, True))
  216.                     i+=1
  217.                 else:
  218.                     move_list.append((basic, True))
  219.            
  220.             moves = move_list
  221.            
  222.        
  223.         for side, clockwise in moves:
  224.             self.rotate(side, clockwise)
  225.    
  226.     def __str__(self):
  227.         """
  228.            U U U /        
  229.          U U U / R      
  230.        U U U / R R
  231.        F F F|R R R
  232.        F F F|R R
  233.        F F F|R
  234.        
  235.        """
  236.         rn = [0,1,2]
  237.         rb = [2,1,0]
  238.        
  239.         up =    [[self.cube[x][y][2].get_side("U") for x in rn] for y in rb]
  240.         front = [[self.cube[x][0][z].get_side("F") for x in rn] for z in rb]
  241.         right = [[self.cube[2][y][z].get_side("R") for y in rn] for z in rb]
  242.        
  243.        
  244.         grid = [[" " for _ in xrange(11)] for _ in xrange(6)]
  245.        
  246.         for i, row in enumerate(up):
  247.             for j, color in enumerate(row):
  248.                 grid[i][2*(2 - i) + 2*j] = color
  249.        
  250.         for i, row in enumerate(front):
  251.             for j, color in enumerate(row):
  252.                 grid[i + 3][2*j] = color
  253.        
  254.         for i, row in enumerate(right):
  255.             for j, color in enumerate(row):
  256.                 grid[3 - j + i][6 + 2*j] = color
  257.        
  258.         grid[0][10] = "/"
  259.         grid[1][8] = "/"
  260.         grid[2][6] = "/"
  261.         grid[3][5] = "|"
  262.         grid[4][5] = "|"
  263.         grid[5][5] = "|"
  264.        
  265.         return "\n".join("".join(s for s in row) for row in grid)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement