1
resposta

Finalizando o jogo

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

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

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

void chuta() {
        char chute;
        scanf(" %c", &chute); 
       
        chutes[chutesdados] = chute;
        chutesdados++;
}

void desenhaforca() {

    int erros = chuteserrados();

    printf("  _______      \n");
    printf(" |/      |     \n");
    printf(" |      %c%c%c \n", (erros>=1?'(':' '), 
    (erros>=1?'_':' '), (erros>=1?')':' '));
    printf(" |      %c%c%c \n", (erros>=3?'\\': ' '), (erros>=2? '|': ' '), (erros>=3? '/': ' '));
    printf(" |       %c    \n", (erros>=2? '|':' '));
    printf(" |      %c %c  \n", (erros>=4? '/':' '), (erros>=4? '\\': ' '));
    printf(" |             \n");
    printf("_|___          \n");
    printf("\n\n");

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

    int achou = jachutou(palavrasecreta[i]);

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

    printf("\n");
}

void adicionarpalavra() {
    char quer;

    printf("Você deseja adicionar uma nova palavra no jogo ? (S/N)");
    scanf(" %c", &quer);

    if(quer == 'S') {

        char novapalavra[TAMANHO_PALAVRA];
        printf("Qual a nova palavra? ");
        scanf("%s", novapalavra);

        FILE* f;

        f = fopen("palavras.txt", "r+");
        if(f == 0) {
        printf("Desculpe, banco de dados não disponível\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("Desculpe, banco de dados não disponível\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 acertou() {
    for(int i = 0; i < strlen(palavrasecreta); i++) {
        if(!jachutou(palavrasecreta[i])) { 
            return 0;
        }
    }
    return 1;
}

int chuteserrados() {
    int erros = 0;

    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;
}

int enforcou() {
    return chuteserrados() >= 5;
}

int jachutou(char letra) {

    int achou = 0; 

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

int main() {

    escolhepalavra();
    abertura();

    do {

        desenhaforca();
        chuta();

    } while (!acertou() && !enforcou()); 
    
    if(acertou()) {
        printf("\nParabéns, você ganhou!\n\n");

        printf("       ___________      \n");
        printf("      '._==_==_=_.'     \n");
        printf("      .-\\:      /-.    \n");
        printf("     | (|:.     |) |    \n");
        printf("      '-|:.     |-'     \n");
        printf("        \\::.    /      \n");
        printf("         '::. .'        \n");
        printf("           ) (          \n");
        printf("         _.' '._        \n");
        printf("        '-------'       \n\n");

    } else {
        printf("\nPuxa, você foi enforcado!\n");
        printf("A palavra era **%s**\n\n", palavrasecreta);

        printf("    _______________         \n");
        printf("   /               \\       \n"); 
        printf("  /                 \\      \n");
        printf("//                   \\/\\  \n");
        printf("\\|   XXXX     XXXX   | /   \n");
        printf(" |   XXXX     XXXX   |/     \n");
        printf(" |   XXX       XXX   |      \n");
        printf(" |                   |      \n");
        printf(" \\__      XXX      __/     \n");
        printf("   |\\     XXX     /|       \n");
        printf("   | |           | |        \n");
        printf("   | I I I I I I I |        \n");
        printf("   |  I I I I I I  |        \n");
        printf("   \\_             _/       \n");
        printf("     \\_         _/         \n");
        printf("       \\_______/           \n");

    }
}
1 resposta

Oi, Guilherme! Como vai?
Agradeço por compartilhar seu código com a comunidade Alura.

Com base no que você explicou, gostei da separação em funções (abertura, desenhaforca, chuta) e do controle de arquivo com fseek (SEEK_SET / SEEK_END) para atualizar o contador. Ponto de atenção: na mensagem de derrota você usa printf("A palavra era **%s**\n\n", palavrasecreta); — esses ** vão aparecer no terminal; ajuste para printf("A palavra era %s\n\n", palavrasecreta); se a ênfase for só para o fórum.

Uma dica interessante para o futuro é normalizar a letra digitada e ignorar chutes repetidos usando ctype.h (tolower/isalpha). Veja este exemplo:


// inclui ctype.h para funcoes de caractere
#include <ctype.h>

int ja_chutou(char letra){
  for(int j = 0; j < chutesdados; j++){
    if(chutes[j] == letra) return 1;
  }
  return 0;
}

void chuta(){
  char chute;
  if(scanf(" %c", &chute) == 1){
    chute = (char) tolower((unsigned char) chute); // normaliza para minusculo
    if(!ja_chutou(chute) && isalpha((unsigned char) chute)){
      chutes[chutesdados++] = chute; // registra apenas letra nova
    } else {
      printf("Digite uma letra nova (a-z).\n");
    }
  }
}

O que faz: converte a entrada para minusculo, verifica se e letra e impede repeticao, deixando o jogo mais justo.

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!