#include <stdio.h>
int strTamanho (char str[1000]){
int i,tam=0;
for(i=0; str[i]!='\0'; i++)
tam++;
return tam;
}
void strCopia(char str1[1000],char str2[1000]){
int i,j;
for(i=0; str2[i]!='\0'; i++)
str1[i]=str2[j];
str1[i]='\0';
}
void strConcatena(char str1[1000],char str2[1000]){
int i,j=0,tam=0,tam2=0;
for(i=0; str1[i]!='\0'; i++)
tam++;
for(i=0; str2[i]!='\0'; i++)
tam2++;
for(i=tam; i<(tam+tam2); i++){
str1[i]=str2[j];
j++;
}
str1[i]='\0';
}
void strAdicionaChar(char str[1000], char c){
int i;
while(str[i]!='\0')
i++;
str[i]=c;
str[i+1]='\0';
}
int validaEntradaLinhaColuna (int linha, char coluna){
if(linha>=1&&linha<=10){
if(coluna=='A')
return 1;
else if(coluna=='B')
return 1;
else if(coluna=='C')
return 1;
else if(coluna=='D')
return 1;
else if(coluna=='E')
return 1;
else if(coluna=='F')
return 1;
else if(coluna=='G')
return 1;
else if(coluna=='H')
return 1;
else if(coluna=='I')
return 1;
else if(coluna=='J')
return 1;
return 0;
}
return 0;
}
int validaPosicao (int mat[10][10],int barco,int linha,int coluna,char orientacao){
int i, j;
if(orientacao=='H'){
for(j=coluna; j<(coluna+barco); j++){
if(mat[linha][j]!=0||i<0||j<0||i>9||j>9)
return 0;
}
return 1;
}
else if(orientacao=='V'){
for(i=linha; i<(linha+barco); i++){
if(mat[i][coluna]!=0||i<0||j<0||i>9||j>9)
return 0;
}
return 1;
}
}
int podeAtirar (int mat[10][10],int linha,int coluna){
if(mat[linha][coluna]==-2)
return 0;
else if(mat[linha][coluna]==10)
return 0;
else if(mat[linha][coluna]==20)
return 0;
else if(mat[linha][coluna]==30)
return 0;
else if(mat[linha][coluna]==50)
return 0;
return 1;
}
void imprimeMensagem(char msg[1000]){
int i;
printf("************************\n");
printf("*\n* ");
for(i=0; msg[i]!='\0'; i++){
if(msg[i]!='!'||msg[i]=='.')
printf("%c",msg[i]);
}
printf("\n");
printf("*\n");
printf("************************\n");
}
char imprimeCelula (int celula,int etapa){
if(etapa==0){
if(celula<0)
return '*';
else if(celula==1)
return '1';
else if(celula==2)
return '2';
else if(celula==3)
return '3';
}
else if(celula==-2)
return 'x';
else if(celula==10 || celula==20 || celula==30)
return 'N';
else if(celula==50)
return 'A';
return '.';
}
void imprimeTabuleiro (int mat[10][10], int etapa){
int i, j, celula;
char a, im[10][10];
for(i=0; i<10; i++){
for(j=0; j<10; j++){
celula=mat[i][j];
a=imprimeCelula(celula,etapa);
im[i][j]=a;
}
}
printf(" ");
for(i=63; i<75; i++){
if(i>64)
printf(" %c",i);
}
printf("\n ");
for(i=61; i<74; i++){
if(i>61){
printf(" #");
}
}
printf("\n");
for(i=0; i<10; i++){
if(i<9){
printf("0%d #", i+1);
for(j=0; j<10; j++){
printf(" %c", im[i][j]);
}
printf(" #");
printf("\n");
}
else{
printf("%d #", i+1);
for(j=0; j<10; j++){
printf(" %c", im[i][j]);
}
printf(" #\n");
}
}
for(i=60; i<7; i++){
if(i>62){
printf(" #");
}
}
printf(" ");
for(i=61; i<74; i++){
if(i>61)
printf(" #");
}
printf("\n");
}
void posicionaBarco(int mat[10][10], int barco){
int i, j, l, c, dc=0;
char coluna, orientacao;
while(dc==0){
scanf(" %d %c", &l, &coluna);
if(validaEntradaLinhaColuna(l, coluna)==1){
if(barco>1)
scanf(" %c",&orientacao);
else
orientacao='H';
if(validaPosicao(mat, l, coluna, orientacao)==1){
l--;
if(coluna=='A')
c=0;
else if(coluna=='B')
c=1;
else if(coluna=='C')
c=2;
else if(coluna=='D')
c=3;
else if(coluna=='E')
c=4;
else if(coluna=='F')
c=5;
else if(coluna=='G')
c=6;
else if(coluna=='H')
c=7;
else if(coluna=='I')
c=8;
else if(coluna=='J')
c=9;
if(barco==1 && mat[l][c]==0)
dc++;
else if(barco==2 && orientacao=='H' && mat[l][c]==0 && mat[l][c+1]==0 && c+1<=9)
dc++;
else if(barco==2 && orientacao=='V' && mat[l][c]==0 && mat[l+1][c]==0 && l+1<=9)
dc++;
else if(barco==3 && orientacao=='H' && mat[l][c]==0 && mat[l][c+1]==0 && mat[l][c+2]==0 && c+2<=9)
dc++;
else if(barco==3 && orientacao=='V' && mat[l][c]==0 && mat[l+1][c]==0 && mat[l+2][c]==0 && l+2<=9)
dc++;
else
printf("Posicao indisponivel!\n");
}
if(barco==1){
for(i=0; i<10; i++){
for(j=0; j<10; j++){
if(i==l&&j==c)
mat[i][j]=1;
else if((i==l-1||i==l||i==l+1)&&(j==c-1||j==c||j==c+1))
mat[i][j]=-1;
}
}
}
else if(barco==2){
if(orientacao=='H'){
for(i=0; i<10; i++){
for(j=0; j<10; j++){
if(i==l&&(j==c||j==c+1))
mat[i][j]=2;
else if((i==l-1||i==l||i==l+1)&&(j==c-1||j==c||j==c+1||j==c+2))
mat[i][j]=-1;
}
}
}
else if(orientacao=='V'){
for(i=0; i<10; i++){
for(j=0; j<10; j++){
if((i==l||i==l+1)&&j==c)
mat[i][j]=2;
else if((i==l-1||i==l||i==l+1||i==l+2)&&(j==c-1||j==c||j==c+1))
mat[i][j]=-1;
}
}
}
}
else if(barco==3){
if(orientacao=='H'){
for(i=0; i<10; i++){
for(j=0; j<10; j++){
if(i==l&&(j==c||j==c+1||j==c+2))
mat[i][j]=3;
else if((i==l-1||i==l+1||i==l)&&(j==c||j==c-1||j==c+1||j==c+2||j==c+3))
mat[i][j]=-1;
}
}
}
else if(orientacao=='V'){
for(i=0; i<10; i++){
for(j=0; j<10; j++){
if(j==c&&(i==l||i==l+1||i==l+2))
mat[i][j]=3;
else if((i==l-1||i==l+1||i==l+2||i==l+3||i==l)&&(j==c||j==c-1||j==c+1))
mat[i][j]=-1;
}
}
}
}
}
void atirar(int mat[10][10],int linha,int coluna){
if(mat[linha][coluna]==0||mat[linha][coluna]==-1)
mat[linha][coluna]=-2;
else if(mat[linha][coluna]==1)
mat[linha][coluna]=10;
else if(mat[linha][coluna]==2)
mat[linha][coluna]=20;
else if(mat[linha][coluna]==3)
mat[linha][coluna]=30;
}
int calculaPontuacao(int mat[10][10],int linha,int coluna){
int a=0;
if(mat[linha][coluna]==10){
mat[linha][coluna]=50;
a=2;
}
if(mat[linha][coluna]==20){
if(mat[linha+1][coluna]==20){
mat[linha+1][coluna]=50;
mat[linha][coluna]=50;
a=4;
}
if(mat[linha-1][coluna]==20){
mat[linha-1][coluna]=50;
mat[linha][coluna]=50;
a=4;
}
if(mat[linha][coluna+1]==20){
mat[linha][coluna+1]=50;
mat[linha][coluna]=50;
a=4;
}
if(mat[linha][coluna-1]==20){
mat[linha][coluna-1]=50;
mat[linha][coluna]=50;
a=4;
}
return a;
}
if(mat[linha][coluna]==30){
if(mat[linha+2][coluna]==30&&mat[linha+1][coluna]==30){
mat[linha+2][coluna]=50;
mat[linha+1][coluna]=50;
mat[linha][coluna]=50;
a=7;
}
else if (mat[linha-1][coluna]==30&&mat[linha-2][coluna]==30){
mat[linha-1][coluna]=50;
mat[linha-2][coluna]=50;
mat[linha][coluna]=50;
a=7;
}
else if(mat[linha+1][coluna]==30&&mat[linha-1][coluna]==30){
mat[linha+1][coluna]=50;
mat[linha-1][coluna]=50;
mat[linha][coluna]=50;
a=7;
}
else if(mat[linha][coluna+1]==30&&mat[linha][coluna+2]==30){
mat[linha][coluna+1]=50;
mat[linha][coluna+2]=50;
mat[linha][coluna]=50;
a=7;
}
else if(mat[linha][coluna-1]==30&&mat[linha][coluna-2]==30){
mat[linha][coluna-1]=50;
mat[linha][coluna-2]=50;
mat[linha][coluna]=50;
a=7;
}
else if(mat[linha][coluna+1]==30 && mat[linha][coluna-1]==30){
mat[linha][coluna+1]=50;
mat[linha][coluna-1]=50;
mat[linha][coluna]=50;
a=7;
}
}
return a;
}
int main(){
int mat[10][10],i,j,celula, l;
char msg[1000]="Jogador 1 − Posicione o barco de tamanho 1 (1/6)", c;
for(i=0; i<10; i++){
for(j=0; j<10; j++){
mat[i][j]=0;
}
}
imprimeMensagem(msg);
imprimeTabuleiro(mat, 1);
posicionaBarco(mat, 1);
return 0;
}