Uma forma melhor de loop

introducao-c

#1

Tem uma forma melhor de voltar ao inicio do jogo, sem usar o “volta” e " goto" ?

// incluindo as bibliotecas
#include <stdio.h>
#include <locale.h> // biblioteca para definição de configurações locais
#include <stdlib.h>
#include <time.h>

// definindo as constantes
#define NUMERO_DE_TENTATIVAS 3
#define FACIL 20
#define MEDIO 15
#define DIFICIL 6

#define PONTOS_INICIAL 1000

int main() {
	volta:
	setlocale(LC_ALL, "Portuguese"); // Definição para uso de configurações em português; Usei por causa da acentuação no compilador
	//imprimi cabeçalho 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");
	
	// declarando variaveis que serão usadas mais a frente
	int chute;
	int acertou;
	int nivel;
	int totaldetentativas;
	int limite;
	int voltar;
	
	// difinindo a quantidade de pontos inicial
	double pontos = 1000;
	
	//gerando um número secreto aleatório
	printf("Escolha o limite: ");
	scanf("%d", &limite);
	
	srand(time(0));
	int numerosecreto = rand() % limite;
	
	// 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: ");
	
	scanf("%d", &nivel);
	
	switch(nivel) {
		case 1:
			totaldetentativas = 20;
			break;
		case 2:
			totaldetentativas = 15;
			break;
		default:
			totaldetentativas = 6;
			break;
	}
	
	// loop principal do jogo
	for(int i = 1; i <= totaldetentativas; i++) {
		
		printf("-> Tentativa %d de %d\n", i, totaldetentativas);
		
		printf("Chute um número: ");
		scanf("%d", &chute);
		
		// tratando chute de número negativo
		if(chute < 0) {
				printf("Você não pode chutar números negativos\n");
				i--;
				continue;
		}
		
		// verifica se acertou, foi maior ou menor
		acertou = chute == numerosecreto;
	
		if(acertou) {
				break;
		} 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
		double pontosperdidos = abs(chute - numerosecreto) / 2.0;
		pontos = pontos - pontosperdidos;
	}
	
	// imprrimindo mensagem de vitória ou derrota
	printf("\n");
	if(acertou) {
			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);
	} else {
		printf("       \\|/ ____ \\|/    \n");   
    	printf("        @~/ ,. \\~@      \n");   
    	printf("       /_( \\__/ )_\\    \n");   
		printf("          \\__U_/        \n");
		
			printf("\nVocê perdeu! Tente novamente!\n\n");
	}
	
	while(voltar = 1) {
	printf("Digite 1 para voltar.\n");
	printf("Você quer jogar novamente? ");
	scanf("%d", &voltar);
	
	goto volta;
	}
	
}