Questão 4 - Função Principal do Jogo (4 pontos)
Complete as lacunas no código a seguir utilizando as funções desenvolvidas nas questões anteriores para implementar a lógica de controle do jogo. Para facilitar o processo de entrada dos dados, vamos considerar que as especificações de navios foram recebidas como parâmetros na linha de comando (argc e argv). A especificação de um navio em um argv [x] (para qualquer x > 1) contém um string com três campos, conforme descrito na Questão 1 e processado pela função posicionar_navios. Exemplo de entrada: jogo. exe "fragata 23 " "corveta 45 " "porta-aviao 67 ". Para essa entrada, argc é 4 e argv[1] é "fragata 23 ". Considere também que a função verifica_navios já está implementada e verifica quaisquer erros nos parâmetros recebidos. Finalmente, as posições dos tiros devem ser lidas do teclado a cada rodada e armazenadas nas variáveis linha e coluna já declaradas.
int main(void) {
        char tabuleiro[12][12];
    if(!verifica_navios(argv, argc)) {
            printf("Erro na especificação dos navios!\n");
            return 1;
    }
    // passando navios a partir do argv[1], pois o argv[0]
    // contém o nome do executavel:
    posicionar_navios(tabuleiro, &argv[1], argc-1);
    while (1) {
            int linha, coluna;
            printf("Digite as coordenadas do tiro (linha coluna): ");

                printf("Acertou!\n");
            } else {
                printf("Errou!\n");
            }
            if (
printf("Voce afundou todos os navios!\n");
printf("Fim de jogo.\n");
}
}
return 0;
\}

Passo 1

O enunciado nos dá o esqueleto de um main em C que já posiciona os navios e entra num laço infinito. A cada iteração, temos de:
  1. ler do teclado as coordenadas do tiro;
  2. chamar a função que processa esse tiro e retorna “acertou” (valor não nulo) ou “errou” (zero);
  3. exibir a mensagem apropriada;
  4. chamar a função que verifica se todos os navios foram afundados e, em caso afirmativo, encerrar o laço imprimindo as mensagens finais.

Passo 2

Para ler os valores de linha e coluna do teclado usamos scanf. Substituímos a primeira lacuna por:
scanf("%d %d", &linha, &coluna);

Passo 3

Para processar o tiro usamos a função (implementada na questão anterior) que vamos chamar de realizar_tiro. Ela recebe o tabuleiro e as coordenadas e retorna não–zero em caso de acerto. A condição do if fica:
realizar_tiro(tabuleiro, linha, coluna)

Passo 4

Para verificar se todos os navios foram afundados, usamos a função (também da questão anterior) que vamos chamar de todos_afundados. Ela recebe o tabuleiro e retorna não–zero quando não sobram navios. Na lacuna do if de fim de jogo, colocamos:
todos_afundados(tabuleiro)
e, dentro desse if, interrompemos o while com break;.

Resposta

int main(void) {
    char tabuleiro[12][12];
    if (!verifica_navios(argv, argc)) {
        printf("Erro na especificação dos navios!\n");
        return 1;
    }
    // posiciona navios a partir de argv[1]...argv[argc-1]
    posicionar_navios(tabuleiro, &argv[1], argc-1);
    while (1) {
        int linha, coluna;
        printf("Digite as coordenadas do tiro (linha coluna): ");
        scanf("%d %d", &linha, &coluna);
        if (realizar_tiro(tabuleiro, linha, coluna)) {
            printf("Acertou!\n");
        } else {
            printf("Errou!\n");
        }
        if (todos_afundados(tabuleiro)) {
            printf("Voce afundou todos os navios!\n");
            printf("Fim de jogo.\n");
            break;
        }
    }
    return 0;
}

Exercícios relacionados