Ir ao conteúdo

Posts recomendados

Postado

Boa tarde, 

 

Estou trabalhando em um jogo de Batalha Naval e estou tendo dificuldades na hora de alocação dos barcos. 

 

Basicamente as embarcações possuem mais de uma unidade na matriz (com exceção do submarino que é apenas uma) e são alocadas tanto na vertical quanto na horizontal (exemplo o portão avião, pode ser tanto em "PPPP" ou

"P

 P

 P

P"                                                                                                               

 

Para isso eu sorteio um número que define a direção da posição, se for 0 é horizontal, se for 1 é vertical, mas não está sendo alocado. 

Esse é o código que escrevi, alguém sabe o que tem de errado? Grato! 

 

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <windows.h>
#include <time.h>

#define AGUA '~'
#define ERRO 'X'
#define TAMANHO 11
#define SUBMARINO 'S'
#define DESTROYER 'D'
#define HIDROAVIAO 'H'
#define PORTAAVIAO 'P'

char arena[TAMANHO][TAMANHO], arena_inimigo[TAMANHO][TAMANHO];
int linha, coluna;

struct embarcacoes
{
    int submarino;
    int destroyer;
    int hidro_aviao;
    int porta_aviao;
};

typedef struct embarcacoes barcos;

barcos qt_barcos = {3, 3, 2, 2};


struct almirante
{
    char nome[100];
    int placar;
    int disparos;
    struct embarcacoes
    };

struct almirante jogador;

void prepara_tabuleiro ()
{
    int l, c;

    for(l = 1; l < TAMANHO; l++)
    {
        for(c = 1; c < TAMANHO; c++)
        {
            arena_inimigo[l][c] = AGUA;
            arena[l][c] = AGUA;
        }
    }
}

int imprime_submarino ()
{
    int l, c, direcao;

    l = 0;
    c = 0;

    srand((unsigned)time(NULL));

    do
    {
        direcao = rand() % 2;
        l = rand() % TAMANHO;
        c = rand() % TAMANHO;

        if(direcao == 0)
        {
            for(l = 0; l < l + 1; l++)
            {
                if(arena_inimigo[l][c] == AGUA)
                {
                    arena_inimigo[linha][c] = SUBMARINO;
                    return 0;
                }
            }

        }
        else
        {
            for(c = 0; c < c + 1; c++)
            {
                arena_inimigo[l][coluna] = SUBMARINO;
                return 0;
            }
        }
    }
    while(qt_barcos.submarino != 0);

}

int imprime_destroyer ()
{
    int l, c, direcao;

    l = 0;
    c = 0;

    srand((unsigned)time(NULL));

    do
    {
        direcao = rand() % 2;
        l = rand() % TAMANHO;
        c = rand() % TAMANHO;

        if(direcao == 0)
        {
            for(l = 0; l < l + 2; l++)
            {
                if(arena_inimigo[l][c] == AGUA)
                {
                    arena_inimigo[linha][c] = DESTROYER;
                    return 0;
                }
            }

        }
        else
        {
            for(c = 0; c < c + 2; c++)
            {
                arena_inimigo[l][coluna] = DESTROYER;
                return 0;
            }
        }
    }
    while(qt_barcos.destroyer != 0);
}

int imprime_hidroaviao ()
{
    int l, c, direcao;

    l = 0;
    c = 0;

    srand((unsigned)time(NULL));

    do
    {
        direcao = rand() % 2;
        l = rand() % TAMANHO;
        c = rand() % TAMANHO;

        if(direcao == 0)
        {
            for(l = 0; l < l + 3; l++)
            {
                if(arena_inimigo[l][c] == AGUA)
                {
                    arena_inimigo[linha][c] = HIDROAVIAO;
                    return 0;
                }
            }

        }
        else
        {
            for(c = 0; c < c + 3; c++)
            {
                arena_inimigo[l][coluna] = HIDROAVIAO;
                return 0;
            }
        }
    }
    while(qt_barcos.hidro_aviao != 0);
}

int imprime_portaaviao ()
{
    int l, c, direcao;

    l = 0;
    c = 0;

    srand((unsigned)time(NULL));

    do
    {
        direcao = rand() % 2;
        l = rand() % TAMANHO;
        c = rand() % TAMANHO;

        if(direcao == 0)
        {
            for(l = 0; l < l + 4; l++)
            {
                if(arena_inimigo[l][c] == AGUA)
                {
                    arena_inimigo[linha][c] = PORTAAVIAO;
                    return 0;
                }
            }

        }
        else
        {
            for(c = 0; c < c + 4; c++)
            {
                arena_inimigo[l][coluna] = PORTAAVIAO;
                return 0;
            }
        }
    }
    while(qt_barcos.porta_aviao != 0);
}

void imprimeTabuleiro ()
{
    int l, c;

    for(l = 1; l < TAMANHO; l++)
    {
        for(c = 1; c < TAMANHO; c++)
        {
            printf(" \t%c", arena[l][c]);
        }
        printf("\n");
    }

}

int controles ()
{
    int vida_inimiga;
    int l, c;

    jogador.disparos = 999;
    vida_inimiga = 36;

    do
    {
        //Exibe principais informações na tela
        printf("Almirante %s\n", jogador.nome);
        printf("Disparo Restantes: %i/46\n", jogador.disparos);
        printf("Vida Inimiga: %i/36\n\n", vida_inimiga);
        printf("Informe a linha: ");
        scanf("%i", &l);
        printf("Informe a coluna: ");
        scanf("%i", &c);
        printf("\n");


        if(l >= 1 && l < TAMANHO && c >= 1 && c < TAMANHO && arena_inimigo[l][c] == AGUA)
        {
            switch(arena_inimigo[l][c])
            {
            case AGUA:
                arena[l][c] = ERRO;
                system("cls");
                imprimeTabuleiro();
                jogador.disparos--;
                printf("Errou\n");
                break;

            case SUBMARINO:
                arena[l][c] = 'S';
                imprimeTabuleiro();
                jogador.disparos--;
                vida_inimiga--;
                printf("Acertou!\n");
                break;

            case HIDROAVIAO:
                arena[l][c] = 'H';
                imprimeTabuleiro();
                jogador.disparos--;
                vida_inimiga--;
                printf("Acertou!\n");
                break;

            case DESTROYER:
                arena[l][c] = 'D';
                imprimeTabuleiro();
                jogador.disparos--;
                vida_inimiga--;
                printf("Acertou!\n");
                break;

            case PORTAAVIAO:
                arena[l][c] = 'P';
                imprimeTabuleiro();
                jogador.disparos--;
                vida_inimiga--;
                printf("Acertou\n");
                break;

            default:
                printf("ErrROU!\n");
            }
        }

        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("");
            getchar();
            exit(1);
        }

        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("");
            getchar();
            exit(1);
        }

    }
    while (vida_inimiga != 0 && jogador.disparos != 0);

}

