Module cubo
[hide private]
[frames] | no frames]

Source Code for Module cubo

  1   
  2  """ 
  3  [cubo.py] 
  4  Clase que maneja el cubo en 3D en openGL. 
  5  """ 
  6   
  7  __author__ = "Victor Ramirez de la Corte" 
  8  __date__ = "23/04/2009" 
  9  __version__ = "PyRubik v0.6.5" 
 10   
 11  from OpenGL.GL import * 
 12  from OpenGL.GLU import * 
 13  from OpenGL.GLUT import * 
 14  import pygame 
 15  from pygame.locals import * 
 16  from gameobjects.matrix44 import * 
 17  import os, sys, random, math 
 18  from texutil import * 
 19  from cube_object import * 
 20  import GL 
 21   
22 -class Cube3D:
23 - def __init__(self):
24 if sys.platform == ('win32' or 'win64'): 25 os.environ['SDL_VIDEO_CENTERED'] = '1' 26 pygame.init() 27 screen = [800,600] 28 #Si no me equivoco inicia una ventana con OpenGL 29 GL.gl_init(*screen) 30 x = 0 31 pygame.display.set_caption("Pyrubik - Press 'i' for instructions") 32 pygame.display.set_icon(pygame.image.load("Images/RubiksCubeIcon.png").convert_alpha())#TODO cambiar icon
33 34 35 #definimos los ejes o algo asi
36 - def vec3(self,vec2,axis):
37 vec3=[0,0,0] 38 if axis[0]!=0: 39 vec3[1],vec3[2]=vec2 40 vec3[0]=axis[0]+1 41 elif axis[1]!=0: 42 vec3[0],vec3[2]=vec2 43 vec3[1]=axis[1]+1 44 elif axis[2]!=0: 45 vec3[0],vec3[1]=vec2 46 vec3[2]=axis[2]+1 47 else: print "ERROR" 48 return vec3
49 50 #rotamos los bloques
51 - def rotate_blocks(self,direction1,direction2,axis):
52 self.cube 53 block_sequence=((0,0),(1,0),(2,0),(2,1),(2,2),(1,2),(0,2),(0,1)) 54 block_sequence=block_sequence[::direction1] 55 t1=self.cube.sides[self.vec3(block_sequence[0],axis)] 56 t2=self.cube.sides[self.vec3(block_sequence[1],axis)] 57 x1=self.cube.rotations[self.vec3(block_sequence[0],axis)] 58 x2=self.cube.rotations[self.vec3(block_sequence[1],axis)] 59 for i in xrange(6): 60 self.cube.sides[self.vec3(block_sequence[i],axis)]= \ 61 self.cube.sides[self.vec3(block_sequence[i+2],axis)] 62 self.cube.rotations[self.vec3(block_sequence[i],axis)] = \ 63 self.cube.rotations[self.vec3(block_sequence[i+2],axis)] 64 self.cube.sides[self.vec3(block_sequence[6],axis)]=t1 65 self.cube.sides[self.vec3(block_sequence[7],axis)]=t2 66 self.cube.rotations[self.vec3(block_sequence[6],axis)]=x1 67 self.cube.rotations[self.vec3(block_sequence[7],axis)]=x2 68 if axis[0]!=0: 69 rot=Matrix44.x_rotation(radians(90.*direction2)) 70 elif axis[1]!=0: 71 rot=Matrix44.y_rotation(radians(90.*direction2)) 72 elif axis[2]!=0: 73 rot=Matrix44.z_rotation(radians(90.*direction2)) 74 for i in xrange(8): 75 self.cube.rotations[self.vec3(block_sequence[i],axis)]=\ 76 rot*self.cube.rotations[self.vec3(block_sequence[i],axis)] 77 self.cube.rotations[self.vec3((1,1),axis)]=\ 78 rot*self.cube.rotations[self.vec3((1,1),axis)]
79 80 #rotamos las caras
81 - def rotate_face(self,direction1,direction2,axis):
82 if self.animations: 83 for a in xrange(0,90*direction2,direction2): 84 self.cube.draw(self.rotate[0],self.rotate[1],self.view_distance,self.viewmode, 85 a,axis[0],axis[1],axis[2]) 86 if self.display_instructions: 87 self.instructions.draw(self.rotate[0],self.rotate[1],self.view_distance) 88 pygame.display.flip() 89 self.rotate_blocks(direction1,direction2,axis)
90 91 #mezclamos, scramble :P
92 - def shuffle(self):
93 self.move_list=[] 94 possible_moves="lLrRtTfFbBuU" 95 last_s="" 96 x = 0 97 #esta cambiado para que haga los 25 movimientos oficiales ;) 98 while x < 25: 99 s=possible_moves[random.randint(0,len(possible_moves)-1)] 100 #para que no se repitan las letras, ni las mayusculas tampoco(capitalize) 101 if not (s.capitalize()==last_s.capitalize() and s!=last_s): 102 self.move_list+=s 103 last_s=s 104 x += 1
105 106 #entrada de teclas para hacer lo ke te piden, rotar, mover, salir, etc etc
107 - def get_input(self):
108 for event in pygame.event.get(): 109 if event.type == QUIT: 110 self.game_running=False 111 if event.type == KEYDOWN: 112 if event.key==27: 113 self.game_running=False 114 elif event.key==284: # F3 key 115 if self.viewmode == 2.0: 116 while True: 117 self.viewmode -= .03 118 self.cube.draw(self.rotate[0],self.rotate[1],self.view_distance,self.viewmode) 119 if self.display_instructions: 120 self.instructions.draw(self.rotate[0],self.rotate[1],self.view_distance) 121 pygame.display.flip() 122 if self.viewmode < 1.0: 123 break 124 elif self.viewmode == 1.0: 125 while True: 126 self.viewmode += .03 127 self.cube.draw(self.rotate[0],self.rotate[1],self.view_distance,self.viewmode) 128 if self.display_instructions: 129 self.instructions.draw(self.rotate[0],self.rotate[1],self.view_distance) 130 pygame.display.flip() 131 if self.viewmode > 2.0: 132 break 133 if self.viewmode < 1.0: self.viewmode = 1.0 134 elif self.viewmode > 2.0: self.viewmode = 2.0 135 elif event.key==K_F4: self.shuffle() 136 elif event.key==K_i: self.display_instructions= not self.display_instructions 137 elif event.key==K_a: self.animations= not self.animations 138 elif event.key==K_F5: self.solving= not self.solving 139 elif event.key==K_F6: 140 rot=Matrix44.y_rotation(radians(90.)) 141 self.cube.rotations[1,0,0]=rot*self.cube.rotations[1,0,0] 142 for i in xrange(3): 143 for j in xrange(3): 144 for k in xrange(3): 145 print i,j,k,self.cube.sides[i,j,k] 146 print self.cube.rotations[i,j,k] 147 else: 148 self.move_list+=event.unicode 149 150 keystate = pygame.key.get_pressed() 151 if keystate[K_PAGEUP]: self.view_distance += 0.1 152 if keystate[K_PAGEDOWN]: self.view_distance -= 0.1 153 if keystate[K_END]: self.view_distance = 9.0;self.rotate[0] = 0.0;self.rotate[1] = 0.0 154 if keystate[K_KP4]: self.rotate[1] += 1.0 155 if keystate[K_KP6]: self.rotate[1] -= 1.0 156 if keystate[K_KP8]: self.rotate[0] += 1.0 157 if keystate[K_KP2]: self.rotate[0] -= 1.0 158 159 pressed_mouse=pygame.mouse.get_pressed() 160 mickeys=pygame.mouse.get_rel() 161 if pressed_mouse[0]: 162 self.rotate[0] += mickeys[1]/3.0 163 self.rotate[1] += mickeys[0]/3.0 164 self.rotate[0]=min(self.rotate[0],45.) 165 self.rotate[0]=max(self.rotate[0],-45) 166 if self.rotate[1] >= 360: self.rotate[1] = 0 167 elif self.rotate[1] <= -360: self.rotate[1] = 0 168 169 pygame.event.clear()
170 171 #rotaciones segun el movimiento que hagamos
172 - def process_next_move(self):
173 if len(self.move_list)>0: 174 s=self.move_list[0] 175 if s=="l": self.rotate_face(-1,1,(-1,0,0)) 176 elif s=="L": self.rotate_face(1,-1,(-1,0,0)) 177 elif s=="t": self.rotate_face(-1,-1,(0,1,0)) 178 elif s=="T": self.rotate_face(1,1,(0,1,0)) 179 elif s=="r": self.rotate_face(1,-1,(1,0,0)) 180 elif s=="R": self.rotate_face(-1,1,(1,0,0)) 181 elif s=="F": self.rotate_face(-1,1,(0,0,1)) 182 elif s=="f": self.rotate_face(1,-1,(0,0,1)) 183 elif s=="b": self.rotate_face(-1,1,(0,0,-1)) 184 elif s=="B": self.rotate_face(1,-1,(0,0,-1)) 185 elif s=="u": self.rotate_face(1,1,(0,-1,0)) 186 elif s=="U": self.rotate_face(-1,-1,(0,-1,0)) 187 188 self.move_list=self.move_list[1:]
189 190 from solver import * 191 192 #clase principal donde inicializamos todo lo que hay que hacer :)
193 - def main(self):
194 self.instructions=Text_Image("Instructions.png") 195 self.rotate = [20.0,20.0,0.0] 196 self.view_distance = 9.0 197 self.viewmode = 1.0 198 self.cube=RubiksCube() 199 self.move_list="" 200 self.solving=False 201 self.animations=True 202 self.display_instructions=False 203 self.game_running=True 204 205 #numero de movimientos necesarios para resolver el cubo 206 #lo flipo, mas de 200 movimientos :O 207 w = 0 208 209 #bucle del juego 210 while self.game_running: # para salirse del juego 211 self.get_input() 212 self.process_next_move() 213 if self.solving and len(self.move_list)==0: 214 self.move_list += solver(self.cube) 215 #contador de movimientos 216 w += len(solver(self.cube)) 217 if len(self.move_list)==0: self.solving=False 218 self.cube.draw(self.rotate[0],self.rotate[1],self.view_distance,self.viewmode) 219 if self.display_instructions: 220 self.instructions.draw(self.rotate[0],self.rotate[1],self.view_distance) 221 pygame.display.flip() 222 pygame.quit()
223 224 #ejecutar esto 225 #cubo3x3x3 = Cube3D() 226 #cubo3x3x3.main() 227