Ir ao conteúdo
  • Cadastre-se

C Batalha Naval erro de execução


Posts recomendados

Bom dia, 

estou desenvolvendo um jogo de Batalha Naval, quando executo o programa apenas uma vez o computador pede a linha e a coluna, em seguida fica mostrando várias mensagens de erro em seguida, alguém sabe no que deu errado? 

 

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

struct almirante //Perfil e dados dos jogadores
{
    char nome[100];
    int placar;
};

void batalha_naval ()
{
    char campo[14][14];

    int cont, sub_cont, hidro_cont, porta_cont, des_cont;
    int l, c;
    int vida = 14;
    struct almirante jogador;

    char inimigo[14][14] =
    {
        {0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 4},
        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 4},
        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 4},
        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
        {0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0},
        {4, 4, 4, 0, 0, 0, 2, 3, 2, 0, 0, 0, 0, 0},
        {0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0},
        {0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0},
        {0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
        {0, 0, 0, 0, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0},
        {0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2},
        {0, 3, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 2, 0},
        {0, 3, 3, 3, 3, 0, 2, 0, 2, 0, 0, 1, 0, 2}
    };

        for(l = 1; l < 14; l = l + 1)
        {
            for(c = 1; c < 14; c = c + 1)
            {
                campo[l][c] = '.';
                printf(" |%c|" , campo[l][c]);
            }
            printf("\n");
        }

        printf("Informe a linha: ");
        scanf("%i", &l);
        printf("Informe a coluna: ");
        scanf("%i", &c);
        printf("\n");

        while (vida != 0)
        {

           if(inimigo[l][c] == 0)
           {
               campo[l][c] == '*';
               puts("Errou");
           }

            if(inimigo[l][c] == 1)
            {
                campo[l][c] = 'S';
                puts("Submarino destruído");
                vida = vida - 1;
            }

            if(inimigo[l][c] == 2)
            {
                campo[l][c] = 'H';
                hidro_cont = hidro_cont + 1;
                if(hidro_cont == 3)
                {
                    puts("Hidro-Avião destruído");
                    hidro_cont = 0;
                    vida = vida - 1;
                }
            }

            if(inimigo[l][c] == 3)
            {
                campo[l][c] = 'P';
                porta_cont = porta_cont + 1;
                if(porta_cont == 4)
                {
                    puts("Porta-aviões destruído");
                    porta_cont = 0;
                    vida = vida - 1;
                }
            }

            if(inimigo[l][c] == 4)
            {
                campo[l][c] = 'D';
                des_cont = des_cont + 1;
                if(des_cont == 3)
                {
                    puts("Destroyers destruído");
                    des_cont = 0;
                    vida = vida - 1;
                }
            }
            jogador.placar = jogador.placar + 1;
            puts("Fim de jogo");
            printf("Placar: %i", jogador.placar);
        }



}

main ()
{
    setlocale(LC_ALL,"portuguese");

    batalha_naval ();
    getch();
    return 0;
}

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Bom dia, ele pede uma vez, pois a requisição não é feita dentro do while:

 

while (vida != 0) {
    printf("Informe a linha: ");
    scanf("%i", &l);
    printf("Informe a coluna: ");
    scanf("%i", &c);
    printf("\n");
    ...
}

 

Você trocou '=' por '==', aqui:

//errado
campo[l][c] == '*';
//certo
campo[l][c] = '*';

 

  • Curtir 1
  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

Olá novamente, 

percebi um erro lógico no meu código, quando digito em uma mesma posição onde o setor está 

localizado, a vida é subtraída mesmo assim. Eu já tentei fazer isso. 

 

if(inimigo[l][c] == 1)
        {
            for(l = 0; l < 14; l = l + 1)
            {
                for(c = 0; c < 14; c = c + 1)
                {
                    if(l == l1 && c == c1)
                    {
                        campo[l][c] = 'S';
                        vida = vida - 1;

                    }
					if(campo[l][c] == 'S')
					{
						vida = vida - 0;
					}
                    printf(" \t%c" , campo[l][c]);
                }
                printf("\n");
            }
            puts("Submarino destruído");
        }

E mesmo assim a vida é subtraída. Tentei colocar ela em diferentes posições e mesmo assim não funciona, o que estou fazendo de errado?  

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Usei mais por formalidade mesmo, o que não entendo é porque a condição não está funcionando. Isso que, quando uso uma mesma coordenada que já foi descoberta, a vida ainda é subtraída. Pensei que usando essa condição resolveria o problema, mas não adiantou.  

