Solicitação de algoritmo 8 – jogo da forca

O pedido de algoritmo foi feito pelo Victor Costa, que está fazendo um jogo de forca e que tem como objetivo acertar a palavra secreta do jogo. O código iniciado por ele faz pouca coisa, mas segue abaixo.

int main (void) {
    int erros = 0;
    char p_sec[100];
    printf("JOGADOR 1  \n");
    printf("Digite a palavra secreta:");
    scanf("%s", &p_sec);
    printf("A palavra secreta e': %s", p_sec);
    printf("\nA palavra tem %i caracteres", strlen(p_sec));

    // aqui eu queria esse tipo de confirmação que comentei

    return 0;
}

O código apenas faz a leitura da palavra que será a palavra que deverá ser acertada.

Na minha complementação do algoritmo, eu inicialmente substituí o uso do scanf() pelo fgets(), conforme pode ser visto na linha 6. O uso do fgets() acaba pegando o caractere de nova linha gerado ao pressionar a tecla enter, por isso minha contagem de quantidade de letras deve desconsiderar esse caractere, conforme faço na linha 7.

#include <stdio.h>

int main (void) {
    char p_sec[100], chute[100];
    printf("Digite a palavra secreta: ");
    fgets(p_sec, 100, stdin);
    printf("A palavra tem %i caracteres\n", strlen(p_sec)-1);

    printf("\nQual a palavra secreta: ");
    fgets(chute, 100, stdin);
    if (strcmp (p_sec, chute) == 0) {
        printf("ACERTOU!");
    } else {
        printf("ERROU!");
    }

    return 0;
}

O projeto do Victor ainda não está maduro, mas o melhor seria buscar essa palavra secreta de um arquivo de texto, sorteando uma palavra e apenas mostrando quantas letras ela tem. Mas vamos ignorar o fato de que o usuário é quem forneceu a palavra. Nesse sentido, meu algoritmo solicitou que o usuário digitasse uma palavra (linhas 9 e 10) e utilizou a função strcmp() para comprar essa nova palavra com a anterior. Se as duas palavras forem iguais, a função strcmp() retorna zero e isso indica a igualdade, conforme meu teste na linha 11.

Logicamente, para um jogo seria mais interessante ter um laço de repetição permitindo ao usuário chutar várias palavras.

Como o jogo assim está um pouco sem graça, complementei o código para permitir ao usuário alguns chutes de letras e a indicação se a letra está na palavra ou não. Essa complementação é feita a partir a inserção do bloco while visto no código abaixo. O while irá permitir ao usuário um certo número de chutes de letras da palavra. No meu critério, adotei que o usuário poderá errar o tamanho da string + 1 vezes. Ou seja, uma string com cinco letras, permitirá ao usuário errar 6 letras até precisar realizar o chute da palavra secreta.

O bloco while inicia solicitando a letra do usuário e lendo essa letra. Eu fiz a leitura da letra na linha 12 com o uso da função getchar(). Veja que na linha 13 tem outro getchar() e uso ele apenas para descartar o enter. Isso porque ao digitar uma letra e dar o enter, dois caracteres são lidos (a letra a o enter). Então meu getchar() da linha 13 é apenas para ler o enter e “descartar” ele.

O laço for na linha 15 é responsável por percorrer a palavra secreta e verificar se a letra digitada pelo usuário é encontrada na palavra secreta. Se a letra existir na palavra, então o usuário é avisado do acerto, caso contrário é dito que a letra não existe na palavra e é incrementado a quantidade de erros do usuário.

#include <stdio.h>

int main (void) {
    int erros = 0, i, acertou;
    char p_sec[100], letra, chute[100];
    printf("Digite a palavra secreta: ");
    fgets(p_sec, 100, stdin);
    printf("A palavra tem %i caracteres\n", strlen(p_sec)-1);

    while (erros < strlen(p_sec)) {
        printf("Digite uma letra: ");
        letra = getchar();
        getchar();
        acertou = 0;
        for(i=0; i<strlen(p_sec)-1;i++) {
            if (letra == p_sec[i]) {
                acertou = 1;
                break;
            }
        }

        if (acertou) {
            printf("Acertou uma letra!\n");
        } else {
            printf("Essa letra nao faz parte da palavra!\n");
            erros++;
        }
    }

    printf("\nQual a palavra secreta: ");
    fgets(chute, 100, stdin);
    if (strcmp (p_sec, chute) == 0) {
        printf("ACERTOU!");
    } else {
        printf("ERROU!");
    }

    return 0;
}

Após serem fornecidos letras erradas em quantidade suficiente, o laço while finaliza e pede ao usuário a palavra secreta, informando se o usuário errou ou acertou a palavra.

Fazer jogos é uma forma divertida e motivadora para exercitar a programação. Eu fiz uma dinâmica simples, mas que permite personalizações e extensões de formas para o funcionamento do jogo. Mesmo sem recursos gráficos, ainda seria possível mostrar quantas vezes as letras aparecem na palavra secreta, a posição dessas letras, desconsiderar letras que já foram digitadas antes, etc. Usando a criatividade muita coisa ainda pode ser feita nesse jogo.

Share

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.