1
resposta

[Dúvida] Continuando o jogo

Eu estava a refazer o jogo do zero, até que cheguei a uma parte que não estou a intender porque é que não funciona. Eu estava a fazer:

    for(int i = 0; i < strlen(palavrasecreta); i++){
        
        int achou = 0;
        
        for(int j = 0; j < tentativas; j++){
            if (chutes[j] == palavrasecreta[j]){
                achou = 1;
                break;
            }
        }
            

Porém, o programa, caso acertasse a letra, não me desbloqueava e eu não sei explicar o porquê.

Até que eu fui ver os videos novamente e reparei que o certo é:

for(int j = 0; j < tentativas; j++){
            if (chutes[j] == palavrasecreta[i]){

Na prática, se o j= 0 e o i=0, não estamos a falar em posições iguais? Se sim, porque é que não estava a funcionar? (Deixo o código completo abaixo)

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

void abertura(/*char x[26]*/){
    
    printf("*******************\n");
    printf("*  Jogo da Forca  *\n");
    printf("*******************\n");

    /*int i = 0;

    while(x[i] != '\0'){  serve para ver a palavra

        printf("%c", x[i]);
        i++;
    }
    while(x[i] != '\0'){
        printf("_ ");
        i++;
    }
    printf("\n");*/
}

void chuta(char chutes[26], int tentativas){

        char chute;
        scanf(" %c", &chute); //Temos de colocar um 'espaço' para o sistema não assumir o 'enter' como um char

        chutes[tentativas] = chute;
}

int main() {

    char palavrasecreta[26];
    sprintf(palavrasecreta, "MELANCIA");
    
    char chutes[26];
    int tentativas = 0;

    int acertou = 0;
    int enforcou = 0;

    abertura();

    do {
        for(int i = 0; i < strlen(palavrasecreta); i++){
            
            int achou = 0;
            
            for(int j = 0; j < tentativas; j++){
                if (chutes[j] == palavrasecreta[j]){
                    achou = 1;
                    break;
                }
            }
            if(achou){
                printf("%c ", palavrasecreta[i]);
            }
            else 
                printf("_ ");
        }
        printf("\n");

        chuta(chutes, tentativas);
        tentativas++;

    } while (!acertou && !enforcou);
}
1 resposta

No seu caso ai, voce compara 'chutes[j]' com 'palavrasecreta[j]' oque pode causar um comportamento inesperado.

Esse techo do codigo compara o caractere da posição 'j' dos chutes e igual aos caracteres na mesma posição. Mas para verificar se o chute está correto deve-se comparar ao chute atual '(chute[tentativas - 1])' com cada caractere da palavra secreta.

Caso tu quisesse comparar o último chute com todas as letras da palavra secreta, voce deve mudar segundo loop para percorrer a palavra secreta.

for(int i = 0; i < strlen(palavrasecreta); i++) {
    int achou = 0;
    for(int j = 0; j < tentativas; j++) {
        if (chutes[j] == palavrasecreta[i]) {
            achou = 1;
            break;
        }
    }
    if (achou) {
        printf("%c ", palavrasecreta[i]);
    } else {
        printf("_ ");
    }
}

Assim a comparação fica entre o último chute e e cada letra da palavra secreta.

Além do mais, seu loop ('Do-While') está infinito pois a condição (!acertou && !enforcou) nunca é atualizada dentro do loop. Você precisa redefinir a lógica para atualizar as variáveis 'acertou' e 'enforcou' de acordo com o progresso do jogo para garantir que o loop termine em algum momento.