Version:0.9 StartHTML:0000000105 EndHTML:0000026778 StartFragment:0000000152 EndFragment:0000026744
/******************************************************/
/*************** Isidro Pastor Jorda ******************/
/******************************************************/
/****************** Telematica ************************/
/******************************************************/
/************* Practica 6 Ejercicio 7 *****************/
/******************************************************/
/* INCLUDES */
#include <iostream.h>
#include <stdlib.h>
/* DEFINICION DE CONSTANTES */
const int FILAS = 4; // Filas de nuestro tablero
const int COLUMNAS = 4; // Columnas de nuestro tablero
const int BARCOS = 5; // Esta constante corresponde al numero de barcos que introduciremos en el tablero
/* DEFINICION DE TIPOS DE DATOS */
typedef char tablero[FILAS][COLUMNAS]; // El tablero es una matriz de FILASxCOLUMNAS de tipo char.
/* PROTOTIPOS DE LAS FUNCIONES QUE USAREMOS */
void InicializaMatriz(tablero M, char reset) ;
void IntroducirBarcos(tablero j);
void MostrarMatriz(tablero M);
bool BuscaGanador(tablero j);
bool MiraHundido(tablero tabla,int i,int j);
int main()
{
/* Definicion de variables */
tablero j1, j2;
bool hundido, ganador, tocado;
int jugador, i, j;
/* Presentacion del programa */
cout << "*************************************************\n";
cout << "***************_***********___*******************\n";
cout << "**************/ \\********___|__******************\n";
cout << "**************\\_/*******| |*****************\n";
cout << "***************|********|______|*****************\n";
cout << "***************|**********| |*******************\n";
cout << "********______/ \\_________| |____***************\n";
cout << "******_/ \\_*************\n";
cout << "*****| HUNDIR LA FLOTA '02 \\************\n";
cout << "******\\_____________________________/************\n";
cout << "*************************************************\n";
cout << "************ Isidro Pastor Jorda ****************\n";
cout << "*************************************************\n";
cout << "*************** TELEMATICA **********************\n";
cout << "*************************************************\n";
cout << "\n Juego de Hundir la Flota " << endl;
/* Proceso de introduccion de los barcos */
cout << "\n Inicio de la introduccion de los 5 barcos " << endl;
cout << " Jugador 1 introduce sus barcos \n";
InicializaMatriz(j1, 'a'); // inicializamos la matriz del jugador 1 con todo agua
IntroducirBarcos(j1); // Llamada a la funcion para introducir los barcos
cout << " \n Tu tablero completo es este: " ;
MostrarMatriz(j1);// muestra el tablero por pantalla para comprobar la introduccion de los barcos
cin.ignore(); // Eliminamos el buffer para usar cin.get() y esperar a pulsar una tecla para continuar
cout << "\n Pulsa INTRO para continuar ";
cin.get(); // leemos la tecla y podemos continuar nuestra introduccion de barcos
system("CLS"); // Borramos la pantalla con una llamada a system
cout << " Jugador 2 introduce sus barcos \n";
InicializaMatriz(j2, 'a'); // Inicializamos el tablero del jugador 2 todo con agua
IntroducirBarcos(j2); // Llamada a la funcion de introducir los barcos
cout << " \n Tu tablero completo es este: ";
MostrarMatriz(j2); // Muestra el tablero por pantalla
cin.ignore();
cout << "\n Pulsa INTRO para continuar ";
cin.get();
system("CLS");
/* FIN DE LA INTRODUCCION DE DATOS */
jugador = 1; // Inicializamos jugador a 1 ya que empieza jugando este jugador
ganador = false; // no existe todavia un ganador luego iniciamos ganador a false
/* AQUI EMPIEZA LA BASE DEL JUEGO QUE SE REPITE PARA CADA TIRADA DE CADA JUGADOR */
do // Este do..while repetira todas las acciones de tiradas mientras no haya un ganador (ganador=true)
{
tocado = false; // Inicializamos tocado a false por si acaso ...
cout << "\n Jugador " << jugador << endl;
do // do..while de control de errores, para no bombardear fuera del tablero
{
cout << " Dime la casilla que quieres bombardear -> ";
cin >> i >> j; // leemos por teclado los valores introducidos de fila y columna a bombardear
if ( i < 0 || i >= FILAS || j < 0 || j >= COLUMNAS )
cout << "\n Has excecido el tamaņo de la matriz, Vuelve a intentarlo \n";
}
while ( i < 0 || i >= FILAS || j < 0 || j >= COLUMNAS );
if (jugador == 1) // Si juega el jugador 1 realizaremos la siguientes tareas
{
if ( j2[i][j] == 'a') // si en el tablero del jugador 2 la posicion bombardeada es agua
cout << "\n AGUA \n"; // simplemente mostramos por pantalla que hemos tocado AGUA
if ( j2[i][j] == 'b')// Si hemos tocado un barco realizaremos las siguientes acciones ....
{
cout << "\n TOCADO \n";// mostramos por pantalla que un barco ha sido tocado
tocado = true; // Damos el valor true a tocado para realizar la secuencia posterior de busqueda de hundido y ganador
j2[i][j] = 'a'; // en la posicion donde estaba el barco antes lo pasamos a agua, el barco ya esta tocado
}
if ( tocado ) // si el barco ha sido tocado en este movimiento
{
hundido = MiraHundido(j2, i, j);// llamamos a la funcion que buscara si el barco ha sido tambien hundido
ganador = BuscaGanador(j2); // Llamamos a la funcion que nos busca si el jugador que ha tirado es ganador
if ( hundido ) // Si el barco ha sido hundido tambien mostramos por pantalla HUNDIDO
cout << "\n HUNDIDO \n";
}
}
if (jugador == 2) // Si el jugador es el 2 el proceso es el mismo solo que pasando el tablero 1 a las funciones
{
if ( j1[i][j] == 'a')
cout << "\n AGUA \n";
if ( j1[i][j] == 'b')
{
cout << "\n TOCADO \n";
tocado = true;
j1[i][j] = 'a';
}
if ( tocado )
{
hundido = MiraHundido(j1, i, j);
ganador = BuscaGanador(j1);
if ( hundido )
cout << "\n HUNDIDO \n";
}
}
if ( ganador ) // Si hay un ganador .... (ganador = true)
cout << " \n HA GANADO EL JUGADOR " << jugador << " !!!!! "; // Mostramos por pantalla el jugador ganador
if (jugador == 1)// Si estamos jugando con el jugador 1 en esta mano
jugador = 2; // En la siguiente el jugador sera el 2
else
jugador = 1; // en caso contrario esta mano la ha jugado el jugador 2 por lo tanto la siguiente lo hara el 1
}
while ( !ganador);// Condicion de permanencia para el do..while inicial del bucle de juego
system("PAUSE");
return 0;
}
/* FIN DEL PROGRAMA PRINCIPAL */
/* COMIENZO DEL DESARROLLO DE LAS FUNCIONES */
void MostrarMatriz(tablero M)
{
cout << endl << endl;
for (int i = 0; i < FILAS; i++ )
{
for (int j = 0; j< COLUMNAS; j++)
cout << " " << M[i][j];
cout << endl;
}
}
/******************************************************************
* Funcion: InicializaMatriz
* Descripcion: Funcion que inicializa una matriz al valor de reset
*
*
* Parametros:
*
* Nombre E/S Descripcion
* ------ ----- -----------
* M E/S Matriz a inicializar
* reset E Valor usado para inicializar la matriz
*
* Valor devuelto:
* void, la matriz no devuelve nada pero modifica el vector
*******************************************************************/
void InicializaMatriz(tablero M, char reset)
{
for (int i = 0; i < FILAS; i++ )
for (int j = 0; j< COLUMNAS; j++)
M[i][j] = reset;
return;
}
/***********************************************************************************
* Funcion: IntroducirBarcos
* Descripcion: Funcion desde la que introduciremos los barcos en la matriz
*
*
* Parametros:
*
* Nombre E/S Descripcion
* ------ ----- -----------
* tabla E/S de tipo tablero donde introduciremos los barcos
*
*
* Valor devuelto:
* void, aqui modificaremos la matriz que se nos de para introducir los barcos
***********************************************************************************/
void IntroducirBarcos(tablero tabla)
{
int i, j;
i = 0;
j = 0;
for ( int contador = 1; contador <= BARCOS; contador++)
{
do // Primer do..while de control de errores, nos servira para no introducir dos veces un barco en la misma casilla
{
do // Segundo do..while de control de errores, para controlar que no nos salgamos de las filas y columnas
{
cout << " Introduce los valores de i,j donde quieres introducir el barco numero " << contador << " -> " ;
cin >> i >> j;
if ( i < 0 || i > FILAS-1 || j < 0 || j > COLUMNAS -1 ) // mensaje de error si nos excedemos en filas o columnas
cout << " Error, se ha excedido del tamanyo del tablero, i maxima = "<< FILAS - 1 << " j maxima = " << COLUMNAS - 1 << endl;
}
while ( i < 0 || i > FILAS - 1 || j < 0 || j > COLUMNAS - 1);// condicion de permanencia segundo do..while
if ( tabla[i][j] == 'b') // Salida por pantalla en el primer do..while del error cometido
cout << " \n Error la casilla ya tenia un barco introducido \n" ;
}
while ( tabla[i][j] == 'b');// condicion de permanencia del primer do..while
tabla[i][j] = 'b' ;// si hemos superado los controles de errores grabamos en la posicion introducida un barco
}// fin del for que se repetira hasta haber rellenado con todos los barcos el tablero
}
/****************************************************************************************************
* Funcion: MiraHundido
* Descripcion: Funcion que devolvera true si encuentra barcos alrededor o false si es todo agua
*
*
* Parametros:
*
* Nombre E/S Descripcion
* ------ ----- -----------
* tabla E/S de tipo tablero donde introduciremos los barcos
* i E Valor de la posicion de la fila introducida por teclado
* j E Valor de la columna introducida por teclado
*
* Valor devuelto:
* BOOL, La funcion devuelve hundido si no se detectan barcos alrededor del punto de introduccion
*****************************************************************************************************/
bool MiraHundido(tablero tabla,int i,int j)
{
bool hundido;
hundido = true; // Deinimos la variable que devolveremos como salida de la funcion, la iniciamos a true.
int k ;
int l ;
for (k = i-1; k <= i + 1 ; k++) // iniciamos nuestro contador en i-1 e ira hasta i+1, que es la submatriz que queda alrededor de i,j
{ for (l = j-1; l <= j + 1; l++) // La variable de las columnas ira desde j-1 hasta j+1
{
/* cuando hacemos el bucle entraremos a veces en posiciones que no existen en nuestra
matriz por lo tanto debemos evitar que tomen valores en estas posiciones para evitar
resultados que no sabemos que dan, por lo tanto hacemos un if previo para solamente
ejecutar nuestra comprobacion en el vector sobre puntos que si existen en la matriz */
if ( k >= 0 && l >= 0 && k < FILAS && l < COLUMNAS)
{
if ( tabla[k][l] == 'b')
hundido = false;
}
}
}
return (hundido);
}
/***********************************************************************************
* Funcion: BuscaGanador
* Descripcion: Funcion que buscara en la matriz tablero si ya existe un ganador comprobando
que todas las entradas de la matriz son agua
*
*
* Parametros:
*
* Nombre E/S Descripcion
* ------ ----- -----------
* tabla E/S de tipo tablero donde introduciremos los barcos
*
*
* Valor devuelto:
* void, aqui modificaremos la matriz que se nos de para introducir los barcos
***********************************************************************************/
bool BuscaGanador(tablero tabla)
{
bool ganador = true; // Inicializamos nuestra variable a true
for (int i=0; i< FILAS; i++)
{
for (int j = 0; j < COLUMNAS; j++) // recorremos la matriz entera con estos dos bucles
{
if (tabla[i][j] == 'b' ) // Si encontramos algun barco en el tablero no habra ganador todavia
ganador = false; // por lo tanto devolveremos un valor false a nuestra funcion
}
}
return (ganador);
}