Code:
#include "config.h"
#include "functions.h"
#include "data.h"
#include "constants.h"
int empezar()
{
IniciarTablero(TableroJ1,AGUA); // Poner todas las casillas con el símbolo de agua (^).
DibujarTablero(TableroJ1); // Dibujar el tablero.
/* Colocar los barcos en las posiciones deseadas */
strcpy(frase,"[Casillas del AirCraft Carrier (5 casillas)]\n");
printf("%s",frase);
PedirCasilla(AIRCRAFTCARRIER);
strcpy(frase,"[Casillas del BattleShip (4 casillas)]\n\0");
printf("%s",frase);
PedirCasilla(BATTLESHIP);
strcpy(frase,"[Casillas del Submarine (3 casillas)]\n");
printf("%s",frase);
PedirCasilla(SUBMARINE);
strcpy(frase,"[Casillas del Cruiser (3 casillas)]\n");
printf("%s",frase);
PedirCasilla(CRUISER);
strcpy(frase,"[Casillas del Destroyer (2 casillas)]\n");
printf("%s",frase);
PedirCasilla(DESTROYER);
printf(" Su tablero ha sido creado.\n");
Sleep(1000);
system("cls");
printf("Creando tablero de la maquina...");
IniciarTablero(Aux,OCULTA); // Poner todas las casillas con el símobolo de casilla oculta(O).
IniciarTableroJ2(); // Generar aleaoriamente el tablero del oponente.
GenerarLista();
system("cls");
printf("\n\n\n\n\n\n Vamos al mambo!\n");
Sleep(2000);
/* Iniciar la batalla */
while (1)
{
TurnoJ1(); // Turno del jugador
if (tocadosJ1 == 17) // Si se han destruído todos los barcos
{ // del oponente se gana y acaba el juego.
system("cls");
printf(" GANASTE\n");
return 0;
}
TurnoJ2(); // Turno del oponente.
if (tocadosJ1 == 17) // Si se han destruído todos los barcos
{ // del jugador se pierde y acaba el juego.
system("cls");
printf(" PERDISTE\n");
return 0;
}
}
}
/* Inicia el tablero */
void IniciarTablero(char Tablero[10][10],char simbolo)
{
int i,j;
for(i=0;i<10;i++)
{
for (j=0;j<10;j++)
Tablero[i][j]=simbolo;
}
}
/* Función que genera el tablero del oponente aleatoriamente */
void IniciarTableroJ2()
{
Casilla aleatoria;
char pos,posicion[2]={'v','h'};
int i;
IniciarTablero(TableroJ2,AGUA); // Primero se rellena el tablero con el símoblo de agua (^).
srand(time(NULL));
for (i=0;i<5;i++)
{
do
{
aleatoria.letra=(rand()%10)+65; // Casilla
aleatoria.numero=(rand()%10)+1; // Random.
pos=posicion[rand()%2]; // Posición Random.
}while(!VerificarCasilla(TableroJ2,aleatoria,Barcos[i],pos)); // Verificar si la casilla es válida.
Almacenar(TableroJ2,Barcos[i],aleatoria,pos); // Se almacena el barco en el tablero.
}
}
/* Dibujar el tablero */
#define ks_LONGITUD_X_CASILLA " " //SON 3 ESPACIOS
#define kc_LONGITUD_Y_CASILLA 2
#define kc_MITAD_CANTIDAD_CASILLAS 5
#define ki_FONDO_AZUL_LETRA_AZUL 17
#define ki_FONDO_CYAN_LETRA_CYAN 51
#define ki_FONDO_ROJO_VINO 69
/*
The different color codes are
0 BLACK
1 BLUE
2 GREEN
3 CYAN
4 RED
5 MAGENTA
6 BROWN
7 LIGHTGRAY
8 DARKGRAY
9 LIGHTBLUE
10 LIGHTGREEN
11 LIGHTCYAN
12 LIGHTRED
13 LIGHTMAGENTA
14 YELLOW
15 WHITE
*/
void _MarcosLaterales(HANDLE hConsole){
SetConsoleTextAttribute(hConsole, ki_FONDO_ROJO_VINO);
printf(" ");
}
void _MarcosLogitudinales(HANDLE hConsole){
int i;
_MarcosLaterales(hConsole);
for(i=0;i<kc_MITAD_CANTIDAD_CASILLAS*2;i++){
printf(ks_LONGITUD_X_CASILLA);
}
_MarcosLaterales(hConsole);
}
void gotoxy2( int column, int line )
{
COORD coord;
coord.X = column;
coord.Y = line;
SetConsoleCursorPosition(
GetStdHandle( STD_OUTPUT_HANDLE ),
coord
);
}
void _ImprimirFichas(char Tablero[10][10]){
HANDLE hConsole;
hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
int i,j;
for(i=0;i<10;i++)
for(j=0;j<10;j++){
gotoxy2(4+j*3,21-i*kc_LONGITUD_Y_CASILLA);
if(Tablero[j][i]=='0'){
SetConsoleTextAttribute(hConsole,ki_FONDO_CYAN_LETRA_CYAN);
printf("%c ",Tablero[j][i]);
}else{
SetConsoleTextAttribute(hConsole,FONDO_ROJO_LETRA_ROJA);
printf("%c ",Tablero[j][i]);
//ki_FONDO_CYAN_LETRA_CYAN
}
}
}
void DibujarTablero(char Tablero[10][10])
{
int i,j,letra=65;
system("cls");
HANDLE hConsole;
hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
int k,L;
gotoxy2(0,0);
printf("BattleSHIP:\n\n");
/**< Dibujando el Tablero */
_MarcosLogitudinales( hConsole);
printf("\n");
for(k=0;k<kc_MITAD_CANTIDAD_CASILLAS*2;k++){
for(i=0;i<kc_LONGITUD_Y_CASILLA;i++){
_MarcosLaterales(hConsole);
for(j=0;j<kc_MITAD_CANTIDAD_CASILLAS*2;j++){
SetConsoleTextAttribute(hConsole, ki_FONDO_CYAN_LETRA_CYAN);
printf(ks_LONGITUD_X_CASILLA);
}
_MarcosLaterales(hConsole);
printf("\n");
}
}
_MarcosLogitudinales( hConsole);
printf("\n\n");
SetConsoleTextAttribute(hConsole, FONDO_NEGRO_LETRA_GRIS);
_ImprimirFichas(Tablero);
// printf(" 1 2 3 4 5 6 7 8 9 10\n\n");
// for (i=0;i<10;i++,letra++)
// {
// printf(" %c ",letra);
// for (j=0;j<10;j++)
// printf("%c ",Tablero[i][j]);
// printf("\n\n");
// }
// printf("%s",frase);
gotoxy2(0,30);
}
/* Función que pide una casilla a partir de la cual se introduce */
/* un barco determinado en posición vertical u horizontal */
void PedirCasilla(int barco)
{
Casilla cas;
char posicion;
int valida;
do {
valida=0;
fflush(stdin);
printf("Letra: ");
scanf("%c",&cas.letra);
cas.letra=toupper(cas.letra);
if (cas.letra < 65 || cas.letra > 74) // Verificar si la letra pertenece al rango válido.
valida++;
printf("Numero: ");
scanf("%d",&cas.numero);
if (cas.numero < 1 || cas.numero > 10) // Verificar si el número pertenece al rango válido.
valida++;
printf("Vertical u horizontal (v/h): ");
fflush(stdin);
scanf("%c",&posicion);
if (posicion != 'v' && posicion != 'h') // Verificar si la posición es válida.
valida++;
if (!VerificarCasilla(TableroJ1,cas,barco,posicion))
valida++;
if (valida > 0) // Si falla algún parámetro anterior
{ // se muestra un mensaje de error.
printf("Casilla no valida o posicion no valida\n");
Sleep(1000);
}
DibujarTablero(TableroJ1);
}while(valida > 0); // Se vuelven a pedir los parámetros hasta que sean correctos.
Almacenar(TableroJ1,barco,cas,posicion); // Almacenar el barco en le tablero
strcpy(frase,"\0");
DibujarTablero(TableroJ1); // Dibujar el tablero
}
/* Función que verifica si la casilla inroducida es correcta */
int VerificarCasilla(char Tablero[10][10],Casilla cas,int barco,char posicion)
{
int fila,columna,i,cont=0,tope;
fila=cas.letra-65;
columna=cas.numero-1;
if (Tablero[fila][columna] != AGUA) // Si la casilla está ocupada.
return 0;
if (posicion == 'h') // Si la posición es horizontal, se verifica si
{ // el barco cabe en la fila a partir de esa casilla.
tope=columna+barco;
for (i=columna;i<10 && i<tope;i++)
{
if (Tablero[fila][i] == AGUA) // Contar las casillas libres que tiene
cont++; // la casilla elegida a partir de esta.
else
return 0;
}
if (cont < barco) // Si las casillas libres son insuficientes, la casilla no vale.
return 0;
return 1;
}
else // Mismo método que el anterior pero en vertical.
{
tope=fila+barco;
for (i=fila;i<10 && i<tope;i++)
{
if (Tablero[i][columna] == AGUA)
cont++;
else
return 0;
}
if (cont < barco)
return 0;
return 1;
}
}
void Almacenar(char Tablero[10][10],int barco,Casilla cas,char posicion)
{
int i,fila,columna,tope;
char tipo;
int aux1=0;
fila=cas.letra-65;
columna=cas.numero-1;
switch(barco) // Colocar una letra según el barco.
{
case AIRCRAFTCARRIER:
tipo='A';
break;
case BATTLESHIP:
tipo='B';
break;
case SUBMARINE:
if (aux1 == 0)
{
tipo='S';
aux1++;
}
else
tipo='C';
break;
case DESTROYER:
tipo='D';
break;
}
/* Almacenar el barco según la posición y la casilla */
if (posicion == 'h')
{
tope=columna+barco;
for (i=columna;i<tope;i++)
Tablero[fila][i]=tipo;
}
else
{
tope=fila+barco;
for (i=fila;i<tope;i++)
Tablero[i][columna]=tipo;
}
}
/* Función turno del jugador */
void TurnoJ1()
{
Casilla cas;
int valida,fila,columna, tocadosJ1=0;
strcpy(frase,"[Tu turno]\n");
DibujarTablero(Aux);
do {
valida=0;
fflush(stdin);
printf("Letra: ");
scanf("%c",&cas.letra);
cas.letra=toupper(cas.letra);
if (cas.letra < 65 || cas.letra > 74) // Verificar si la letra pertenece al rango válido
valida++;
printf("Numero: ");
scanf("%d",&cas.numero);
if (cas.numero < 1 || cas.numero > 10) // Verificar si el número pertenece al rango válido.
valida++;
fila=cas.letra-65;
columna=cas.numero-1;
if (Aux[fila][columna] != OCULTA) // Verificar si la casilla ya está "tocada".
valida++;
if (valida > 0) // Si falla algún parámetro anterior
{ // se muestra un mensaje de error.
printf("Casilla no valida\n");
Sleep(1000);
}
DibujarTablero(Aux); // Se refresca" la pantalla.
}while(valida > 0);
Aux[fila][columna]=AtacarCasilla(TableroJ2,cas); // Comprobar la casilla.
if (Aux[fila][columna] == HERIDO) // Si se ha tocado un barco oponente.
{
strcpy(frase,"[Tocado]\n");
tocadosJ1++;
}
else // Si ha caído en agua.
strcpy(frase,"[Agua]\n");
DibujarTablero(Aux); // Dibujar el tablero
system("pause");
}
/* Función turno del oponente */
void TurnoJ2()
{
Casilla cas;
int fila,columna, contador=0, tocadosJ2=0;
strcpy(frase,"[Turno de tu oponente]\n");
DibujarTablero(TableroJ1);
cas=Lista[contador++];
fila=cas.letra-65;
columna=cas.numero-1;
TableroJ1[fila][columna]=AtacarCasilla(TableroJ1,cas); // Comprobar la casilla.
if (TableroJ1[fila][columna] == HERIDO) // Si se ha tocado un barco oponente.
{
strcpy(frase,"[Herido!]\n");
tocadosJ2++;
}
else // Si ha caído en agua.
strcpy(frase,"[Toco Agua!]\n");
DibujarTablero(TableroJ1); // Dibujar el tablero
system("pause");
}
/* Comprobamos la casilla para atacar */
char AtacarCasilla(char Tablero[10][10],Casilla cas)
{
int fila,columna;
fila=cas.letra-65;
columna=cas.numero-1;
if (Tablero[fila][columna] == 'P' || Tablero[fila][columna] == 'A' || Tablero[fila][columna] == 'S' || Tablero[fila][columna] == 'C' || Tablero[fila][columna] == 'D')
return HERIDO; // Si se acierta.
return AGUA;
}
/* Lista aleatoria de casillas */
/* Ataque de la maquina */
void GenerarLista()
{
int i,j,num;
Casilla aux;
for (i=0;i<100;i++)
{
for (j=1;j<11;j++)
{
Lista[i].letra=j+64; // Guarda todas las casillas
Lista[i].numero=j; // válidas en orden ascendente.
}
}
srand(time(NULL));
for (i=0;i<100;i++) // Desordenar las casillas.
{
num=rand()%100;
aux=Lista[i];
Lista[i]=Lista[num];
Lista[num]=aux;
}
}
Constants.h