Solucionado (ver solução)
Solucionado
(ver solução)
8
respostas

Ajuda Código

Galera, alguém pode me ajudar a identificar o que tem de errado no meu código? Acontece que quando a variável tentativa muda de 5 para 6, a palavrasecreta automaticamente é exibida...

#include <stdio.h>
#include <string.h>
//*******************************************************************//
void abertura () {
    printf("*********************\n");
    printf("J.O.G.O D.E F.O.R.C.A\n");
    printf("*********************\n\n");
}
//*******************************************************************//
void chuta(char chutes[], int* tentativas) {
    char chute;
    printf("Qual letra? ");
    scanf(" %c", &chute);
    chutes[*tentativas] = chute;
    (*tentativas)++;
}
//*******************************************************************//
int jachutou(char letra, char chutes[]) {
    int achou=0;
    int j=0;
    for(j = 0; j < strlen(chutes); j++) {
        if(chutes[j] == letra) {
        achou = 1;
        break;
        }
    } 
    return achou;
}
//*******************************************************************//
void desenhaforca(char palavrasecreta[], char chutes[], int tentativas) {
    printf ("Você já deu %d chutes\n", tentativas);
    int i =0;
foc            if (jachutou(palavrasecreta[i], chutes)) {
                printf("%c ", palavrasecreta[i]);
            } 
            else {
                printf("_ ");
            }
        }
        printf("\n");
}
//*******************************************************************//
void escolhepalavra(char palavrasecreta[]) {

    sprintf(palavrasecreta, "MELANCIA"); //array de 8 posições
}
//*******************************************************************//        

int main() {

    char palavrasecreta[20];
    int acertou = 0;
    int enforcou = 0;
    char chutes[26]; //esse array armazena todos os chutes efetuados
    int tentativas = 0; //essa variável aramzena quantos chutes já foram efetuados

    abertura();

    escolhepalavra(palavrasecreta);

    do {

        desenhaforca (palavrasecreta, chutes, tentativas);    

        chuta(chutes,&tentativas);     //ao passar chutes (sem especificar a posição), o programa entende que está se passando o endereço da posição [0]
                                    //ou seja, o endereço da primeira posição do array.

    } while (!acertou && !enforcou);
}
//*******************************************************************//
8 respostas

Matheus, pode compartilhar o trecho de código que está faltando? Parece ter um erro no método desenhaforca.

Quando o fizer, utilize a formatação adequada pra facilitar a visualização! Clique no botão inserir código e cole o código entre as aspas que aparecem.

Enquanto isso, se não estiver no trecho faltante de código, percebi que as variáveis acertou e enforcou nunca são alteradas, o que deve causar um loop infinito!

#include <stdio.h>
#include <string.h>
//*******************************************************************//
void abertura () {
    printf("*********************\n");
    printf("J.O.G.O D.E F.O.R.C.A\n");
    printf("*********************\n\n");
}
//*******************************************************************//
void chuta(char chutes[], int* tentativas) {
    char chute;
    printf("Qual letra? ");
    scanf(" %c", &chute);
    chutes[*tentativas] = chute;
    (*tentativas)++;
}
//*******************************************************************//
int jachutou(char letra, char chutes[]) {
    int achou=0;
    int j=0;
    for(j = 0; j < strlen(chutes); j++) {
        if(chutes[j] == letra) {
        achou = 1;
        break;
        }
    } 
    return achou;
}
//*******************************************************************//
void desenhaforca(char palavrasecreta[], char chutes[], int tentativas) {
    printf ("Você já deu %d chutes\n", tentativas);
    int i =0;
foc            if (jachutou(palavrasecreta[i], chutes)) {
                printf("%c ", palavrasecreta[i]);
            } 
            else {
                printf("_ ");
            }
        }
        printf("\n");
}
//*******************************************************************//
void escolhepalavra(char palavrasecreta[]) {

    sprintf(palavrasecreta, "MELANCIA"); //array de 8 posições
}
//*******************************************************************//        

int main() {

    char palavrasecreta[20];
    int acertou = 0;
    int enforcou = 0;
    char chutes[26]; //esse array armazena todos os chutes efetuados
    int tentativas = 0; //essa variável aramzena quantos chutes já foram efetuados

    abertura();

    escolhepalavra(palavrasecreta);

    do {

        desenhaforca (palavrasecreta, chutes, tentativas);    

        chuta(chutes,&tentativas);     //ao passar chutes (sem especificar a posição), o programa entende que está se passando o endereço da posição [0]
                                    //ou seja, o endereço da primeira posição do array.

    } while (!acertou && !enforcou);
}
//*******************************************************************//

