Introdução à programação em C Os primeiros passos de um desenvolvedor [Dúvida]

7.1 MELHORANDO O JOGO DE ADIVINHAÇÃO

  1. Hoje o jogo escolhe um número entre 0 e 99. Deixe o usuário escolher esse limite. Você precisa capturar esses dois números dele, e usá-los na hora de calcular o número randômico.

  2. Temos ainda alguns números mágicos em nosso código. Use #define s para a quantidade de tentativas por níveis e quantidade de pontos inicial.

  3. Ao terminar uma partida, pergunte para o usuário se ele quer jogar novamente. Se ele digitar “1”, significa que quer, então você deverá começar o jogo de novo. Para isso, você precisará usar mais um loop.

Alguém pode revisar meu código pra resolução da questão 1 e 3, e me ajudar com a questão 2? Não ficou claro pra mim porque eu deveria usar constantes neste contexto do jogo de adivinhação, pois a quantidade de tentativas é uma variável que vai depender do nível definido pelo usuário, porque eu transformaria isso numa constante? A quantidade de pontos eu entendo, porque ela uma regra FIXA do jogo. De toda forma, não consegui implementar isso, se alguém puder me dar uma luz.

Agradeço desde já.

Segue o link do código:

Olá boa noite!!!

Utilizamos constantes quando um valor da variável não vai mudar, como exemplo desse exercício temos as quantidades de jogadas. Essas quantidades nunca vão mudar no meio do jogo, ela é uma regra baseada na dificuldade. Em relação ao seu código você não tá utilizando essas constantes que você criou, você pode usar elas no Swith no canto da variável de tentativas. E as constante de pontos em pontos rsrs. Espero que eu tenha te ajudado, qualquer coisa tô por aqui!!!

Como o livro é introdutório, não sei até que ponto você chegou na linguagem (se já conhece recursos como funções, ponteiros, etc), mas algumas coisas que eu mudaria:

  • Não precisa declarar todas as variáveis no início do programa. Você pode declará-las mais perto de onde elas serão usadas. Isso deixa - na minha opinião - o código um pouco mais claro, pois não precisa ficar “indo e voltando” no editor para ver onde a variável é usada, além de em muitos casos limitar bem o escopo dela (em programas maiores isso pode evitar alguns erros)
  • separe cada parte em uma função separada, assim o loop principal fica bem mais simples e fácil de entender
  • no if (resposta == 2) você usou break, o que já interrompe o while, então setar a variável de controle se torna desnecessário (na verdade a própria variável pode ser dispensada)
  • srand só precisa ser chamada uma vez, no início (não precisa chamar toda vez dentro do loop)

Enfim, uma alternativa seria:

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

#define PONTUACAO_INICIAL 1000

void cabecalho() {
    // imprimindo cabecalho bonito do jogo
    printf("\n\n");
    printf("          P  /_\\  P                              \n");
    printf("         /_\\_|_|_/_\\                            \n");
    printf("     n_n | ||. .|| | n_n         Bem vindo ao     \n");
    printf("     |_|_|nnnn nnnn|_|_|     Jogo de Adivinhação! \n");
    printf("    |\" \"  |  |_|  |\"  \" |                     \n");
    printf("    |_____| ' _ ' |_____|                         \n");
    printf("          \\__|_|__/                              \n");
    printf("\n\n");
}

void ler_intervalo(int *intervaloInicial, int *intervaloFinal) {
    printf("Digite o nº de intervalo inicial que deseja jogar: \n");
    scanf("%d", intervaloInicial);
    printf("Digite o nº de intervalo final que deseja jogar: \n");
    scanf("%d", intervaloFinal);
    printf("O intervalo escolhido foi entre %d e %d. \n", *intervaloInicial, *intervaloFinal);
}

