Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

1
resposta

resolução Jogo de advinhação

public class Main {
public static void main(String[] args) {
// Jogo da adivinhação

    // Gerar número aleatório
    int numeroAleatorio = new Random().nextInt(100);
    // Scanner para obter resposta do usuário
    Scanner sc = new Scanner(System.in);
    // Variável para contar tentativas
    int tentativas = 1;
    Integer escolhaUsuario = 0;
    boolean menor = escolhaUsuario < numeroAleatorio;
    boolean igual = escolhaUsuario == numeroAleatorio;
    boolean maior = escolhaUsuario > numeroAleatorio;

   // Loop para controlar tentativas
    while (tentativas <= 5) {
        System.out.print("Tentativa: " + tentativas + "/5 - Escolha um número entre 0 e 100:");
        //aceita apenas número inteiros sem quebrar a aplicação
        try {

            escolhaUsuario = sc.nextInt();

            if (escolhaUsuario instanceof Integer) {
                // Verificação de número válido
                if (escolhaUsuario >= 0 && escolhaUsuario < 100) {
                    //switch case (maior, menor, igual ao numero aleatorio)
                    if (escolhaUsuario < numeroAleatorio) {
                        System.out.println("Tente um número maior");
                        tentativas++;
                    } else if (escolhaUsuario > numeroAleatorio) {
                        System.out.println("Tente um número menor");
                        tentativas++;
                    } else {
                        System.out.println("Parabéns, você acertou o número! De fato era o número: " + numeroAleatorio);
                        // interrompe o loop
                        break;
                    }
                } else {
                    System.out.println("Opção inválida! Tente novamente (esse erro custa suas tentativas)");
                    tentativas++;
                }
            }
        } catch (InputMismatchException e) {
            tentativas++;
            System.out.println("Digite apenas números inteiros");
            sc.nextLine();
        }
    }
        if (tentativas > 5) {
            System.out.println("Suas tentativas acabaram :( Inicie novamente");
        }
        sc.close();
    }
}
1 resposta

Oii, Luís!

Parabéns por concluir o desafio do Jogo de adivinhação. Você construiu uma dinâmica excelente para o seu programa, adicionando camadas extras de cuidado que enriqueceram bastante o fluxo do jogo.

O grande trunfo do seu código foi a preocupação com a experiência do usuário ao implementar a captura de erros com o bloco try/catch. Tratar a exceção InputMismatchException impede que o programa trave abruptamente caso alguém digite uma letra por engano. Limpar o buffer do teclado com sc.nextLine() dentro do catch e lembrar de encerrar o recurso com sc.close() ao final demonstram ótimas práticas de programação em Java.

Avaliando o encadeamento das variáveis, vale notar um detalhe sutil logo no início do script:

Integer escolhaUsuario = 0;
boolean menor = escolhaUsuario < numeroAleatorio;
boolean igual = escolhaUsuario == numeroAleatorio;
boolean maior = escolhaUsuario > numeroAleatorio;

A criação dessas três variáveis do tipo boolean (menor, igual, maior) no topo do arquivo acabou ficando sem uso no restante do programa. Como o seu laço while realiza testes dinâmicos a cada rodada usando diretamente as expressões textuais if (escolhaUsuario < numeroAleatorio), aquelas checagens feitas na linha 11 avaliaram apenas o cenário inicial (quando escolhaUsuario ainda valia zero). No desenvolvimento diário, remover essas declarações limpa o espaço de memória e deixa a leitura do script mais direta.

Outro ponto que você pode simplificar é a linha if (escolhaUsuario instanceof Integer). Como a variável foi declarada tipada estritamente como Integer e o método sc.nextInt() só consegue extrair números inteiros válidos, esse teste sempre retornará verdadeiro, tornando a verificação redundante.

Essa exploração de cenários mostra que você possui uma ótima base de algoritmos e está avançando firmemente nos conceitos de controle de fluxo e tratamento de dados.

Na sua visão, computar o erro de digitação do usuário como uma tentativa perdida torna o jogo mais desafiador ou você prefere dar uma chance extra sem descontar do contador nesses casos?

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