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