#include <stdio.h>
#include "conio.h"
#include <stdlib.h>
void marco (int,int,int,int);
void menu ();
void menu2 ();
void game ();
void tablaComp ();
void tablaHuman ();
void bomba ();
void bombaVS ();
void gameover ();
void guias (int);
void del (int,int,int);
/*Tamaño de matrices*/
char barcopc [10][12], barcoHuman [10][12];
int fila=4, columna=5, opc, nivel=1, flotaC, flotaH, ciclo=0;
int main ()
{
void clrscr ();
void presentacion ();
menu ();
clrscr ();
cprintf ("Has elegido salir del programa");
cprintf ("Gracias por elegir este programa");
return 0;
}
/*Funci¢n que imprime un marco de cualquier dimensi¢n que parpadea*/
void marco (int x,int y,int xx,int yy)
{
int a,b;
gotoxy (x,y); cprintf ("@"); //alt+64
gotoxy (xx,y); cprintf ("»"); //alt+187
gotoxy (x,yy); cprintf ("È"); //alt+200
gotoxy (xx,yy); cprintf ("¼"); //alt+188
for (a=x+1;a<xx;a++)
{
gotoxy (a,y); cprintf ("Í"); // alt+205 = Í
gotoxy (a,yy); cprintf ("Í");
}
for (b=y+1;b<yy;b++)
{
gotoxy (x,y);
cprintf ("º"); // alt+186 = º
gotoxy (xx,yy);
cprintf ("º");}
}
/*Continuaci¢n del men£ principal */
menu2 ()
{
do
{
del (9,36,39);
gotoxy (36,Cool; scanf ("%d", &opc);
if (opc==1)
{
if (nivel==1)
{
flotaC=columna*fila/4;
}
else
{
flotaC=columna*fila/3;
}
game ();
}
else
if (opc==2)
{
textcolor (RED);
gotoxy (15,11);
cprintf ("2. DIMENSION DE LAS TABLAS DE LOS JUGADORES");
cprintf (" Especifica el n£mero de columnas de las tablas");
cprintf ("(Min. ¯¯5 Max. ¯¯12):");
do
{
del (13,48,50);
gotoxy (48,13);
scanf ("%d", &columna);
if (columna<5 || columna>12)
{
textcolor (YELLOW);
gotoxy (15,14);
cprintf ("El numero permitido de columnas est entre 5 y 12");}
} while (columna<5 || columna>12);
del (14,15,65);
textcolor (MAGENTA);
gotoxy (20,15);
cprintf ("Digita el numero de filas del tablero");
gotoxy (23,16);
cprintf ("(M¡n. ¯¯4 Max. ¯¯10):");
do
{
del (16,48,50);
gotoxy (48,16);
scanf ("%d", &fila);
if (fila<4 || fila>10)
{
textcolor (YELLOW);
gotoxy (15,17);
cprintf ("El numero permitido de filas est entre 4 y 10");}
} while (fila<4 || fila>10);
del (17,15,63);
menu ();
}
else
if (opc==3)
{
do
{
textcolor (RED);
gotoxy (15,12);
cprintf ("3. NIVEL DEL JUEGO:");
textcolor (MAGENTA);
gotoxy (20,13);
cprintf ("Selecciona el nivel de juego:");
gotoxy (23,14);
cprintf ("1. F cil");
gotoxy (23,15);
cprintf ("2. Medio");
gotoxy (23,16);
cprintf ("3. Experto");
del (13,50,53);
gotoxy (50,13);
scanf ("%d", &nivel);
} while (nivel!=1 && nivel!=2 && nivel!=3);
menu ();
}
else
if (opc==0) {return 0;
}
else
{
gotoxy (20,1Cool;
printf ("Esa no es una opci¢n v lida, intente de nuevo...");
}
} while (opc!=1 && opc!=2 && opc!=3 && opc!=0);
return 0;
}
}
}
/*Funci¢n que ejecuta las dem s funciones del juego*/
void game ()
{
int x,y;
clrscr ();
if (nivel==1)
{
flotaH=flotaC;
}
if (nivel==2)
{
flotaH=flotaC-flotaC/4;
}
if (nivel==3)
{
flotaH=flotaC;
flotaC=flotaH-flotaH/4;
}
tablaComp ();
tablaHuman ();
do
{
bomba ();
if (flotaH>0)
{
bombaVS ();
textcolor (CYAN);
}
if (flotaH>9)
{
gotoxy (15,17);
cprintf ("Barcos Usuario: %d", flotaH);
}
else {gotoxy (15,17);
cprintf ("Barcos Usuario: %d", flotaH);
}
if (flotaC>9)
{
gotoxy (15,1Cool;
cprintf ("Barcos enemigos restantes: %d", flotaC);
}
else
{
gotoxy (15,1Cool;
cprintf ("Barcos enemigos restantes: %d", flotaC);}
} while (flotaC>0 && flotaH>0);
for (y=0;y<fila;y++) //imprime las casillas en las que estaban los barcos del enemigo
{
for (x=0;x<columna;x++)
{
if (barcoComp [y][x]=='')
{
textcolor (BLUE);
gotoxy ((x*2)+4,y+3);
cprintf ("%c", barcoComp [y][x]);
}
}
}
getch ();
gameover ();
}
//Funci¢n que captura e imprime la matriz del pc //
void tablaComp ()
{randomize ();
int cont, x, y;
for (y=0;y<fila;y++) //llena la matriz con cualquier valor
{for (x=0;x<columna;x++) {barcoComp [y][x]='0';}
}
for (cont=flotaC; cont>0; cont--)
{do //coloca los barcos de acuerdo al nivel y las dimensiones de la matriz
{x=random (columna); //el numero de columnas es el rango del eje X
y=random (fila); //el numero de filas es el rango del eje Y
if (barcoComp [y][x]!='')
{barcoComp [y][x]='';}
} while (barcoComp [y][x]!='');
}
textcolor (CYAN);
for (x=0;x<columna;x++) //imprime la matriz en pantalla
{for (y=0;y<fila;y++) {gotoxy ((x*2)+4,y+3); cprintf ("%s", y%2 ? "(" : ")");}
}
guias (1); // numeros guias de la tabla de la PC
}
/***** Funci¢n que captura e imprime la tabla del usuario *****/
void tablaHuman ()
{int x, y, cont;
for (y=0;y<fila;y++) //llena la matriz con cualquier valor
{for (x=0;x<columna;x++) {barcoHuman [y][x]='0';}
}
textcolor (CYAN);
for (x=0;x<columna;x++) //imprime la matriz en pantalla
{for (y=0;y<fila;y++) {gotoxy ((x*2)+34,y+3); cprintf ("%s", y%2 ? "(" : ")");}
}
guias (31); // numeros guias de la tabla del usuario
for (cont=0; cont<flotaH; cont++)
{do
{textcolor (MAGENTA);
if (flotaH-cont>9) {gotoxy (15,17); cprintf ("Barcos restantes: %d", flotaH-cont);}
else {gotoxy (15,17); cprintf ("Barcos restantes: %d", flotaH-cont);}
gotoxy (20,1Cool; cprintf ("Introduzca las coordenadas de su %d§ barco:", cont+1);
gotoxy (25,19); cprintf ("Eje Y (horizontal):");
do
{del (19,45,4Cool;
gotoxy (45,19); scanf ("%d", &y);
del (20,20,54);
if (y<=0 || y>fila)
{textcolor (YELLOW);
gotoxy (20,20); cprintf ("El valor debe estar entre 1 y %d", fila);}
} while (y<=0 || y>fila);
textcolor (MAGENTA);
gotoxy (25,21); cprintf ("Eje X (vertical):");
do
{del (21,43,46);
gotoxy (43,21); scanf ("%d", &x);
del (22,20,54);
if (x<=0 || x>columna)
{textcolor (YELLOW);
gotoxy (20,22); cprintf ("El valor debe estar entre 1 y %d", columna);}
} while (x<=0 || x>columna);
if (barcoHuman [y-1][x-1]=='')
{textcolor (GREEN);
gotoxy (20,23); cprintf ("Intentas poner un barco sobre otro barco!!");
delay (1500);
del (23,20,70);}
textcolor (LIGHTBLUE + BLINK);
} while (barcoHuman [y-1][x-1]=='');
gotoxy ((x*2)+32,y+2); cprintf (""); //imprime en pantalla la ubicacion del barco
barcoHuman[y-1][x-1]='';} //coloca el barco en matriz
del (19,45,4Cool; del (17,15,34); del (18,20,63);
del (19,25,45); del (21,25,47);
}
/***** Funci¢n de la jugada del computador,
tira una bomba en una (x,y) posici¢n al azar
*****/
void bomba ()
{int x, y, cont=1;
ciclo=0;
if (nivel==3)
{cont=0;} //aumenta la dificultad en el 3§ nivel (la PC intenta 2 veces si falla)
delay (1000); //Una breve pausa para ver el tiro de la computadora
for (cont; cont<2; cont++)
{do
{textcolor (CYAN);
x=random (columna); //columna es el rango del eje X
y=random (fila); //fila es el rango del eje Y
if (barcoHuman [y][x]=='')
{flotaH--;
textcolor (YELLOW + BLINK);
gotoxy (25,23); cprintf ("Acaban de hundir un barco tuyo!!");
delay (3000);
textcolor (RED);
del (23,25,57);
cont=2;} //ya hundido un barco del usuario, se hace falsa la condicion FOR
if (barcoHuman [y][x]!='X')
{barcoHuman [y][x]='X';
ciclo=1;} //ya hecha la jugada, se hace falsa la condicion WHILE
} while (ciclo!=1); //no se permite una repetici¢n de jugada (si ya se hizo en tal posici¢n)
}
gotoxy ((x*2)+34,y+3); cprintf ("X");
textcolor (CYAN);
if (flotaH>9) {gotoxy (15,17); cprintf ("Barcos Usuario: %d", flotaH);}
else {gotoxy (15,17); cprintf ("Barcos Usuario: %d", flotaH);}
if (flotaC>9) {gotoxy (15,1Cool; cprintf ("Barcos enemigos restantes: %d", flotaC);}
else {gotoxy (15,1Cool; cprintf ("Barcos enemigos restantes: %d", flotaC);}
}
/***** Funci¢n de la jugada del usuario *****/
void bombaVS ()
{int x,y;
textcolor (CYAN);
gotoxy (20,20); cprintf ("Introduce las coordenadas de tu lanzamiento");
gotoxy (20,21); cprintf ("Eje Y: Eje X:");
ciclo=0;
do
{do
{gotoxy (27,21); scanf ("%d", &y);
del (22,20,62);
if (y<=0 || y>fila)
{textcolor (GREEN);
gotoxy (20,22); cprintf ("El valor debe estar entre 1 y %d", fila);}
} while (y<=0 || y>fila);
textcolor (CYAN);
gotoxy (20,21); cprintf ("Eje Y: %d Eje X:", y);
do
{gotoxy (37,21); scanf ("%d", &x);
del (22,20,52);
if (x<=0 || x>columna)
{textcolor (GREEN);
gotoxy (20,22); cprintf ("El valor debe estar entre 1 y %d", columna);}
} while (x<=0 || x>columna);
textcolor (CYAN);
gotoxy (20,21); cprintf ("Eje Y: Eje X: ");
if (barcoComp [y-1][x-1]=='')
{flotaC--;
gotoxy (20,23); cprintf ("Eres genial!! Uno menos");
delay (1500);
del (23,20,43);
textcolor (RED);}
if (barcoComp [y-1][x-1]=='0' || barcoComp [y-1][x-1]=='')
{barcoComp [y-1][x-1]='X';
ciclo=1;} //ya hecha la jugada se hace falsa la condici¢n
else
{gotoxy (20,22); cprintf ("Ahi ya bombardeaste. Intenta en otro lado");}
} while (ciclo!=1);
gotoxy ((x*2)+2,y+2); cprintf ("X");
}
/**** Funci¢n que imprime el nivel, ganador, y las estad¡sticas finales ****/
void gameover ()
{clrscr ();
marco (15,6,62,11);
textcolor (LIGHTRED+BLINK);
if (nivel==1) {gotoxy (25,Cool; cprintf ("Nivel de Dificultad: PRINCIPIANTE");}
else
if (nivel==2) {gotoxy (25,Cool; cprintf ("Nivel de Dificultad: MEDIO");}
else {gotoxy (25,Cool; cprintf ("Nivel de Dificultad: EXPERTO");}
if (flotaC==0 && flotaH==0)
{
textcolor (RED);
gotoxy (17,9); cprintf ("Has tenido un empate");
}
else
if (flotaC==0)
{if (nivel!=3)
{gotoxy (20,12); cprintf ("Has vencido la flota enemiga");}
else
{textcolor (WHITE+BLINK);
gotoxy (20,12); cprintf ("Felicitaciones");}
textcolor (LIGHTRED+BLINK);
gotoxy (25,9); cprintf ("Tus barcos restantes: %d", flotaH);}
if (flotaH==0)
{textcolor (LIGHTRED+BLINK);
gotoxy (25,9); cprintf ("Barcos enemigos restantes: %d", flotaC);
textcolor (black);
gotoxy (10,12); cprintf ("Lo siento...!!");
}
getch ();
getch ();
menu ();
}