int main ()
{
    setlocale(LC_ALL,"Portuguese");
    prepara_tabuleiro();
    imprime_submarino();
    imprime_destroyer();
    imprime_hidroaviao();
    imprime_portaaviao();
    imprimeTabuleiro();
    controles();
    getch();
    return 0;
}

 

  • Curtir 1
Postado

@Lucas Assunção de Sousa     na hora de colocar os barcos na matriz  ele estava usando as variáveis de forma errada, coloquei outras variáveis e está colocando os barcos mas ainda precisa melhorar pois tem hora que coloca em posições da matriz que não aparece,  mas está funcionando, e seu código com algumas modificações ficou assim :

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <locale.h>
#include <windows.h>
#include <time.h>

#define AGUA '~'
#define ERRO 'X'
#define TAMANHO 11
#define SUBMARINO 'S'
#define DESTROYER 'D'
#define HIDROAVIAO 'H'
#define PORTAAVIAO 'P'

char arena[TAMANHO][TAMANHO], arena_inimigo[TAMANHO][TAMANHO];
int linha, coluna,i,j;
typedef enum{BLACK,BLUE,GREEN,CYAN,RED,MAGENTA,BROWN,LIGHTGRAY,DARKGRAY,
LIGHTBLUE,LIGHTGREEN,LIGHTCYAN,LIGHTRED,LIGHTMAGENTA,YELLOW,WHITE} COLORS;

static int __BACKGROUND = BLACK;
static int __FOREGROUND = LIGHTGRAY;

void textcolor (int color){
    __FOREGROUND = color;
    SetConsoleTextAttribute (GetStdHandle (STD_OUTPUT_HANDLE),
    color + (__BACKGROUND << 4));
}

struct embarcacoes
{
    int submarino;
    int destroyer;
    int hidro_aviao;
    int porta_aviao;
};

typedef struct embarcacoes barcos;

barcos qt_barcos = {3, 3, 2, 2};


struct almirante
{
    char nome[100];
    int placar;
    int disparos;
    struct embarcacoes;
    };

struct almirante jogador;

void prepara_tabuleiro ()
{
    int l, c;

    for(l = 0; l < TAMANHO; l++)
    {
        for(c = 0; c < TAMANHO; c++)
        {
            arena_inimigo[l][c] = AGUA;
            arena        [l][c] = AGUA;
        }
    }
}

