Como hago un historial de movimientos

Iniciado por JavierScars, 7 Enero 2016, 04:28 AM

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

JavierScars

Hola estoy realizando el ejercicio del libro de deitel&deitel llamado el recorrido del caballo se supone que tengo que simular un tablero de ajedrez y y simular los movimientos de un caballo y pasar por cada casilla sólo una vez.

-El modo "manual" ya esta listo.
-Cree una función que me permite saber desde cuantas posiciones es accesible un cada cuadro.
-Cree un modo automático que selecciona la casilla accesible en este turno pero menos accesible comparada con las demás disponibles.
-También cree un array marca del mismo tamaño del tablero para saber que paso fue x movimiento.

Lo que necesitó ahora es crear una clase de historial que le permita al programa devolverse un paso y cuando se quede sin opciones devolverse 2 y así. Alguna idea?

Extra:

Otra cosa llevó más o menos 500 líneas de código... Creo que me estoy enredando mucho para hacer cosas simples o es un número normal? Estimen aproximadamente cuantas les llevaría a ustedes.
Usa lo malo de la vida a tu favor, escala montañas de problemas para deslizarte sobre soluciones, derrumba muros de decepciones para encontrar la libertar de la felicidad,  y quema la leña del fracaso para calentarte con el éxito. Recuerda que sin la oscuridad la luz no brillaría tanto.

crack81

Olle que libro de deitel estas leyendo?

saludos...
Si C/C++ es el padre de los lenguajes entonces ASM es dios.

0xFer

Cita de: JavierScars en  7 Enero 2016, 04:28 AM
Lo que necesitó ahora es crear una clase de historial que le permita al programa devolverse un paso y cuando se quede sin opciones devolverse 2 y así. Alguna idea?

Para ese tipo de problemas se suele emplear el algoritmo BackTracking que no es más que un algoritmo recursivo de búsqueda que explora todas los caminos que puedan conducir a la solución del problema aunque a veces el tiempo que el algoritmo demora en encontrar la solución es mucho por lo que se suele utilizar heuristicas que son como atajos para reducir el tiempo de búsqueda( para el problema del recorrido del caballo no se puede sólo con el algoritmo BackTracking porque se demora mucho tiempo aunque de todas formas se puede utilizar).

Cuando entiendas el funcionamiento del algoritmo por ejemplo puedes hacer un tablero más pequeño para que puedas ver si te funciona el algoritmo para después ampliar el tablero y probar con heuristicas( una que conozco es explorar las casillas desde donde se tengan menos casillas para saltar)

CitarOtra cosa llevó más o menos 500 líneas de código... Creo que me estoy enredando mucho para hacer cosas simples o es un número normal? Estimen aproximadamente cuantas les llevaría a ustedes.

Pues sólo el procedimiento del algoritmo para este problema lleva no más de 20 lineas. Para saber si la casilla en donde se quiere saltar está disponible yo me suelo llevar otras 2 lineas utilizando el método de representación 0x88 que se suele utilizar mucho en los motores de ajedrez.

Un saludo.
Código (java) [Seleccionar]
int getRandomNumber(){
    return 4; //chosen by fair dice roll
              //guaranteed to be random
}

JavierScars

#3
Ya lo de heurística lo aplique pero eso no lo va a resolver al primer intento.

Tan pocas líneas? :O si pudieras plantear el codigo estaría muy bien.

Cita de: crack81 en  7 Enero 2016, 05:11 AM
Olle que libro de deitel estas leyendo?

saludos...

El 6ta edición de como programar en C... En los ejercicios sobre arrays  bidimencionales.
Usa lo malo de la vida a tu favor, escala montañas de problemas para deslizarte sobre soluciones, derrumba muros de decepciones para encontrar la libertar de la felicidad,  y quema la leña del fracaso para calentarte con el éxito. Recuerda que sin la oscuridad la luz no brillaría tanto.

0xFer

No sé si funciona porque no lo he compilado;

Código (cpp) [Seleccionar]

bool Recorrido( int casilla_actual, int n_saltos ){

tablero[casilla_actual] = n_saltos;
   
if( n_saltos == 64 ) return true;

else {
GenerarCasillasDisponibles();
Para cada Casilla Disponible hacer:
if( Recorrido(casilla_nueva,n_saltos+1) ) return true;
}

tablero[casilla_actual] = 0;

return false;

}


Lo acabo de hacer en 5 minutos pero no sé si funciona, espero que si entiendas la idea aunque sea, iré a dormir y mañana lo continuo.
Código (java) [Seleccionar]
int getRandomNumber(){
    return 4; //chosen by fair dice roll
              //guaranteed to be random
}

JavierScars

No entendí bien lo que quieres hacer en esa función
A mi se me ocurrió ya una manera
Un caballo por más libre que este tiene 8 movimientos posibles por heurística mi programa toma el mas dificil de acceder que este disponible lo que haré es si al siguiente paso no tiene casilla disponible, sólo marco el movimiento como no disponible luego hago retroceder a la marca anterior y mediante los dos for encontrar la posición x, y de esa marca, borrar las casillas que avance después de esa marca cuando haga las comparaciones y tome la casilla que tiene menos posibilidades de entrar hago que mediante un if se salte las que estén marcadas como no disponibles... Mañana intento con lo que tengo en mente a ver.
Usa lo malo de la vida a tu favor, escala montañas de problemas para deslizarte sobre soluciones, derrumba muros de decepciones para encontrar la libertar de la felicidad,  y quema la leña del fracaso para calentarte con el éxito. Recuerda que sin la oscuridad la luz no brillaría tanto.

0xFer

#6
CitarNo entendí bien lo que quieres hacer en esa función

Es el algoritmo que te habia mencionado, la solución en teoria se iría guardando en el arreglo 'tablero' con la variable 'n_saltos' y termina cuando n_saltos es igual a 64 es decir, cuando se ha visitado todas las casillas y por lo tanto se ha encontrado la solución. El tablero puede ser unidimensional, bidimensional o como sea pero el algoritmo sería el mismo sólo que tendrías que ordenar los movimientos del caballo con la heuristica que ya comentaste( visitar primero las casillas que aparenten solucionar más rápido el problema).

CitarA mi se me ocurrió ya una manera

Vale, intenta solucionarlo a tu manera así se aprende más. La verdad yo lo intentaría hacer incluso durante semanas si es necesario  ;-)
Código (java) [Seleccionar]
int getRandomNumber(){
    return 4; //chosen by fair dice roll
              //guaranteed to be random
}

JavierScars

Ya creó haber comprendido lo que quieres, pero el algoritmo que estoy planeando prueba 1 vía a la vez y me va mostrando "gráficamente" lo que va haciendo, es decir cual paso da y el cual se devolví y así.
Usa lo malo de la vida a tu favor, escala montañas de problemas para deslizarte sobre soluciones, derrumba muros de decepciones para encontrar la libertar de la felicidad,  y quema la leña del fracaso para calentarte con el éxito. Recuerda que sin la oscuridad la luz no brillaría tanto.