Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: JavierScars en 7 Enero 2016, 04:28 am



Título: Como hago un historial de movimientos
Publicado por: JavierScars en 7 Enero 2016, 04:28 am
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.


Título: Re: Como hago un historial de movimientos
Publicado por: crack81 en 7 Enero 2016, 05:11 am
Olle que libro de deitel estas leyendo?

saludos...


Título: Re: Como hago un historial de movimientos
Publicado por: 0xFer en 7 Enero 2016, 05:14 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)

Citar
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.

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.


Título: Re: Como hago un historial de movimientos
Publicado por: JavierScars en 7 Enero 2016, 05:36 am
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.

Olle que libro de deitel estas leyendo?

saludos...

El 6ta edición de como programar en C... En los ejercicios sobre arrays  bidimencionales.


Título: Re: Como hago un historial de movimientos
Publicado por: 0xFer en 7 Enero 2016, 06:33 am
No sé si funciona porque no lo he compilado;

Código
  1. bool Recorrido( int casilla_actual, int n_saltos ){
  2.  
  3. tablero[casilla_actual] = n_saltos;
  4.  
  5. if( n_saltos == 64 ) return true;
  6.  
  7. else {
  8. GenerarCasillasDisponibles();
  9. Para cada Casilla Disponible hacer:
  10. if( Recorrido(casilla_nueva,n_saltos+1) ) return true;
  11. }
  12.  
  13. tablero[casilla_actual] = 0;
  14.  
  15. return false;
  16.  
  17. }

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.


Título: Re: Como hago un historial de movimientos
Publicado por: JavierScars en 7 Enero 2016, 08:11 am
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.


Título: Re: Como hago un historial de movimientos
Publicado por: 0xFer en 7 Enero 2016, 16:54 pm
Citar
No 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).

Citar
A 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  ;-)


Título: Re: Como hago un historial de movimientos
Publicado por: JavierScars en 7 Enero 2016, 17:36 pm
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í.