elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Los 10 CVE más críticos (peligrosos) de 2020


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Como hago un historial de movimientos
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Como hago un historial de movimientos  (Leído 2,382 veces)
JavierScars

Desconectado Desconectado

Mensajes: 116



Ver Perfil
Como hago un historial de movimientos
« 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.


« Última modificación: 7 Enero 2016, 04:31 am por JavierScars » En línea

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

Desconectado Desconectado

Mensajes: 222



Ver Perfil
Re: Como hago un historial de movimientos
« Respuesta #1 en: 7 Enero 2016, 05:11 am »

Olle que libro de deitel estas leyendo?

saludos...


En línea

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


Desconectado Desconectado

Mensajes: 400



Ver Perfil
Re: Como hago un historial de movimientos
« Respuesta #2 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.
En línea

Código
  1. int getRandomNumber(){
  2.    return 4; //chosen by fair dice roll
  3.              //guaranteed to be random
  4. }
JavierScars

Desconectado Desconectado

Mensajes: 116



Ver Perfil
Re: Como hago un historial de movimientos
« Respuesta #3 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.
« Última modificación: 7 Enero 2016, 05:44 am por JavierScars » En línea

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


Desconectado Desconectado

Mensajes: 400



Ver Perfil
Re: Como hago un historial de movimientos
« Respuesta #4 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.
En línea

Código
  1. int getRandomNumber(){
  2.    return 4; //chosen by fair dice roll
  3.              //guaranteed to be random
  4. }
JavierScars

Desconectado Desconectado

Mensajes: 116



Ver Perfil
Re: Como hago un historial de movimientos
« Respuesta #5 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.
En línea

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


Desconectado Desconectado

Mensajes: 400



Ver Perfil
Re: Como hago un historial de movimientos
« Respuesta #6 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  ;-)
« Última modificación: 7 Enero 2016, 16:58 pm por 0xFer » En línea

Código
  1. int getRandomNumber(){
  2.    return 4; //chosen by fair dice roll
  3.              //guaranteed to be random
  4. }
JavierScars

Desconectado Desconectado

Mensajes: 116



Ver Perfil
Re: Como hago un historial de movimientos
« Respuesta #7 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í.
En línea

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.
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
como detectar todo los movimientos de los ojos
Programación General
uagrm 1 2,125 Último mensaje 2 Noviembre 2010, 03:55 am
por [D4N93R]
¿Cómo descifrar historial de MSN (archivo .ple) ?
Mensajería
reethok 1 10,413 Último mensaje 25 Abril 2011, 16:19 pm
por Last_
[MOD] Ver historial de navegación sin historial del navegador
Hacking
joniplex 1 5,403 Último mensaje 7 Mayo 2011, 19:13 pm
por Novlucker
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines