Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

[Projeto] Desafio - Jogo de Adivinhação: Minha solução

Não sei se é uma boa solução, mas foi bem divertido realizar este desafio, Luri me salvou em algumas dúvidas que eu tive, como por exemplo, em decrementar o contador dentro do else sem decrementar o contador dentro do if, muito bom esse IA.

A solução passou em todos os cenários que pensei para este desafio.

public class Adivinhacao {
    public static void main(String[] args) {

        int numeroAleatorio = new Random().nextInt(100);
        int contador;
        boolean acertou = false;

        System.out.println("Número aleatório: "+numeroAleatorio);

        for (contador = 1 ; contador <= 5 ; contador++) {

            System.out.println("Tente adivinhar o número entre 0 e 100: ");
            int numeroAdivinhado = new Scanner(System.in).nextInt();

            if (numeroAdivinhado == numeroAleatorio){
                System.out.printf("Parabéns, ganhou na loteria! Acertou em %d tentativas. ", contador);
                acertou = true;
                break;
            }else if (numeroAdivinhado > numeroAleatorio){
                System.out.printf("O número é maior que o número gerado. Você tem %d de tentativas. %n", 5 - contador);
            }else {
                System.out.printf("O número é menor que o número gerado, Você tem %d de tentativas. %n", 5 - contador);
            }
        }
        if (!acertou) {
            System.out.println("Você perdeu. O número era: " + numeroAleatorio);
        }
    }
}

Cenário 1: Dado que digitei o número adivinhado na primeira tentativa E acertei Então deverá ser exibido no console "Parabéns, ganhou na loteria! Acertou em 1 tentativas" E encerrará o programa. --- EXIBINDO CORRETAMENTE ---

Cenário 2: Dado que digitei o número adivinhado em 5 tentativas E errei em todas Então deverá ser exibido no console "Você perdeu. O número era: numeroAleatorio" E encerrará o programa. --- EXIBINDO CORRETAMENTE ---

Cenário 3: Dado que digitei o número adivinhado em 3 tentativas E acertei na terceira tentativa Então deverá ser exibido no console "Parabéns, ganhou na loteria! Acertou em 3 tentativas" E encerrará o programa. --- EXIBINDO CORRETAMENTE ---

Cenário 4: Dado que digitei o número adivinhado em 5 tentativas E acertei na quinta tentativa Então deverá ser exibido no console "Parabéns, ganhou na loteria! Acertou em 5 tentativas" E encerrará o programa. --- EXIBINDO CORRETAMENTE ---

Cenário 5: Dado que digitei o número adivinhado MAIOR que o número gerado aleatóriamente na primeira tentativa Então deverá ser exibido no console "O número é maior que o número gerado. Você tem 4 de tentativas." E o programa deverá exibir a mensagem "Tente adivinhar o número entre 0 e 100: " E esperar o próximo número a ser digitado no console. --- EXIBINDO CORRETAMENTE ---

Cenário 6: Dado que digitei o número adivinhado MENOR que o número gerado aleatóriamente na segunda tentativa Então deverá ser exibido no console "O número é menor que o número gerado. Você tem 3 de tentativas." E o programa deverá exibir a mensagem "Tente adivinhar o número entre 0 e 100: " E esperar o próximo número a ser digitado no console. --- EXIBINDO CORRETAMENTE ---

4 respostas
solução!

Olá, Cintia. Tudo bem?

Muito obrigado por compartilhar o seu código aqui com a gente. Parabéns pelo trabalho. Continue com essa dedicação.

Ótimo como você estruturou a lógica do jogo, especialmente no controle do número de tentativas. A forma como você verificou a condição de acerto e usou break para encerrar o loop é um ótimo uso do controle de fluxo.

Uma curiosidade interessante: você pode usar Scanner fora do loop para evitar criar uma nova instância a cada tentativa. Veja este ajuste:


public class Adivinhacao {
    public static void main(String[] args) {
        int numeroAleatorio = new Random().nextInt(100);
        int contador;
        boolean acertou = false;
        Scanner scanner = new Scanner(System.in); // Scanner criado uma única vez

        System.out.println("Número aleatório: " + numeroAleatorio);

        for (contador = 1; contador <= 5; contador++) {
            System.out.println("Tente adivinhar o número entre 0 e 100: ");
            int numeroAdivinhado = scanner.nextInt();

            if (numeroAdivinhado == numeroAleatorio) {
                System.out.printf("Parabéns, ganhou na loteria! Acertou em %d tentativas.%n", contador);
                acertou = true;
                break;
            } else if (numeroAdivinhado > numeroAleatorio) {
                System.out.printf("O número é maior que o número gerado. Você tem %d tentativas.%n", 5 - contador);
            } else {
                System.out.printf("O número é menor que o número gerado. Você tem %d tentativas.%n", 5 - contador);
            }
        }

        if (!acertou) {
            System.out.println("Você perdeu. O número era: " + numeroAleatorio);
        }

        scanner.close(); // Fechando o Scanner ao final
    }
}

Isso melhora a eficiência do código e evita desperdício de recursos.

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

Obrigadão Renan! Me ajudou muito a saber de mais informações sobre a instância e porque não seria bom ter uma instância dentro do loop, fui pesquisar a fundo para entender como funciona por baixo dos panos, obrigada pela instrução! <3

Eu tenho uma dúvida, é obrigatório sempre que utilizar o recurso Scanner usar o método close?

Olá, Cintia!

Sobre sua última dúvida, não é obrigatório fechar o Scanner em todos os casos, mas é recomendado para evitar vazamento de recursos.

Quando você usa scanner.close(), está liberando o recurso associado à entrada padrão (System.in). Isso é útil quando o Scanner é usado para ler de arquivos ou outras fontes externas.

No entanto, quando usamos Scanner com System.in, não há necessidade de fechá-lo no final do programa, porque fechar System.in pode impedir futuras leituras no console.

Se o seu código for curto e o Scanner só for usado dentro do main(), você pode deixá-lo aberto. Mas, se o Scanner for usado em métodos auxiliares ou dentro de estruturas mais complexas, fechar ajuda a evitar possíveis problemas de recursos.

Fico à disposição. Bons estudos!

Obrigada Renan pelos conhecimentos