// retorna o total de tentativas
int ler_dificuldade() {
    // escolhendo o nivel de dificuldade
    printf("Qual o nível de dificuldade?\n");
    printf("(1) Fácil (2) Médio (3) Difícil\n\n");
    printf("Escolha: ");

    int nivel;
    scanf("%d", &nivel);
    switch(nivel) {
        case 1:
            return 20;
        case 2:
            return 15;
        default:
            return 6;
    }
}

// retorna 1 se acertou, zero se errou
int adivinhar(int totaldetentativas, int numerosecreto, double *pontos) {
    for (int i = 1; i <= totaldetentativas; i++) {
        printf("-> Tentativa %d de %d\n", i, totaldetentativas);
        int chute;
        do {
            printf("Chute um número: ");
            scanf("%d", &chute);
            // tratando chute de numero negativo
            if (chute < 0)
                printf("Você não pode chutar números negativos\n");
        } while(chute < 0);

        // verifica se acertou, foi maior ou menor
        if (chute == numerosecreto) {
            return 1;
        } else if (chute > numerosecreto) {
            printf("\nSeu chute foi maior do que o número secreto!\n\n");
        } else {
            printf("\nSeu chute foi menor do que o número secreto!\n\n");
        }

        // calcula a quantidade de pontos
        *pontos -= abs(chute - numerosecreto) / 2.0;
    }
    return 0;
}

void vitoria(double pontos) {
    printf("             OOOOOOOOOOO               \n");
    printf("         OOOOOOOOOOOOOOOOOOO           \n");
    printf("      OOOOOO  OOOOOOOOO  OOOOOO        \n");
    printf("    OOOOOO      OOOOO      OOOOOO      \n");
    printf("  OOOOOOOO  $   OOOOO  $   OOOOOOOO    \n");
    printf(" OOOOOOOOOO    OOOOOOO    OOOOOOOOOO   \n");
    printf("OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO  \n");
    printf("OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO  \n");
    printf("OOOO  OOOOOOOOOOOOOOOOOOOOOOOOO  OOOO  \n");
    printf(" OOOO  OOOOOOOOOOOOOOOOOOOOOOO  OOOO   \n");
    printf("  OOOO   OOOOOOOOOOOOOOOOOOOO  OOOO    \n");
    printf("    OOOOO   OOOOOOOOOOOOOOO   OOOO     \n");
    printf("      OOOOOO   OOOOOOOOO   OOOOOO      \n");
    printf("         OOOOOO         OOOOOO         \n");
    printf("             OOOOOOOOOOOO              \n");
    printf("\nParabéns! Você acertou!\n");
    printf("Você fez %.2f pontos. Até a próxima!\n\n", pontos);
}

void derrota() {
    printf("       \\|/ ____ \\|/    \n");
    printf("        @~/ ,. \\~@      \n");
    printf("       /_( \\__/ )_\\    \n");
    printf("          \\__U_/        \n");
    printf("\nVocê perdeu! Tente novamente!\n\n");
}

int main() {
    setlocale(LC_ALL, "Portuguese");
    srand(time(0));

    // definindo a quantidade de pontos inicial (use a constante)
    double pontos = PONTUACAO_INICIAL;

    // loop principal do jogo
    while(1) {
        cabecalho();

        int intervaloInicial;
        int intervaloFinal;
        ler_intervalo(&intervaloInicial, &intervaloFinal);

        int numerosecreto = intervaloInicial + (rand() % intervaloFinal);
        printf("O numero secreto é %d \n", numerosecreto);

        int totaldetentativas = ler_dificuldade();

        //imprimindo mensagem de vitoria ou derrota
        printf("\n");
        if (adivinhar(totaldetentativas, numerosecreto, &pontos)) {
            vitoria(pontos);
        } else {
            derrota();
        }

        // Deseja jogar novamente?
        printf("Deseja jogar novante? \n");
        printf("(1) Sim (2) Não\n");
        int resposta;
        scanf("%d", &resposta);
        if (resposta == 2) {
            break;
        }
    }

    return 0;
}

Veja aqui um exemplo online.