2
respostas

os meus chutes nao estao sendo declarados

#include <stdio.h>
#include <string.h>

char palavrasecreta[20];
char chutes[26];
int tentativas = 0;

void abertura() {
printf("/****************/\n");
printf("/ Jogo de Forca /\n");
printf("/
***************/\n\n");
}

void chuta() {
char chute;
printf("Qual letra? ");
scanf(" %c", &chute);

chutes[tentativas] = chute;

}

// Essa função não foi discutida no último vídeo
int jachutou(char letra) {
int achou = 0;
for(int j = 0; j < tentativas; j++) {
if(chutes[j] == letra) {
achou = 1;
break;
}
}

return achou;

}

// Essa função não foi discutida no último vídeo
void desenhaforca() {

printf("Você já deu %d chutes\n", tentativas);

for(int i = 0; i < strlen(palavrasecreta); i++) {

    if(jachutou(palavrasecreta[i])) {
        printf("%c ", palavrasecreta[i]);
    } else {
        printf("_ ");
    }

}
printf("\n");

}

// Essa função não foi discutida no último vídeo
void escolhepalavra() {
sprintf(palavrasecreta, "MELANCIA");
}

int main() {

int acertou = 0;
int enforcou = 0;

abertura();
escolhepalavra();

do {

    desenhaforca();
    chuta();

    tentativas++;

} while (!acertou && !enforcou);

}

2 respostas

e eu até copiei o do professor mas nd mudou

Olá, João! Como vai?

Vamos resolver isso. O problema aqui é a ordem em que você salva o chute e incrementa as tentativas.

No seu código, em chuta() você faz:

  • chutes[tentativas] = chute;
    e só depois, no main, você faz:
  • tentativas++;

Funciona, mas fica fácil perder o controle (principalmente quando você começar a validar chute repetido, finalizar o jogo, etc.). Uma forma mais segura é incrementar a tentativa dentro da própria função chuta() e já bloquear chute repetido.

Veja este exemplo:


void chuta() {
    char chute;

    printf("Qual letra? ");
    scanf(" %c", &chute);

    // evita salvar letra repetida
    if (jachutou(chute)) {
        printf("Voce ja chutou a letra %c\n", chute);
        return;
    }

    chutes[tentativas] = chute;
    tentativas++;
}

E no main, você remove o tentativas++;:


do {
    desenhaforca();
    chuta();
} while (!acertou && !enforcou);

O que esse código faz (sem acentuação):

  • Le a letra digitada.
  • Verifica se essa letra ja foi chutada com jachutou.
  • Se for repetida, mostra uma mensagem e nao grava.
  • Se nao for repetida, salva em chutes[tentativas] e incrementa tentativas.

Se quiser conferir rapidamente se está salvando mesmo, você pode imprimir os chutes já registrados:


void listachutes() {
    printf("Chutes ate agora: ");
    for (int i = 0; i < tentativas; i++) {
        printf("%c ", chutes[i]);
    }
    printf("\n");
}

E chamar depois de chuta():


desenhaforca();
chuta();
listachutes();

Espero ter ajudado. Conte com o apoio do Fórum na sua jornada. Fico à disposição.

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.