void imprime_submarino ()
{
    int l, c, direcao;

        direcao = rand() % 2;
        l = rand() % TAMANHO;
        c = rand() % TAMANHO;

                if(arena_inimigo[l][c] == AGUA)
                {
                    arena_inimigo[l][c] = SUBMARINO;
                }
}
void imprime_destroyer ()
{
    int l, c, direcao;
        direcao = rand() % 2;
        l = rand() % TAMANHO;
        c = rand() % TAMANHO;
        if(direcao == 0)
        {
            for(i=l;i<l+2;i++)
            {
                if(arena_inimigo[i][c] == AGUA)
                {
                    arena_inimigo[i][c] = DESTROYER;
                }
            }
        }
        else
        {
            for(i=c;i<c+2;i++)
            {
                arena_inimigo[l][i] = DESTROYER;
            }
        }
}
void imprime_hidroaviao ()
{
    int l, c, direcao;

        direcao = rand() % 2;
        l = rand() % TAMANHO;
        c = rand() % TAMANHO;

        if(direcao == 0)
        {
                if(arena_inimigo[l][c] == AGUA)
                {
                    arena_inimigo[l  ][c  ] = HIDROAVIAO;
                    arena_inimigo[l+1][c+1] = HIDROAVIAO;
                    arena_inimigo[l+2][c  ] = HIDROAVIAO;
                }
        }
        else
        {
            if(arena_inimigo[l][c]== AGUA){
                arena_inimigo[l  ][c  ] = HIDROAVIAO;
                arena_inimigo[l-1][c+1] = HIDROAVIAO;
                arena_inimigo[l  ][c+2] = HIDROAVIAO;
            }
        }
}
int imprime_portaaviao ()
{
    int l, c, direcao;

        direcao = rand() % 2;
        l = rand() % TAMANHO;
        c = rand() % TAMANHO;

        if(direcao == 0)
        {
            for(i=l;i<l+4;i++)
            {
                if(arena_inimigo[i][c] == AGUA)
                {
                    arena_inimigo[linha][c] = PORTAAVIAO;
                }
            }
        }
        else
        {
            for(i=c;i<c+4;i++)
            {
                arena_inimigo[c][i] = PORTAAVIAO;
            }
        }
}
void imprimeTabuleiro ()
{
    int l, c;
    system("cls");
    printf("     meu mapa                       mapa inimigo    Digite < 11 > Para Sair\n");
    textcolor (YELLOW);
    for(l = 01; l < TAMANHO; l++)
    {
        for(c = 01; c < TAMANHO; c++)
        {
            printf(" %c", arena[l][c]);
        }
        printf("    |    ");
        for(c=1;c<11;c++)
            printf(" %c",arena_inimigo[l][c]);
        printf("\n");
    }
    textcolor (WHITE);
}
int controles ()
{
    int vida_inimiga;
    int l, c;

    jogador.disparos = 999;
    vida_inimiga = 36;

    do
    {
        //Exibe principais informações na tela
        printf("Almirante %s\n", jogador.nome);
        printf("Disparo Restantes: %i/46\n", jogador.disparos);
        printf("Vida Inimiga: %i/36\n\n", vida_inimiga);
        printf("Informe a linha: ");
        scanf("%i", &l);
        printf("Informe a coluna: ");
        scanf("%i", &c);
        printf("\n");
        if(l==11)return 0;

        if((l >= 1 && l < TAMANHO) && (c >= 1 && c < TAMANHO)/* && (arena_inimigo[l][c] == AGUA)*/)
        {
            switch(arena_inimigo[l][c])
            {
            case AGUA:
                arena[l][c] = ERRO;
                printf("Aqui é Água!...    Tecle\n");getch();
                system("cls");
                imprimeTabuleiro();
                jogador.disparos--;
                printf("Errou\n");
                break;

            case SUBMARINO:
                arena[l][c] = 'S';
                printf("Acertou No Submarino!...    Tecle\n");getch();
                imprimeTabuleiro();
                jogador.disparos--;
                vida_inimiga--;
                printf("Acertou!\n");
                break;

            case HIDROAVIAO:
                arena[l][c] = 'H';
                printf("Acertou No Hidroaviao!...     Tecle\n");getch();
                imprimeTabuleiro();
                jogador.disparos--;
                vida_inimiga--;
                printf("Acertou!\n");
                break;

            case DESTROYER:
                arena[l][c] = 'D';
                printf("Acertou No Destoryer!...     Tecle\n");getch();
                imprimeTabuleiro();
                jogador.disparos--;
                vida_inimiga--;
                printf("Acertou!\n");
                break;

            case PORTAAVIAO:
                arena[l][c] = 'P';
                printf("Acertou No Portaavião!...    Tecle\n");getch();
                imprimeTabuleiro();
                jogador.disparos--;
                vida_inimiga--;
                printf("Acertou\n");
                break;

            default:
                printf("ErrROU!\n");
            }
        }

        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("");
            getchar();
            exit(1);
        }

        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("");
            getchar();
            exit(1);
        }

    }
    while (vida_inimiga != 0 && jogador.disparos != 0);

}

