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.