Link para o comentário
Compartilhar em outros sites

Oh,  perdão!

 

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

struct almirante //Perfil e dados dos jogadores
{
    char nome[100];
    int placar;
};

void batalha_naval () //Jogo
{

    char campo[14][14]; //Campo
    int hidro_cont, porta_cont, des_cont;
    int l, c;
    int c1 = 0, l1 = 0;
    int vida = 36;
    struct almirante jogador;

    jogador.placar = 0; //Placar
    hidro_cont = 0;
    porta_cont = 0;
    des_cont = 0;

    char inimigo[14][14] =
    {
        //Arena do jogo
        {0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 4},
        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 4},
        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 4},
        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
        {0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0},
        {4, 4, 4, 0, 0, 0, 2, 3, 2, 0, 0, 0, 0, 0},
        {0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0},
        {0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0},
        {0, 0, 0, 0, 1, 0, 0, 3, 0, 0, 0, 0, 0, 0},
        {0, 3, 0, 0, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0},
        {0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2},
        {0, 3, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 2, 0},
        {0, 3, 3, 3, 3, 3, 2, 0, 2, 0, 0, 1, 0, 2}
    };

    //Desenha a arena
    for(l = 0; l < 14; l = l + 1)
    {
        for(c = 0; c < 14; c = c + 1)
        {
            campo[l][c] = '~';
            printf(" \t%c" , campo[l][c]);
        }
        printf("\n");
    }

    //Condição para continuar jogando
    while (vida != 0)
    {
        printf("Vida: %i\n", vida);
        printf("Informe a linha: ");
        scanf("%i", &l);
        printf("Informe a coluna: ");
        scanf("%i", &c);
        printf("\n");
        c1 = c;
        l1 = l;

        if(inimigo[l][c] == 0)
        {

            for(l = 0; l < 14; l = l + 1)
            {
                for(c = 0; c < 14; c = c + 1)
                {
                    if(l == l1 && c == c1)
                    {
                        campo[l][c] = '*';
                    }
                    printf(" \t%c" , campo[l][c]);
                }
                printf("\n");
            }
            puts("Errou");
        }

        if(inimigo[l][c] == 1)
        {
            for(l = 0; l < 14; l = l + 1)
            {
                for(c = 0; c < 14; c = c + 1)
                {
                    if(l == l1 && c == c1)
                    {
                        campo[l][c] = 'S';
                        vida = vida - 1;
                    }
                    printf(" \t%c" , campo[l][c]);
                    
                    if(campo[l][c] == 'S')
                    {
                    	vida = vida - 0;
					}
                }
                printf("\n");
            }
            puts("Submarino destruído");
        }

        if(inimigo[l][c] == 2)
        {
            for(l = 0; l < 14; l = l + 1)
            {
                for(c = 0; c < 14; c = c + 1)
                {
                    if(l == l1 && c == c1)
                    {
                        campo[l][c] = 'H';
                        vida = vida - 1;
                        hidro_cont = hidro_cont + 1;
                        if(hidro_cont == 3)
                        {
                            hidro_cont = 0;

                        }
                    }
                    printf(" \t%c", campo[l][c]);
                }
                printf("\n");
            }
            puts("Hidro-Avião destruído");

        }

        if(inimigo[l][c] == 3)
        {
            for(l = 0; l < 14; l = l + 1)
            {
                for (c = 0; c < 14; c = c + 1)
                {
                    if(l == l1 && c == c1)
                    {
                        campo[l][c] = 'P';
                        vida = vida - 1;
                        porta_cont = porta_cont + 1;
                        if(porta_cont == 4)
                        {

                            porta_cont = 0;
                        }

                    }

                    printf(" \t%c", campo[l][c]);
                }
                printf("\n");
            }
            puts("Porta-aviões destruído");

        }


        if(inimigo[l][c] == 4)
        {
            for(l = 0; l < 14; l = l + 1)
            {
                for(c = 0; c < 14; c = c + 1)
                {
                    if(l == l1 && c == c1)
                    {
                        campo[l][c] = 'D';

                        vida = vida - 1;
                        if(l == c)
                        {
                            des_cont = des_cont + 1;
                            if(des_cont == 3)
                            {

                            }
                        }

                    }
                    printf(" \t%c", campo[l][c]);
                }
                printf("\n");
            }
            puts("Destroyer destruído");

        }
        if(vida == 0)
        {
            system("cls");
            puts("FIM DO JOGO");
            jogador.placar = jogador.placar + 1;
            printf("Placar: %i", jogador.placar);
        }

    }
}