int main ()
{
    setlocale(LC_ALL,"");
    srand((unsigned)time(NULL));
    prepara_tabuleiro();
    imprime_submarino();
    imprime_destroyer();
    imprime_hidroaviao();
    imprime_portaaviao();
    imprimeTabuleiro();
    controles();
    printf("Saiu Do Jogo ! . . .     Tecle");
    getch();
    return 0;
}

 

  • Obrigado 1
Postado

@devair1010 Poderia me explicar o que está acontecendo? Eu estou tentando fazer com que as embarcações que tenham mais unidades não possam sair dos extremos ou que sejam colocados além dos extremos, mas não está indo. O que pode tá acontecendo de errado? 

 

void imprime_portaaviao ()
{
    int l, c, direcao;

    do
    {
        direcao = rand() % 2;
        l = 1 + (rand() % TAMANHO);
        c = 1 + (rand() % TAMANHO);

        do
        {

        if(direcao == 0)
        {

            for(i = l; i < l + 4; i++)
            {
                arena_inimigo[i][c] = PORTAAVIAO;
                qt_barcos.porta_aviao--;
                total_de_barcos--;
            }
        }
        else
        {
            for(i = c; i < c + 4; i++)
            {
                arena_inimigo[l][i] = PORTAAVIAO;
                qt_barcos.porta_aviao--;
                total_de_barcos--;
            }
        }

        } while ((l >= 1 && l <= TAMANHO) && (c >= 1 && c <= TAMANHO));
    } while (qt_barcos.porta_aviao == 0);
}

Basicamente estou tentando impedir que a fila de "P's saiam do limite da linha e do limite da coluna, mas nem isso está adiantando. 

  • Curtir 1
Postado

Ai, consegui resolver o problema, entretanto: 

 

struct embarcacoes
{
    int submarino;
    int destroyer;
    int hidro_aviao;
    int porta_aviao;
};

typedef struct embarcacoes barcos;

barcos qt_barcos = {3, 3, 2, 2};
int total_de_barcos = 10;


struct almirante
{
    char nome[100];
    int placar;
    int disparos;
    struct embarcacoes;
};

struct almirante jogador;

void imprime_portaaviao ()
{
    int l, c, direcao;

    do
    {
        direcao = rand() % 2;
        l = 1 + (rand() % TAMANHO);
        c = 1 + (rand() % TAMANHO);

        if(direcao == 0)
        {
            if((l == TAMANHO || l >= TAMANHO - 4))
            {
                if(arena_inimigo[l][c] == AGUA && arena_inimigo[l - 1][c] == AGUA &&
                arena_inimigo[l - 2][c] == AGUA && arena_inimigo[l - 3][c] == AGUA
                && arena_inimigo[l - 4][c] == AGUA)
                for(i = l; i < l + 4; i++)
                {
                        arena_inimigo[i - 4][c] = PORTAAVIAO;
                }

            }
            else
            {
                if(arena_inimigo[l][c] == AGUA && arena_inimigo[l + 1][c] == AGUA &&
                arena_inimigo[l + 2][c] == AGUA && arena_inimigo[l + 3][c] == AGUA
                && arena_inimigo[l + 4][c] == AGUA)
                for(i = l; i < l + 4; i++)
                {
                        arena_inimigo[i][c] = PORTAAVIAO;
                }

            }

        }
        else
        {
            if(c == TAMANHO || c >= TAMANHO - 4)
            {
                if(arena_inimigo[l][i] == AGUA && arena_inimigo[l][c - 1] == AGUA &&
                arena_inimigo[l][c - 2] == AGUA && arena_inimigo[l][c - 3] == AGUA
                && arena_inimigo[l][c - 4] == AGUA)
                for(i = c; i < c + 4; i++)
                {
                        arena_inimigo[l][i - 4] = PORTAAVIAO;
                }

            }
            else
            {
                if(arena_inimigo[l][i] == AGUA && arena_inimigo[l][c + 1] == AGUA &&
                arena_inimigo[l][c + 2] == AGUA && arena_inimigo[l][c + 3] == AGUA
                && arena_inimigo[l][c + 4] == AGUA)
                for(i = c; i < c + 4; i++)
                {
                        arena_inimigo[l][i] = PORTAAVIAO;
                }

            }
        }
        qt_barcos.porta_aviao--;
    }
    while (qt_barcos.porta_aviao != 0);
}

