Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <locale.h>
#include <windows.h>
#include <time.h>
#define ARENA 14 //Array weight
#define AGUA '~' //Water in array
#define ERRO 'X' //When the player miss a shot
#define DESTROYER 'D'//When player hit a Destroyer
#define SUBMARINO 'S'//When player hit a Submarine
#define HIDROAVIAO 'H'//When player hit a Seaplane
#define PORTAAVIAO 'P'//When player hit a aircraft carrier
void limpaTela () //Use to clear screen
{
#ifdef __WIN32__
system("CLS");
#else
//printf("\e[H\e[2J");
system("clear");
#endif
}
void limpaBuffer () //Use to clear buffer
{
#ifdef __WIN32__
fflush(stdin);
#else
__fpurge(stdin);
#endif
}
struct almirante //Player profile and dates
{
char nome[100];
int placar;
int disparos;
};
struct almirante jogador; //Player struct
struct Embarcacoes //Player craft
{
int submarino;
int destroyer;
int hidroaviao;
int portaaviao;
};
typedef struct Embarcacoes embarcacoes;
embarcacoes qt_embarcacoes = {3, 3, 2, 2}; //Quantitifes of each player's craft receive
int contador_de_barcos = 9; //Total of boats
char campo[ARENA][ARENA]; //Show array in screen
/*These 8 functions are used to define and put every boat on array
direcao = direction
linha = line
coluna = column
l = line
c = column
*/
int verifica_submarino (int direcao, int linha, int coluna, char A[ARENA][ARENA])
{
int l, c;
if(direcao)
{
for(c = coluna; c <= coluna + 1; c++)
{
if(c >= ARENA || A[linha][c] == SUBMARINO)
{
return 0;
}
}
} else
{
for(l = linha; l <= linha + 1; l++)
{
if(l >= ARENA || A[l][coluna] == SUBMARINO)
return 0;
}
}
return 1;
}
void imprime_submarino (int direcao, int linha, int coluna, char A[ARENA][ARENA])
{
int l, c;
if(direcao)
{
for(c = coluna; c < coluna + 1; c++)
{
A[linha][c] = SUBMARINO;
}
} else
{
for(l = linha; l < linha + 1; l++)
{
A[l][coluna] = SUBMARINO;
}
}
if(A == campo)
{
qt_embarcacoes.submarino--;
}
}
int verifica_destroyer (int direcao, int linha, int coluna, char A[ARENA][ARENA])
{
int l, c;
if(direcao)
{
for(c = coluna; c <= coluna + 3; c++)
{
if(c >= ARENA || A[linha][c] == DESTROYER)
{
return 0;
}
}
} else
{
for(l = linha; l <= linha + 3; l++)
{
if(l >= ARENA || A[l][coluna] == DESTROYER)
return 0;
}
}
return 1;
}
void imprime_destroyer (int direcao, int linha, int coluna, char A[ARENA][ARENA])
{
int l, c;
if(direcao)
{
for(c = coluna; c < coluna + 3; c++)
{
A[linha][c] = DESTROYER;
}
} else
{
for(l = linha; l < linha + 3; l++)
{
A[l][coluna] = DESTROYER;
}
}
if(A == campo)
{
qt_embarcacoes.destroyer--;
}
}
int verifica_hidroaviao (int direcao, int linha, int coluna, char A[ARENA][ARENA])
{
int l, c;
if(direcao)
{
for(c = coluna; c <= coluna + 2; c++)
{
if(c >= ARENA || A[linha][c] == HIDROAVIAO)
{
return 0;
}
}
} else
{
for(l = linha; l <= linha + 2; l++)
{
if(l >= ARENA || A[l][coluna] == HIDROAVIAO)
return 0;
}
}
return 1;
}
void imprime_hidroaviao (int direcao, int linha, int coluna, char A[ARENA][ARENA])
{
int l, c;
if(direcao)
{
for(c = coluna; c < coluna + 2; c++)
{
A[linha][c] = HIDROAVIAO;
}
} else
{
for(l = linha; l < linha + 2; l++)
{
A[l][coluna] = HIDROAVIAO;
}
}
if(A == campo)
{
qt_embarcacoes.hidroaviao--;
}
}
int verifica_portaaviao (int direcao, int linha, int coluna, char A[ARENA][ARENA])
{
int l, c;
if(direcao)
{
for(c = coluna; c <= coluna + 4; c++)
{
if(c >= ARENA || A[linha][c] == PORTAAVIAO)
{
return 0;
}
}
} else
{
for(l = linha; l <= linha + 4; l++)
{
if(l >= ARENA || A[l][coluna] == PORTAAVIAO)
return 0;
}
}
return 1;
}
void imprime_portaaviao (int direcao, int linha, int coluna, char A[ARENA][ARENA])
{
int l, c;
if(direcao)
{
for(c = coluna; c < coluna + 4; c++)
{
A[linha][c] = PORTAAVIAO;
}
} else
{
for(l = linha; l < linha + 4; l++)
{
A[l][coluna] = PORTAAVIAO;
}
}
if(A == campo)
{
qt_embarcacoes.portaaviao--;
}
}
/* The function haBarcos (Are there boats) is used to check if are still boats to put in array
embarcacoes = craft
*/
int haBarcos(int embarcacoes, char A[ARENA][ARENA])
{
switch(embarcacoes)
{
case 1:
if(A == campo)
{
if(qt_embarcacoes.submarino == 0)
{
return 0;
}
}
break;
case 2:
if(A == campo)
{
if(qt_embarcacoes.destroyer == 0)
{
return 0;
}
}
break;
case 3:
if(A == campo)
{
if(qt_embarcacoes.hidroaviao == 0)
{
return 0;
}
}
break;
case 4:
if(A == campo)
{
if(qt_embarcacoes.portaaviao == 0)
{
return 0;
}
}
break;
}
return 1;
}
/* Select boats randomly and put in Array
embarcacoes = craft
linha = line
coluna = column
direcao = direction
*/
void colherEmbarcacoes (char A[ARENA][ARENA])
{
int embarcacoes, linha, coluna, direcao = 0;
srand((unsigned)time(NULL));
do
{
embarcacoes = 1 + (rand() % 4);
while(!haBarcos(embarcacoes, A))
{
embarcacoes = 1 + (rand() % 4);
}
linha = 1 + (rand() % 14);
coluna = 1 + (rand() % 14);
direcao = 1 + rand() % 2;
if(verificaEmbarcacoes(embarcacoes, direcao, linha, coluna, A))
{
imprime_embarcacoes(embarcacoes, direcao, linha, coluna, A);
imprimeTabuleiro(A);
contador_de_barcos--;
}
} while(contador_de_barcos);
}
/*
*/
int verificaEmbarcacoes (int embarcacoes, int direcao, int linha, int coluna, char A[ARENA][ARENA])
{
switch(embarcacoes)
{
case 1:
return verifica_submarino(direcao, linha, coluna, A);
case 2:
return verifica_destroyer(direcao, linha, coluna, A);
case 3:
return verifica_hidroaviao(direcao, linha, coluna, A);
case 4:
return verifica_portaaviao(direcao, linha, coluna, A);
}
return 0;
}
void imprime_embarcacoes (int embarcacoes, int direcao, int linha, int coluna, char A[ARENA][ARENA])
{
switch(embarcacoes)
{
case 1:
imprime_submarino(direcao, linha, coluna, A);
break;
case 2:
imprime_destroyer(direcao, linha, coluna, A);
break;
case 3:
imprime_hidroaviao(direcao, linha, coluna, A);
break;
case 4:
imprime_portaaviao(direcao, linha, coluna, A);
break;
}
}
/*Prepare the array*/
void preparaTabuleiro ()
{
int l, c;
for(l = 1; l < ARENA; l = l + 1)
{
for(c = 1; c < ARENA; c = c + 1)
{
campo[l][c] = AGUA;
}
printf("\n");
}
}
/*Print the array*/
void imprimeTabuleiro (char A[ARENA][ARENA])
{
int l, c;
if(A == campo)
{
for(l = 1; l < ARENA; l = l + 1)
{
for(c = 1; c < ARENA; c = c + 1)
{
printf(" \t%c", campo[l][c]);
}
printf("\n");
}
}
}
/* Input where to shot and conditions
*/
void batalha_naval (int direcao, int linha, int coluna, char A[ARENA][ARENA])
{
int hidro_cont, porta_cont, des_cont;
int vida_inimiga;
int l, c;
jogador.placar = 0;
jogador.disparos = 46;
vida_inimiga = 36;
hidro_cont = 0;
porta_cont = 0;
des_cont = 0;
imprimeTabuleiro(campo);
//Condition to continue playing
do
{
//Try
printf("Almirante %s\n", jogador.nome); //Player Name
printf("Disparo Restantes: %i/46\n", jogador.disparos); //Remaning shot
printf("Vida Inimiga: %i/36\n\n", vida_inimiga); //Enemy health
printf("Informe a linha: "); //Line where to shot
scanf("%i", &l);
printf("Informe a coluna: "); //Colunm where to shot
scanf("%i", &c);
printf("\n");
//What happen to array when shot
if(l >= 1 && l < ARENA && c >= 1 && c < ARENA && campo[l][c] == AGUA)
{
switch(campo[l][c])
{
case 0:
campo[l][c] = ERRO;
imprimeTabuleiro(A);
jogador.disparos--;
printf("Errou\n");
break;
case 1:
campo[l][c] = SUBMARINO;
imprimeTabuleiro(campo);
vida_inimiga--;
printf("Acertou!\n");
break;
case 2:
campo[l][c] = HIDROAVIAO;
imprimeTabuleiro(campo);
vida_inimiga--;
hidro_cont = (hidro_cont == 3 ? 0 : hidro_cont+1);
printf("Acertou!\n");
break;
case 3:
campo[l][c] = PORTAAVIAO;
imprimeTabuleiro(campo);
vida_inimiga--;
porta_cont = (porta_cont == 4 ? 0 : porta_cont+1);
printf("Acertou\n");
break;
case 4:
campo[l][c] = DESTROYER;
imprimeTabuleiro(campo);
vida_inimiga--;
des_cont = (des_cont == 3 ? 0 : des_cont+1);
printf("Acertou!\n");
break;
default:
printf("ErrROU!\n");
}
}
//Victory condition
if(vida_inimiga == 0)
{
system("cls");
puts("FIM DO JOGO");
puts("VOCÊ VENCEU!");
puts("");
jogador.placar = jogador.placar + 1;
printf("Jogador: %s\nPlacar: %i", jogador.nome, jogador.placar);
puts("");
system("pause");
exit(1);
}
//Loss condition
if(jogador.disparos == 0)
{
system("cls");
puts("FIM DO JOGO");
puts("VOCÊ PERDEU");
jogador.placar = jogador.placar + 0;
printf("Jogador: %s\nPlacar: %i", jogador.nome, jogador.placar);
puts("");
system("pause");
exit(1);
}
}
while (vida_inimiga != 0 && jogador.disparos != 0); //Fim do Do/While
}
int main ()
{
setlocale(LC_ALL,"portuguese");
preparaTabuleiro();
imprimeTabuleiro(campo);
colherEmbarcacoes(campo);
void batalha_naval(int direcao, int linha, int coluna, char A[ARENA][ARENA]);
system("pause");
return 0;
}