main ()
{
    setlocale(LC_ALL,"portuguese");

    batalha_naval ();
    getch();
    return 0;
}

Eu só coloquei a condição quando um submarino é atingido, para testar se funcionasse. Todas os números "1" na matriz representam um submarino. Quando eu digito 0 e 1 (coordenadas) para atingir um submarino e digito novamente, a vida é extraída do mesmo jeito. 

Link para o comentário
Compartilhar em outros sites

O problema é que você não está verificando se o local não foi usando, você apenas verifica se existe o submarino e depois diminui a vida. Antes de mudar o campo, verifique se ele já não foi mudado com if, fiz uma versão com switch para simplificar esses for:

 

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

struct almirante //Perfil e dados dos jogadores
{
    char nome[100];
    int placar;
};

void batalha_naval () //Jogo
{

    char campo[14][14]; //Campo
    int hidro_cont, porta_cont, des_cont;
    int l, c;
    int c1 = 0, l1 = 0;
    int vida = 36;
    struct almirante jogador;

    jogador.placar = 0; //Placar
    hidro_cont = 0;
    porta_cont = 0;
    des_cont = 0;

    char inimigo[14][14] =
    {
        //Arena do jogo
        {0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 4},
        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 4},
        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 4},
        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
        {0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0},
        {4, 4, 4, 0, 0, 0, 2, 3, 2, 0, 0, 0, 0, 0},
        {0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0},
        {0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0},
        {0, 0, 0, 0, 1, 0, 0, 3, 0, 0, 0, 0, 0, 0},
        {0, 3, 0, 0, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0},
        {0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2},
        {0, 3, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 2, 0},
        {0, 3, 3, 3, 3, 3, 2, 0, 2, 0, 0, 1, 0, 2}
    };

    //Desenha a arena
    for(l = 0; l < 14; l = l + 1)
    {
        for(c = 0; c < 14; c = c + 1)
        {
            campo[l][c] = '~';
            printf(" \t%c" , campo[l][c]);
        }
        printf("\n");
    }

    //Condição para continuar jogando
    while (vida != 0)
    {

	//Tentativa
    printf("Vida: %i\n", vida);
    printf("Informe a linha: ");
    scanf("%i", &l);
    printf("Informe a coluna: ");
    scanf("%i", &c);
    printf("\n");

 	if(l < 14 && l >=0 &&
	   c < 14 && c >=0 && campo[l][c] == '~'){
		switch(inimigo[l][c]){
			case 0: campo[l][c] = '*'; 
				  printf("Vazio :S\n");
				  break;

			case 1: campo[l][c] = 'S'; 
				  vida--; 
			  	  printf("Submarino destruido!\n");
				  break;

			case 2: campo[l][c] = 'H'; 
				  vida--; 
				  hidro_cont = (hidro_cont == 3 ? 0 : hidro_cont+1); 
				  printf("Hidro-Aviao destruido!\n");
				  break;

			case 3: campo[l][c] = 'P';
				    vida--;
				    porta_cont = (porta_cont == 4 ? 0 : porta_cont+1);
				    printf("Porta-avioes destruido!\n");
				    break;

			case 4: campo[l][c] = 'D';
                    vida--;
                    des_cont = (des_cont == 3 ? 0 : des_cont+1);
                    printf("Destroyer destruido!\n");
                    break;

			default:
			printf("ErrROU!\n");
		}
	}
    //desenha
    for(l = 0; l < 14; l = l + 1) {
       	for (c = 0; c < 14; c = c + 1){
        	printf(" \t%c", campo[l][c]);
        }
        printf("\n");
    }
        
   	if(vida == 0){
    	system("cls");
        puts("FIM DO JOGO");
        jogador.placar = jogador.placar + 1;
        printf("Placar: %i", jogador.placar);
    }
	}
}

int main ()
{
    setlocale(LC_ALL,"portuguese");

    batalha_naval ();
    system("pause");
    return 0;
}

 

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

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...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!