Entretanto para evitar que as embarcações se colocassem em cima de outras, eu fiz essa condição longa, e ela às vezes não imprime todas as partes do porta avião. O que pode estar errado? 

  • Curtir 1
Postado

@Lucas Assunção de Sousa    mude o TAMANHO para 12 :

#define TAMANHO 12

e na função prepara_tabuleiro coloque para o loop começar de zero :

for(l = 0; l < TAMANHO; l++)
    for(c = 0; c < TAMANHO; c++)

coloque essas variáveis lá no inicio antes da main :

int l,p,q,c,m,n,direcao,colocado;

e também mais essa função :

int verifica(char v[12][12],int a,int b,int e,int d){
    int i,j,r=0;
    for(i=a;i>b;i--)
        for(j=e;j>d;j--)
            if(v[i][j]!=AGUA)
                r=1;
    return r;
}

e nessa função imprime_portaaviao coloque assim :

void imprime_portaaviao ()
{
    do{
        colocado=0;
        l=rand()% 10+1;/*aqui ele pode escolher de 1 ate 10 */
        c=rand()% 10+1;
        direcao = rand() % 2;
        if(direcao==0){
            if(c<4)c=4;
            m=l+1;
            n=l-2;
            p=c+1;
            q=c-5;
            colocado=verifica(arena_inimigo,m,n,p,q);
            if(colocado==0){/* coloca na horizontal */
                arena_inimigo[l][c  ]=PORTAAVIAO;
                arena_inimigo[l][c-1]=PORTAAVIAO;
                arena_inimigo[l][c-2]=PORTAAVIAO;
                arena_inimigo[l][c-3]=PORTAAVIAO;
            }
        }
        else
        {
            if(l<4)l=4;
            m=l+1;
            n=l-5;
            p=c+1;
            q=c-2;
            colocado=verifica(arena_inimigo,m,n,p,q);
            if(colocado==0){/*  coloca na vertical */
                arena_inimigo[l  ][c]=PORTAAVIAO;
                arena_inimigo[l-1][c]=PORTAAVIAO;
                arena_inimigo[l-2][c]=PORTAAVIAO;
                arena_inimigo[l-3][c]=PORTAAVIAO;
            }
        }

    }while(colocado!=0);
}

 

  • Obrigado 1
Postado

@Lucas Assunção de Sousa       fiz algumas modificações no seu código,  e ele está funcionando ,    então deixei  mostrando o mapa dos barcos inimigos apenas para testar, mas depois de pronto deletar essa parte do código que imprime esse mapa inimigo, que está lá na função imprime_tabuleiro , e seu código ficou assim :

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <locale.h>
#include <windows.h>
#include <time.h>

#define AGUA '~'
#define ERRO 'X'
#define TAMANHO 12
#define SUBMARINO 'S'
#define DESTROYER 'D'
#define HIDROAVIAO 'H'
#define PORTAAVIAO 'P'

char arena[TAMANHO][TAMANHO], arena_inimigo[TAMANHO][TAMANHO];
int linha, coluna,i,j;
int l,p,q,c,m,n,direcao,colocado;

typedef enum{BLACK,BLUE,GREEN,CYAN,RED,MAGENTA,BROWN,LIGHTGRAY,DARKGRAY,
LIGHTBLUE,LIGHTGREEN,LIGHTCYAN,LIGHTRED,LIGHTMAGENTA,YELLOW,WHITE} COLORS;

static int __BACKGROUND = BLACK;
static int __FOREGROUND = LIGHTGRAY;

void textcolor (int color){
    __FOREGROUND = color;
    SetConsoleTextAttribute (GetStdHandle (STD_OUTPUT_HANDLE),
    color + (__BACKGROUND << 4));
}

struct embarcacoes
{
    int submarino;
    int destroyer;
    int hidro_aviao;
    int porta_aviao;
};

typedef struct embarcacoes barcos;

barcos qt_barcos = {3, 3, 2, 2};


struct almirante
{
    char nome[100];
    int placar;
    int disparos;
    struct embarcacoes;
    };

struct almirante jogador;

