Codigo para mover valores de posicion

Iniciado por javierb29, 18 Julio 2017, 08:31 AM

0 Miembros y 1 Visitante están viendo este tema.

javierb29

Buenas noches, he estado diseñando un código en el compilador Borland C++ cuya función sea hacer una especie de cubo de rubik, sin embargo no es todo el cubo, es solo una cara y no se debe completar todo de un solo color sino que tres filas o tres columnas de un solo color cada una, el código lo hemos hecho para que el usuario ingrese la posicion de los colores sin embargo como no sabe cm funciona probalemtne ingrese los datos en desorden provocando que los colores queden en desorden y alli es donde entra el problema y es como somos estudiantes de 1er año pues no tenemos los conocimientos suficientes para saber si existen funciones que logren hacer posible la ejecucion del programa bien, y es que no sabemos como hacer para que el usuario pueda mover cada fila o cada columna hacia la izquierda o hacia la derecha o hacia arriba o hacia abajo

Si alguien lo logra hacer y nos puede explicar seria de mucha ayuda.
Muchas Gracias por su atencion, que la pasen excelentë.

ivancea96

El problema es solo comunicarse con el usuario, así que simplemente buscad una forma que sirva. O buscad una forma que os gustaría usar.

Recordad que el cubo de Rubik es un cubo, y solo se puede hacer 6 giros diferentes, cada uno en sus 2 posibles sentidos.

En cualquier caso, ya existe una notación para esto:



Podéis quedaros con las letras. En Español o inglés, lo que queráis. El tema es entenderse, y que pongáis una leyenda o ayuda en la aplicación.

Teniendo lista la forma de comunicarse con el usuario, ya solo queda hacerlo.


Si la pregunta es acerca de cómo inicializar los colores del cubo, entonces se necesitan más detalles de cómo lo queréis hacer.

Serapis

#2
Un modo correcto de trabajar con el cubo de Rubik, es considerarlo un plano... como cuando tomamos un papel para generar un cubo de una sola pieza. Esto es, una cruz...


   #
  ###
   #
   #


Cada cara dividida en seccciones de 3x3.
Ahora se puede tomar todo el pliego de papel (entero) dividido horizontalmente en 9 secciones (0,1,2 - 3,4,5 - 6,7,8) y verticalmente en 12 (A,B,C - D,E,F - G,H,I - J,K,L). Ya teneis un sistema dle cual partir... un array bidimensional de 9x12, en el que muchas casillas serán nulas (de entrada convendría darles valor -1 a todas y luego al generar un cubo al azar, vambiar el valor de cada casilla que admite un valor porque se 'registra' en el cubo).

Ahora colocad números en cada casilla del cubo de Rubik, transcribidlo al papel...
Luego girad una cara (podeis seguir la notación de caras, coronas, centros, diedros y triedros de la notación que os muestra Ivancea). Una vez hecho un movimiento, reflejad de nuevo su posición en el papel (el pliego en cruz y como han cambiado se sitio).
Ahora  a ese tipo de giro dadle un nombre o mejor una valor enumerado, entonces podeis crear igualmente todas las funciones de transición aplicables al cubo, y finalmente en una única función aunarlas todas, admitiendo como parámetros: el array de origen, el giro aplicado (el valor enumerado que corresponde a una función específica), y como salida modificar las casillas afectadas en el array, tal como se ha registrado en el pliego de papel.
Esto es supongaos que en el pliego de papel anotamos al inicio (con el cubo ordenado), que la casilla(4,A) tras x giro enumerado, adopta la posición final: Casiilla(8,E)

Pués esa función haría la rotación de esa corona (la superior),  y poniendo  de ejemplo la primera casilla, en la cruz sería:
Giro = ROTA_CORONA1_DERECHA

Tmp = Casilla(3,A)
Casilla(3,A) = Casilla(8,D)
Casilla(8,D) = Casilla(5,I)
Casilla(5,I) = Casilla(0,F)
Casilla(0,F) = Tmp

/ falta rotar las dos casillas adyacentes a (3,A), es decir (4,A) y (5,A)
/ Y falta rotar también las 8 casillas de la cara superior (la # inferior de la cruz), que rota 90º.
/    La casilla central de esa cara (como en todas), jamás cambia. Solo cambian los 4 diedros y los 4 triedros)


Cuando se gire al revés, (a la izquierda, básicamente es recorrer el camino al revés...
/ Esto es, si antes habíamos hecho:
Giro = ROTA_CORONA1_DERECHA
Tmp = A ; A = B ; B = C...
/ ahora haríamos:
giro = ROTA_CORONA1_IZQUIERDA
C = B ; B = A ; A = tmp


Y proceder así con cada uno de los disitntos giros (son pocos), otorgarle un valor enumerado e invocar a una función que examine el giro y reinvoque a la rutina concreta o bien resolverlo directamente con bloque switch/select case...


En fin, un poco de trabajo pero muy simple todo... no requiere funciones de transformación complejas...


p.d.: nota que cada cara en la cruz (cada #), es del mismo color, así las casillas: 3A, 4A y 5A son del mismo color (y las 6 bajos estas)... Si en el papel, pintas cada cara de un color, y luego en el otro lo pintas después de aplicar un giro, te sería de mucha utilidad, porque para pintarlo finalmente no necesitarás una función extra tal que pasándole una casilla (por ejemplo 3A), te devuelva el color que tiene, esto es... el valor de cada casilla en el array debería ser uno de los 6 colores... y no resulta preciso ninguna función adicional, solo recorrer el array si la casilla tiene un valor distinta de -1 pintarla con el color que representa el valor.

Puesto que el cubo de Rubik si se desarma se puede armar de forma distinta, que podrían hacer que los colores no coincidan, siempre se debe partir del cubo ordenado, y desordenarlo con funciones de giro al azar... (para entenderlo imagina el cubo sobre ekl papel, imagina que lo pintas todo bien excepto dos casillas, verías que si cambias el color de esas dos piezas, de modo que haya caras completas de color, y alguna incompleta, no tendría solución de colocarse sino hasta esa forma... es decir siempre habría dos casillas desordenadas al tratar de completar el cubo lo máximo posible...

ppp


#| 0,1,2 - 3,4,5 - 6,7,8
-|------------------------
A| -,-,- - 3,4,5 - -,-,-
B| -,-,- - 3,4,5 - -,-,-
C| -,-,- - 3,4,5 - -,-,-

D| 0,1,2 - 3,4,5 - 6,7,8
E| 0,1,2 - 3,4,5 - 6,7,8
F| 0,1,2 - 3,4,5 - 6,7,8

G| -,-,- - 3,4,5 - -,-,-
H| -,-,- - 3,4,5 - -,-,-
I| -,-,- - 3,4,5 - -,-,-

J| -,-,- - 3,4,5 - -,-,-
K| -,-,- - 3,4,5 - -,-,-
L| -,-,- - 3,4,5 - -,-,-