Hola, muy buenas fiestas a todos.
Aclaro que a continuación hablaré respecto al código C no C++.
Les comento, para el curso de este año nos han mandado la implementación (con unos requisitos) del juego de Hundir la flota (Battleship). Con su menú compacto/reducido, modalidades de juego (0 jugadores, 1 jugador o 2 jugadores) calcular la puntuación y la certeza de disparos, guardar datos en ficheros, mostrar top 10 de un fichero, etc.
El problema surje cuando tengo que programar la inteligencia del siguiente disparo de la máquina.
La maquina dispara en un tablero inicializado con todo agua ('?'). El primer disparo lo hace al azar en un tablero de 8x8, 9x9 o 10x10 decidido por el usuario.
En la modalidad 0, la máquina (el programa) juega toda sola, automaticamente: el programa genera disparos para descubrir la posición de todos los barcos i hundir la flota. El objetivo es hundirla con el menor numero de disparos posibles.
El programa decidirá el siguiente disparo llamando al procedimiento decide_disparo, para determinar fila y columna del siguiente disparo. El procedimiento debe decidir segun el contenido del tablero de disparos y de la estrategia a seguir, las coordenadas del siguiente disparo, que a continuación llamará a otro procedimiento ya implementado dispara() que nos efectua el tiro y devuelve el resultado de éste, si ha sido tocado, agua, hundido, etc.
Debemos seguir una estrategia de juego. Por ejemplo He programado que cuando se hunde un barco se envuelva el barco con el caracter agua tocada ('.').
Se me ocurren diferentes estrategias:
0. Disparos totalmente aleatorios, sin repetir casillas anteriores.
1. En caso que el ultimo disparo sea parte de un barco, disparar a casillas adyacentes. Si no se vuelve a tocar que dispare aleatoriamente.
2.En caso que sea barco, seguir una dirección de disparo (N,S,E,O) para decidir el siguiente disparo. Si no se encuentra ninguna disponible usamos la estrategia 0.
3. En caso de llegar al extremo de un barco, buscar en la dirección contraria. Si no se encuentra disponible, usar la estrategia 0.
A mejor estrategia mejor nota. He realizado la 1 con un correcto funcionamiento. Pero llevo dos semanas atascado en cómo poder implementar las otras dos estrategias (2-3). He pensado en usar variables auxiliares como memoria, para acordarse de los 2 disparos anteriores, guardando también sus coordenadas (en caso que fuese barco '@'). Y con esa información ir recorriendo usando el método BFS pero por lo que he encontrado por internet, éste metodo solo se utiliza en C++.
También pensé en una variable boleana que me permitiese saber cuando he tocado un barco por primera vez. Si miro a su alrededor y es todo (?) significa que lo he tocado por primera vez. Si alrededor de la casilla actual @ encuentro otro @ ya sabría la dirección que tomar.
El caso se encuentra cuando he tocado un barco y en alguna de las direcciones tengo 1, 2 o 3 aguas tocadas '.' (si tuviese 4 aguas tocadas significaría que el barco es de tamaño 1 casilla, y ya está hundido). Aquí es donde entraría en juego las variables aux de memoria.
Creo que se puede llegar a hacer más sencillo de cómo lo tengo planteado hacer.
Me gustaría leer ideas, aportes, consejos, y si alguien, con el espiritu Navideño, se ve con ganas de ayudar le podría pasar el proyecto entero.
Para decidir el disparo, nos exigen diseñar un procedimiento con la siguiente cabecera:
void P_decide_disparo (int *f, int *c, char tablero_disparos[][COL_MAX], unsigned int dim)
Dónde, *f= numero de la fila en la que hemos disparado (referencia)
*c= numero de la columna que hemos disparado (referencia)
tablero_disparos[][COL_MAX] --> mi tablero donde he disparado, y veo agua sin visitar (?), agua tocada (.), tocado (@). Cuando se hunde el barco se envuelve con agua tocada para saber que está hundido.
dim = valor de la dimensión del tablero 8, 9 o 10.
Podría colgar el código que tengo hecho del procedimiento por si a alguien le es mas sencillo seguir un planteamiento a raíz de éste.
Muchas gracias a toda la comunidad, soys de gran ayuda.
PD: antes de postear me he leido todo el foro y buscado ayuda sobre el tema, y al no encontrar nada sobre el tema no me ha quedado otra que abrir un post.
Aclaro que a continuación hablaré respecto al código C no C++.
Les comento, para el curso de este año nos han mandado la implementación (con unos requisitos) del juego de Hundir la flota (Battleship). Con su menú compacto/reducido, modalidades de juego (0 jugadores, 1 jugador o 2 jugadores) calcular la puntuación y la certeza de disparos, guardar datos en ficheros, mostrar top 10 de un fichero, etc.
El problema surje cuando tengo que programar la inteligencia del siguiente disparo de la máquina.
La maquina dispara en un tablero inicializado con todo agua ('?'). El primer disparo lo hace al azar en un tablero de 8x8, 9x9 o 10x10 decidido por el usuario.
En la modalidad 0, la máquina (el programa) juega toda sola, automaticamente: el programa genera disparos para descubrir la posición de todos los barcos i hundir la flota. El objetivo es hundirla con el menor numero de disparos posibles.
El programa decidirá el siguiente disparo llamando al procedimiento decide_disparo, para determinar fila y columna del siguiente disparo. El procedimiento debe decidir segun el contenido del tablero de disparos y de la estrategia a seguir, las coordenadas del siguiente disparo, que a continuación llamará a otro procedimiento ya implementado dispara() que nos efectua el tiro y devuelve el resultado de éste, si ha sido tocado, agua, hundido, etc.
Debemos seguir una estrategia de juego. Por ejemplo He programado que cuando se hunde un barco se envuelva el barco con el caracter agua tocada ('.').
Se me ocurren diferentes estrategias:
0. Disparos totalmente aleatorios, sin repetir casillas anteriores.
1. En caso que el ultimo disparo sea parte de un barco, disparar a casillas adyacentes. Si no se vuelve a tocar que dispare aleatoriamente.
2.En caso que sea barco, seguir una dirección de disparo (N,S,E,O) para decidir el siguiente disparo. Si no se encuentra ninguna disponible usamos la estrategia 0.
3. En caso de llegar al extremo de un barco, buscar en la dirección contraria. Si no se encuentra disponible, usar la estrategia 0.
A mejor estrategia mejor nota. He realizado la 1 con un correcto funcionamiento. Pero llevo dos semanas atascado en cómo poder implementar las otras dos estrategias (2-3). He pensado en usar variables auxiliares como memoria, para acordarse de los 2 disparos anteriores, guardando también sus coordenadas (en caso que fuese barco '@'). Y con esa información ir recorriendo usando el método BFS pero por lo que he encontrado por internet, éste metodo solo se utiliza en C++.
También pensé en una variable boleana que me permitiese saber cuando he tocado un barco por primera vez. Si miro a su alrededor y es todo (?) significa que lo he tocado por primera vez. Si alrededor de la casilla actual @ encuentro otro @ ya sabría la dirección que tomar.
El caso se encuentra cuando he tocado un barco y en alguna de las direcciones tengo 1, 2 o 3 aguas tocadas '.' (si tuviese 4 aguas tocadas significaría que el barco es de tamaño 1 casilla, y ya está hundido). Aquí es donde entraría en juego las variables aux de memoria.
Creo que se puede llegar a hacer más sencillo de cómo lo tengo planteado hacer.
Me gustaría leer ideas, aportes, consejos, y si alguien, con el espiritu Navideño, se ve con ganas de ayudar le podría pasar el proyecto entero.
Para decidir el disparo, nos exigen diseñar un procedimiento con la siguiente cabecera:
void P_decide_disparo (int *f, int *c, char tablero_disparos[][COL_MAX], unsigned int dim)
Dónde, *f= numero de la fila en la que hemos disparado (referencia)
*c= numero de la columna que hemos disparado (referencia)
tablero_disparos[][COL_MAX] --> mi tablero donde he disparado, y veo agua sin visitar (?), agua tocada (.), tocado (@). Cuando se hunde el barco se envuelve con agua tocada para saber que está hundido.
dim = valor de la dimensión del tablero 8, 9 o 10.
Podría colgar el código que tengo hecho del procedimiento por si a alguien le es mas sencillo seguir un planteamiento a raíz de éste.
Muchas gracias a toda la comunidad, soys de gran ayuda.
PD: antes de postear me he leido todo el foro y buscado ayuda sobre el tema, y al no encontrar nada sobre el tema no me ha quedado otra que abrir un post.