5
respostas

[Dúvida] Minha função ganhou não está funcionando

if(!jachutou(palavrasecreta[i])) {
            return 0;
        }

O parâmetro do meu if está com algum problema, ele diz o seguinte "too few arguments in function call". Mesmo copiando e colando o código feito durante as aulas, ele exibe este problema.

5 respostas

Olá Natan!

Poderia mandar o código fonte por gentileza? para que eu possa analisar o possível problema.

caso prefira, pode mandar um link do GitHub com o projeto ou mandar o código por aqui mesmo, no fórum.

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

char palavrasecreta[TAMANHO_PALAVRA];
char chutes[26];
int chutesdados = 0;

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

void chuta(char chutes[26], int *chutesdados)
{
    char chute;
    scanf(" %c", &chute);

    chutes[(*chutesdados)] = chute;
    (*chutesdados)++;
}

int jachutou(char chutes[26], int chutesdados, char letra)
{
    int achou = 0;

    for (int j = 0; j < chutesdados; j++)
    {
        if (chutes[j] == letra)
        {
            achou = 1;
            break;
        }
    }

    return achou;
}

void desenhaforca(char palavrasecreta[20], char chutes[26], int chutesdados)
{
    for (int i = 0; i < strlen(palavrasecreta); i++)
    {

        int achou = jachutou(palavrasecreta[i], chutes, chutesdados);

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

void adicionapalavra()
{
    char quer;
    printf("Você deseja adicionar uma nova letra no jogo? (S/N)");
    scanf(" %c", &quer);

    if (quer == 'S')
    {
        char novapalavra[20];
        printf("Qual a nova palavra? ");
        scanf("%s", novapalavra);

        FILE *f;
        f = fopen("palavras.TXT", "r");
        if (f == 0)
        {
            printf("Brother, foi mal, mas banco de dados indisponivel\n\n");
            exit(1);
        }

        int qtd;
        fscanf(f, "%d", &qtd);
        qtd++;

        fseek(f, 0, SEEK_SET);
        fprintf(f, "%d", qtd);

        fseek(f, 0, SEEK_END);
        fprintf(f, "\n%s", novapalavra);

        fclose(f);
    }
}

void escolhepalavra()
{
    FILE *f;
    f = fopen("palavras.TXT", "r");
    if (f == 0)
    {
        printf("Brother, foi mal, mas banco de dados indisponivel\n\n");
        exit(1);
    }

    int qtddepalavras;
    fscanf(f, "%d", &qtddepalavras);

    srand(time(0));
    int randomico = rand() % qtddepalavras;

    for (int i = 0; i <= randomico; i++)
    {
        fscanf(f, "%s", palavrasecreta);
    }
    fclose(f);
}

int enforcou()
{
    int erros;
    for (int i = 0; i < chutesdados; i++)
    {
        int existe = 0;

        for (int j = 0; j < strlen(palavrasecreta); j++)
        {
            if (chutes[i] == palavrasecreta[j])
            {
                existe = 1;
                break;
            }
            if (!existe)
                erros++;
        }
    }
    return erros >= 5;
}

int ganhou()
{
    for (int i = 0; i < strlen(palavrasecreta); i++)
    {
        if(!jachutou(palavrasecreta[i])) {
            return 0;
        }
    }
    return 1;
}

int main()
{

    escolhepalavra(palavrasecreta);
    abertura();

    do
    {
        desenhaforca(palavrasecreta, chutes, chutesdados);
        chuta(chutes, &chutesdados);

    } while (!ganhou() && !enforcou());
}

A função "jachutou" recebe três parâmetros, mas vc passou apenas 1, por conta disso gerou o erro de compilação. Note a assinatura da função:

int jachutou(char chutes[26], int chutesdados, char letra);

Essa função verfica se uma letra já está incluida nos "chutes".

As variáveis que vc utiliza em suas funções já estão declaradas em escopo global, então não haveria a necessidade de recebe-las por parâmetros. Criar uma variável local com o mesmo nome de variáveis globais pode gerar diversos problemas, principalmete de leitura do código quanto em comportamentos indefinidos durante a execução do programa.

O erro de compilação era este, mas aparentemente o código final ainda não está funcionado como o esperado. Caso vc queira mais ajuda no seu código eu estou por aq.

Há outras funções com o mesmo problema:

void escolhepalavra(); //não recebe parâmetros 

na função "main()":

int main()
{

    escolhepalavra(palavrasecreta); //está recebendo parâmetros
    
    // ...

}

e na função "desenhaforca()" há esse equivoco:

// assinatura da função:
//jachutou(char chutes[26], int chutesdados, char letra);

//como está na main() :
int achou = jachutou(palavrasecreta[i], chutes, chutesdados);

//ela deveria receber na ordem: um array de char, um inteiro e um char
//mas está recebendo um char, um array de char e um inteiro

//vale notar que a ordem dos parâmetros é importante, ou seja,
//há a necessidade de passa-los na mesma ordem que foi declarado na assinatura

Aqui está o código corrigido e funcional:

#include <stdio.h>
#include <string.h>
#include <time.h>
#include <stdlib.h>
#include <stdbool.h>


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



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



void chuta()
{
    char chute;
    scanf(" %c", &chute);

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



bool jachutou(char letra)
{
    int achou = false;

    for (int j = 0; j < chutesdados; j++)
    {
        if (chutes[j] == letra)
        {
            achou = true;
            break;
        }
    }

    return achou;
}



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

        int achou = jachutou(palavrasecreta[i]);

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



void adicionapalavra()
{
    char quer;
    printf("Você deseja adicionar uma nova letra no jogo? (S/N)");
    scanf(" %c", &quer);

    if (quer == 'S')
    {
        char novapalavra[20];
        printf("Qual a nova palavra? ");
        scanf("%s", novapalavra);

        FILE *f;
        f = fopen("palavras.txt", "r");
        if (f == 0)
        {
            printf("Brother, foi mal, mas banco de dados indisponivel\n\n");
            exit(1);
        }

        int qtd;
        fscanf(f, "%d", &qtd);
        qtd++;

        fseek(f, 0, SEEK_SET);
        fprintf(f, "%d", qtd);

        fseek(f, 0, SEEK_END);
        fprintf(f, "\n%s", novapalavra);

        fclose(f);
    }
}



void escolhepalavra()
{
    FILE *f;
    f = fopen("palavras.txt", "r");
    if (f == 0)
    {
        printf("Brother, foi mal, mas banco de dados indisponivel\n\n");
        exit(1);
    }

    int qtddepalavras;
    fscanf(f, "%d", &qtddepalavras);

    srand(time(0));
    int randomico = rand() % qtddepalavras;

    for (int i = 0; i <= randomico; i++)
    {
        fscanf(f, "%s", palavrasecreta);
    }
    fclose(f);
}



bool enforcou()
{
    int erros = 0;
    for (int i = 0; i < chutesdados; i++)
    {
        bool achou = false;
        for (int j = 0; j < strlen(palavrasecreta); j++)
        {
            if(chutes[i] == palavrasecreta[j])
            { achou = true; break; }
        }

        if(achou != true)
        { ++erros; }
    }

    if(erros >= 5)  { return true; }
    else            { return false; }
}



bool ganhou()
{
    for (int i = 0; i < strlen(palavrasecreta); i++)
    {
        if(!jachutou(palavrasecreta[i])) {
            return false;
        }
    }
    return true;
}



int main()
{

    escolhepalavra();
    abertura();

    do
    {
        desenhaforca();
        chuta();

    } while (!ganhou() && !enforcou());
}

Nota: Eu utilizei a biblioteca "stdbool.h", ela converte os valores de 1 e 0 para true e false, que ajuda bastante na leitura do código

Espero ter ajudado! se sim, não esqueça de marcar esse post como "solução" :)