Valeu pela ajuda Marco. Então, quanto à essas variáveis, elas de fato ainda n tiveram uso, pois acompanhei as videoaulas somente ate essa parte, com isso fica um loop infinito dentro do "do". Mas, n consegui identificar em que momento isso implica em preencher as palavras automaticamente, ja que para que as mesmas possam ser inseridas no vetor elas precisam ser digitadas.

Esse trecho aqui não faz sentido:

void desenhaforca(char palavrasecreta[], char chutes[], int tentativas) {
    printf ("Você já deu %d chutes\n", tentativas);
    int i =0;
foc            if (jachutou(palavrasecreta[i], chutes)) { // isso aqui tá estraaaanho demais
// ...
}

Parece que você ia fazer um for, mas sem querer substituiu o código por outra coisa. O que pode implicar que seu código não deve estar sendo compilado. Você pode estar usando uma versão antiga do código compilado sem saber.

Complete esse trecho do loop pra mim por favor? Rodei aqi e deu problemas diferentes do que este que você descreve.

Obrigado novamente pela ajuda Marco, segue o código corrigido... mas o erro, ainda persiste

#include <stdio.h>
#include <string.h>
//*******************************************************************//
void abertura () {
    printf("*********************\n");
    printf("J.O.G.O D.E F.O.R.C.A\n");
    printf("*********************\n\n");
}
//*******************************************************************//
void chuta(char chutes[], int* tentativas) {
    char chute;
    printf("Qual letra? ");
    scanf(" %c", &chute);
    chutes[*tentativas] = chute;
    (*tentativas)++;
}
//*******************************************************************//
int jachutou(char letra, char chutes[]) {
    int achou=0;
    int j=0;
    for(j = 0; j < strlen(chutes); j++) {
        if(chutes[j] == letra) {
        achou = 1;
        break;
        }
    } 
    return achou;
}
//*******************************************************************//
void desenhaforca(char palavrasecreta[], char chutes[], int tentativas) {
    printf ("Você já deu %d chutes\n", tentativas);
    int i =0;
    for (i=0; i < strlen(palavrasecreta);i++) {
            if (jachutou(palavrasecreta[i], chutes)) {
                printf("%c ", palavrasecreta[i]);
            } 
            else {
                printf("_ ");
            }
    }
    printf("\n");    
}

//*******************************************************************//
void escolhepalavra(char palavrasecreta[]) {

    sprintf(palavrasecreta, "MELANCIA"); //array de 8 posições
}
//*******************************************************************//        

int main() { 

    char palavrasecreta[20];
    int acertou = 0;
    int enforcou = 0;
    char chutes[26]; //esse array armazena todos os chutes efetuados
    int tentativas = 0; //essa variável aramzena quantos chutes já foram efetuados

    abertura();

    escolhepalavra(palavrasecreta);

    do {

        desenhaforca (palavrasecreta, chutes, tentativas);    

        chuta(chutes,&tentativas);     //ao passar chutes (sem especificar a posição), o programa entende que está se passando o endereço da posição [0]
                                    //ou seja, o endereço da primeira posição do array.
    }    while (!acertou && !enforcou); 

}
//*******************************************************************//

Quando eu compilo e rodo o seu código aqui, o erro é diferente do que vc descreveu: eu posso chutar quantas vezes quiser, e ao passar de um certo número de chutes ele começa a mostrar meus chutes ao invés da resposta. Vou olhar com mais cuidado em breve e explicar. Parece que tem algum vetor estourando.

Marco, é isso mesmo. No caso é o vetor chutes que está estourando. Agora não entendi o porquê

solução!

Uma suposição rápida: você aloca um vetor de chutes com 26 posições. Ao executar o chute 27, ele estoura o vetor e começa a ler das posições seguintes na memória (ah, ansi C, sempre fazendo a coisa mais esperada ^^). Depois de um certo número de chutes, o vetor invade o espaço de memória onde estaria o vetor da palavra secreta e mostra ela inteira. Logo depois ele começa a reproduzir os chutes.

Qual letra? Q
Você já deu 30 chutes
_ E L A _ _ I A 
Qual letra? Q
Você já deu 31 chutes
_ E L A _ _ I A 
Qual letra? Q
Você já deu 32 chutes
M E L A N C I A 
Qual letra? Q
Você já deu 33 chutes
Q E L A N C I A 
Qual letra? q
Você já deu 34 chutes
Q q L A N C I A 
Qual letra? m
Você já deu 35 chutes
Q q m A N C I A 
Qual letra?

A princípio você precisa limitar o seu programa (encerrar após 26 chutes) ou aumentar o tamanho dos seus vetores. ;)

Eu sugeriria também aceitar só letras (pode comparar se char chute >= 'a' && <= 'Z' ou seu código equivalente) e sempre utilizar as maiúsculas (se <= 'z', soma 26) após a leitura.

Marco, o problema estava no meu IDE. Utilizei outro e funcionou normalmente.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software