void prepara_tabuleiro ()
{
    int l, c;

    for(l = 0; l < TAMANHO; l++)
    {
        for(c = 0; c < TAMANHO; c++)
        {
            arena_inimigo[l][c] = AGUA;
            arena        [l][c] = AGUA;
        }
    }
}
int verifica(char v[12][12],int a,int b,int e,int d){
    int i,j,r=0;
    for(i=a;i>b;i--)          /* verifica as linhas onde estara o barco*/
        for(j=e;j>d;j--)      /* verifica as colunasas onde estara o barco*/
            if(v[i][j]!=AGUA) /* se não for agua, não pode colocar o barco */
                r=1;          /* se for 1 nã pode colocar */
    return r;
}
void imprime_submarino ()
{
    do{
        l = rand() % 8+2;     /* coloca da segunda linha até a 9 linha*/
        c = rand() % 8+2;     /* coloca da segunda colunaa até a 9 coluna*/
        m=l+1;                /* calcula a area onde estara o barco */
        n=l-2;                /*calcula a area onde estara o barco */
        p=c+1;                /*calcula a area onde estara o barco */
        q=c-2;                /*calcula a area onde estara o barco */
        colocado=verifica(arena_inimigo,m,n,p,q);/*verifica se nessa area é agua */
    }while(colocado!=0);      /* enquanto não puder colocar o barco repete */
    arena_inimigo[l][c] = SUBMARINO;
}
void imprime_destroyer ()
{
    do{
        direcao = rand() % 2;
        l = rand() % 8+2;
        c = rand() % 8+2;
        if(direcao==0){        /* colocar na horizontal */
            m=l+1;             /*calcula a area onde estara o barco */
            n=l-2;             /*calcula a area onde estara o barco */
            if(c<3)c=3;        /*calcula a area onde estara o barco */
            p=c+1;             /*calcula a area onde estara o barco */
            q=c-3;             /*calcula a area onde estara o barco */
            colocado=verifica(arena_inimigo,m,n,p,q);
            if(colocado==0){   /* coloca na horizontal */
                arena_inimigo[l][c  ]=DESTROYER;
                arena_inimigo[l][c-1]=DESTROYER;
            }
        }
        else{
            if(l<3)l=3;
            m=l+1;             /*calcula a area onde estara o barco */
            n=l-3;             /*calcula a area onde estara o barco */
            p=c+1;             /*calcula a area onde estara o barco */
            q=c-2;             /*calcula a area onde estara o barco */
            colocado=verifica(arena_inimigo,m,n,p,q);
            if(colocado==0){   /*coloca na vertical */
                arena_inimigo[l  ][c]=DESTROYER;
                arena_inimigo[l-1][c]=DESTROYER;
            }
        }
    }while(colocado != 0);
}
void imprime_hidroaviao ()
{
    do{
        colocado=0;
        direcao = rand() % 4;  /* pode ser em quatro direções */
        l = rand() % 8+2;
        c = rand() % 8+2;
        if(direcao==0){        /* colocar com a ponta para cima */
            if(l<3)l=3;        /*calcula a area onde estara o barco */
            m=l+1;             /*calcula a area onde estara o barco */
            n=l-2;             /*calcula a area onde estara o barco */
            if(c<4)c=4;        /*calcula a area onde estara o barco */
            p=c+1;             /*calcula a area onde estara o barco */
            q=c-4;             /*calcula a area onde estara o barco */
            colocado=verifica(arena_inimigo,m,n,p,q   );
            if(arena_inimigo[l-2][c  ]!=AGUA)colocado=1;
            if(arena_inimigo[l-2][c-1]!=AGUA)colocado=1;
            if(arena_inimigo[l-2][c-2]!=AGUA)colocado=1;
            if(colocado==0){
                arena_inimigo[l  ][c  ]=HIDROAVIAO;
                arena_inimigo[l  ][c-2]=HIDROAVIAO;
                arena_inimigo[l-1][c-1]=HIDROAVIAO;
            }
        }
        else{
            if(direcao==1){    /* colocar com a ponta para direita */
                if(l<4)l=4;    /*calcula a area onde estara o barco */
                m=l+1;n=l-4;   /*calcula a area onde estara o barco */
                if(c>8)c=8;    /*calcula a area onde estara o barco */
                p=c+2;q=c-2;   /*calcula a area onde estara o barco */
                colocado=verifica(arena_inimigo,m,n,p,q);
                if(arena_inimigo[l  ][c+2]!=AGUA)colocado=1;
                if(arena_inimigo[l-1][c+2]!=AGUA)colocado=1;
                if(arena_inimigo[l-2][c+2]!=AGUA)colocado=1;
                if(colocado==0){
                    arena_inimigo[l][c]    =HIDROAVIAO;
                    arena_inimigo[l-2][c]  =HIDROAVIAO;
                    arena_inimigo[l-1][c+1]=HIDROAVIAO;
                }
            }
            else{
                if(direcao==2){   /* colocar com a ponta para baixo */
                    if(l>8)l=8;   /*calcula a area onde estara o barco */
                    m=l+1;        /*calcula a area onde estara o barco */
                    n=l-2;        /*calcula a area onde estara o barco */
                    if(c<4)c=4;   /*calcula a area onde estara o barco */
                    p=c+1;        /*calcula a area onde estara o barco */
                    q=c-4;        /*calcula a area onde estara o barco */
                    colocado=verifica(arena_inimigo,m,n,p,q);
                    if(arena_inimigo[l+2][c  ]!=AGUA);
                    if(arena_inimigo[l+2][c-1]!=AGUA);
                    if(arena_inimigo[l+2][c-2]!=AGUA);
                    if(colocado==0){
                        arena_inimigo[l][c    ]=HIDROAVIAO;
                        arena_inimigo[l][c-2  ]=HIDROAVIAO;
                        arena_inimigo[l+1][c-1]=HIDROAVIAO;
                    }
                }
                else{
                    if(direcao==3){ /* colocar com a ponta para esquerda */
                        if(l<4)l=4; /*calcula a area onde estara o barco */
                        m=l+1;      /*calcula a area onde estara o barco */
                        n=l-4;      /*calcula a area onde estara o barco */
                        if(c<3)c=3; /*calcula a area onde estara o barco */
                        p=c+1;q=c-2;/*calcula a area onde estara o barco */
                        colocado=verifica(arena_inimigo,m,n,p,q);
                        if(arena_inimigo[l  ][c-2]!=AGUA);
                        if(arena_inimigo[l-1][c-2]!=AGUA);
                        if(arena_inimigo[l-2][c-2]!=AGUA);
                        if(colocado==0){
                            arena_inimigo[l  ][c  ]=HIDROAVIAO;
                            arena_inimigo[l-2][c  ]=HIDROAVIAO;
                            arena_inimigo[l-1][c-1]=HIDROAVIAO;
                        }
                    }
                }
            }
        }
    }while(colocado!=0);
}
void imprime_portaaviao ()
{
    do{
        colocado=0;
        l=rand()% 8+2;
        c=rand()% 8+2;
        direcao = rand() % 2;/*printf("direcao= %d",direcao);getch();*/
        if(direcao==0){/* coloca na horizontal */
            if(c<5)c=5;
            m=l+1;
            n=l-2;
            p=c+1;
            q=c-5;
            colocado=verifica(arena_inimigo,m,n,p,q);
            if(colocado==0){
                arena_inimigo[l][c  ]=PORTAAVIAO;
                arena_inimigo[l][c-1]=PORTAAVIAO;
                arena_inimigo[l][c-2]=PORTAAVIAO;
                arena_inimigo[l][c-3]=PORTAAVIAO;
            }
        }
        else
        {       /* coloca na vertical */
            if(l<5)l=5;
            m=l+1;
            n=l-5;
            p=c+1;
            q=c-2;
            colocado=verifica(arena_inimigo,m,n,p,q);
            if(colocado==0){/*  coloca na vertical */
                arena_inimigo[l  ][c]=PORTAAVIAO;
                arena_inimigo[l-1][c]=PORTAAVIAO;
                arena_inimigo[l-2][c]=PORTAAVIAO;
                arena_inimigo[l-3][c]=PORTAAVIAO;
            }
        }

    }while(colocado!=0);
}
void imprimeTabuleiro ()
{
    int l, c;
    system("cls");
    textcolor(WHITE);
    printf("         meu mapa                      mapa inimigo\n");
    for(l = 1; l < 11; l++)
    {
        if(l<10)printf(" %d -%c",l,16);
        else printf("%d -%c",l,16);
        for(c = 1; c < 11; c++)
        {
            if(arena[l][c]==AGUA)textcolor(YELLOW            );
            if(arena[l][c]==SUBMARINO)textcolor(LIGHTGREEN   );
            if(arena[l][c]==DESTROYER)textcolor(LIGHTRED     );
            if(arena[l][c]==PORTAAVIAO)textcolor(LIGHTMAGENTA);
            if(arena[l][c]==HIDROAVIAO)textcolor(LIGHTCYAN   );
            if(arena[l][c]==ERRO)textcolor(LIGHTGREEN        );
            printf(" %c",arena[l][c]);
        }
        printf("    |    ");/* essa parte aqui só para testar, depois de pronto deletar */
        for(c=1;c<11;c++){
            if(arena_inimigo[l][c]==AGUA)textcolor(YELLOW            );
            if(arena_inimigo[l][c]==SUBMARINO)textcolor(LIGHTGREEN   );
            if(arena_inimigo[l][c]==DESTROYER)textcolor(LIGHTRED     );
            if(arena_inimigo[l][c]==PORTAAVIAO)textcolor(LIGHTMAGENTA);
            if(arena_inimigo[l][c]==HIDROAVIAO)textcolor(LIGHTCYAN   );
            printf(" %c",arena_inimigo[l][c]);
        }
        textcolor(WHITE);
        if(l==5)printf("  Digite < 11 > Para Sair");
        printf("\n");
    }
    printf("      %c %c %c %c %c %c %c %c %c %c\n      1 2 3 4 5 6 7 8 9 10\n\n",
                  24,24,24,24,24,24,24,24,24,24);
}
void som(int f){
    Beep(f,150);
}
int controles ()
{
    int vida_inimiga=10;
    int l, c;
    jogador.disparos = 999;
    do
    {
        imprimeTabuleiro();
        //Exibe principais informações na tela
        printf("Almirante --> %s\n", jogador.nome);
        printf("Disparo Restantes: %i/46\n", jogador.disparos);
        printf("Vida Inimiga: %i/36\n\n", vida_inimiga);
        printf("Informe a linha: ");
        fflush(stdin);
        scanf("%i", &l);
        if(l==11)return 0;
        printf("Informe a coluna: ");
        fflush(stdin);
        scanf("%i", &c);
        printf("\n");
        if(arena[l][c]!=AGUA && (l>0 && l<11) && (c > 0 && c < 11))
        {printf("Essa Posição Já Foi Jogada,   escolha outra.    Tecle\n\n");getch();}else
        if((l >= 1 && l < TAMANHO-1) && (c >= 1 && c < TAMANHO-1))
        {
            switch(arena_inimigo[l][c])
            {
            case AGUA:
                arena[l][c] = ERRO;
                som(500);
                printf("Aqui é Água!...    Tecle\n");getch();
                imprimeTabuleiro();
                jogador.disparos--;
                printf("Errou\n");
                break;

            case SUBMARINO:
                arena[l][c] = 'S';
                som(800);
                printf("Acertou No Submarino!...    Tecle\n");getch();
                imprimeTabuleiro();
                jogador.disparos--;
                vida_inimiga--;
                printf("Acertou!\n");
                break;

            case HIDROAVIAO:
                arena[l][c] = 'H';
                som(1100);
                printf("Acertou No Hidroaviao!...     Tecle\n");getch();
                imprimeTabuleiro();
                jogador.disparos--;
                vida_inimiga--;
                printf("Acertou!\n");
                break;

            case DESTROYER:
                arena[l][c] = 'D';
                som(2100);
                printf("Acertou No Destoryer!...     Tecle\n");getch();
                imprimeTabuleiro();
                jogador.disparos--;
                vida_inimiga--;
                printf("Acertou!\n");
                break;

            case PORTAAVIAO:
                arena[l][c] = 'P';
                som(2500);
                printf("Acertou No Portaavião!...    Tecle\n");getch();
                imprimeTabuleiro();
                jogador.disparos--;
                vida_inimiga--;
                printf("Acertou\n");
                break;

            default:
                printf("ErrROU!\n");
                som(300);
            }
        }
        else
        {
            printf("Posição Inválida ! . . .     Tecle");
            getch();
        }

        if(vida_inimiga == 0)
        {
            system("cls");
            puts("FIM DO JOGO");
            puts("VOCÊ VENCEU!");
            for(i=0;i<10;i++)
            {
                som(i*300);
            }
            puts("");
            jogador.placar++;
            printf("Jogador: %s\nPlacar: %i\n", jogador.nome, jogador.placar);
            puts("");
            getchar();
            return 0;
        }

        if(jogador.disparos == 0)
        {
            system("cls");
            puts("FIM DO JOGO");
            puts("VOCÊ PERDEU");
            printf("Jogador: %s\nPlacar: %i", jogador.nome, jogador.placar);
            puts("");
            getchar();
            return 0;
        }

    }while (vida_inimiga != 0 && jogador.disparos != 0);
    return 0;
}
int main ()
{
    char fim='n';
    setlocale(LC_ALL,"");
    srand((unsigned)time(NULL));
    printf("Digite Seu Nome ");
    gets(jogador.nome);
    do{
        printf("\n\n\n\n\n\n\n\t\tPosicionando Os Barcos ! . . .\n");
        Sleep(1000);
        prepara_tabuleiro();
        imprime_submarino();
        imprime_destroyer();
        imprime_hidroaviao();
        imprime_portaaviao();
        imprimeTabuleiro();
        controles();
        printf("\nQuer Jogar Novamente   S/N ");
        fflush(stdin);
        scanf("%c",&fim);
    }while(fim == 's');
    printf("Saiu Do Jogo ! . . .     Tecle");
    getch();
    return 0;
}

 

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...