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!

3
respostas

[Projeto] Faça como eu fiz: jogo de adivinhação

import java.util.Random;
import java.util.Scanner;

public class Jogo {
public static void main(String[] args) {
// Importação das bibliotecas
Scanner leitor = new Scanner(System.in);
Scanner leitor2 = new Scanner(System.in);

    // Declaração de variáveis
    int aleatorio = new Random().nextInt(20);
    int tentativas_facil = 15;
    int tentativas_medio = 10;
    int tentativas_dificil = 5;


    // Definir while true
    boolean repetir = true;

    // Declaração de loop

    while (repetir) {

        System.out.println("--------------------------------");
        System.out.println("-------JOGO DE ADIVINHAÇÃO------");
        System.out.println("--------------------------------");
        System.out.println("1 - Nível Fácil");
        System.out.println("2 - Nível Médio");
        System.out.println("3 - Nível Difícil");

        System.out.println("Escolha a sua opção de nível:");
        int valor0 = leitor.nextInt();

        if (valor0 == 1) {

            while (tentativas_facil > 0) {

                System.out.println("Digite um número:");
                int valor1 = leitor.nextInt();

                if (valor1 == aleatorio) {
                    System.out.println("Parabéns! Você acertou!");
                    System.out.println("Você acertou em " + tentativas_facil + " tentativas!");
                    repetir = false;
                    break;
                } else if (valor1 < aleatorio) {
                    System.out.println("Muito baixo! Digite um número maior!");
                } else {
                    System.out.println("Muito alto! Digite um número menor!");
                }

                tentativas_facil--;

                System.out.println("Tentativas restantes: " + tentativas_facil);


            }
            if (tentativas_facil == 0) {
                System.out.println("Você perdeu suas tentativas!");
                repetir = false;
                break;
            }
        }

        if (valor0 == 2) {
            while (tentativas_medio > 0) {

                System.out.println("Digite um número:");
                int valor1 = leitor.nextInt();

                if (valor1 == aleatorio) {
                    System.out.println("Parabéns! Você acertou!");
                    System.out.println("Você acertou em " + tentativas_medio + " tentativas!");
                    repetir = false;
                    break;
                } else if (valor1 < aleatorio) {
                    System.out.println("Muito baixo! Digite um número maior!");
                } else {
                    System.out.println("Muito alto! Digite um número menor!");
                }

                tentativas_medio--;

                System.out.println("Tentativas restantes: " + tentativas_medio);
            }
            if (tentativas_medio == 0) {
                System.out.println("Você perdeu suas tentativas!");
                repetir = false;
                break;
            }
            if (valor0 == 3) {
                while (tentativas_dificil > 0) {

                    System.out.println("Digite um número:");
                    int valor1 = leitor.nextInt();

                    if (valor1 == aleatorio) {
                        System.out.println("Parabéns! Você acertou!");
                        System.out.println("Você acertou em " + tentativas_dificil + " tentativas!");
                        repetir = false;
                        break;
                    } else if (valor1 < aleatorio) {
                        System.out.println("Muito baixo! Digite um número maior!");
                    } else {
                        System.out.println("Muito alto! Digite um número menor!");
                    }

                    tentativas_dificil--;

                    System.out.println("Tentativas restantes: " + tentativas_dificil);
                }
                if (tentativas_dificil == 0) {
                    System.out.println("Você perdeu suas tentativas!");
                    repetir = false;
                    break;
                }

            }
        }
    }
    leitor.close();
}

}

3 respostas

Oi, Yago! Como vai?

Analisando o seu código, já dá para perceber que você compreendeu bem o uso do while para controlar as tentativas, além de ter estruturado corretamente a lógica com int, boolean repetir, Scanner e leitor.nextInt(). O uso de System.out.println para exibir as mensagens ao usuário, como "Digite um número" e a contagem de tentativas restantes, também está bem aplicado.

Existem dois pontos que merecem atenção. O primeiro é que o bloco do nível difícil ficou aninhado dentro do if (valor0 == 2), o que impede sua execução correta. Ele precisa estar no mesmo nível dos outros blocos, como um if. O segundo ponto é que você declarou dois objetos Scanner, o leitor e o leitor2, mas apenas um deles já é suficiente para leitura do teclado neste caso.

Uma dica valiosa para organizar menus de escolha é substituir os blocos if encadeados pelo switch, que deixa o código mais limpo e fácil de manter. Veja o exemplo abaixo:


int opcao = leitor.nextInt();

switch(opcao){
    case 1:
        System.out.println("Nivel facil");
        break;
    case 2:
        System.out.println("Nivel medio");
        break;
    case 3:
        System.out.println("Nivel dificil");
        break;
    default:
        System.out.println("Opcao invalida");
}

Nesse exemplo, o switch avalia a opção escolhida pelo jogador e executa o bloco correspondente, tornando a estrutura bem mais legível do que vários if e else encadeados. Essa é uma boa prática para projetos como esse jogo de adivinhação, em que o menu cresce com o tempo.

Você já pensou em adicionar uma opção para reiniciar o jogo após o jogador acertar ou perder todas as tentativas, sem precisar encerrar o programa?

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

Assim?

import java.util.Random;
import java.util.Scanner;

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

    Scanner leitor =  new Scanner(System.in);

    // Número aleatório de 1 - 30
    int aleatorio = new Random(30).nextInt();

    // Começar o looping
    boolean repetir = true;

    while (repetir) {

        System.out.println("--------------------------------");
        System.out.println("-------JOGO DE ADIVINHAÇÃO------");
        System.out.println("--------------------------------");
        System.out.println("1 - Nível Fácil");
        System.out.println("2 - Nível Médio");
        System.out.println("3 - Nível Difícil");

        System.out.println("Escolha a sua opção de nível:");
        int valor0 = leitor.nextInt();

        int tentativas = 0;

        switch (valor0) {

            case 1:
                tentativas = 15;
                System.out.println("Você escolheu o nível fácil");
                break;

            case 2:
                tentativas = 10;
                System.out.println("Você escolheu o nível médio");
                break;

            case 3:
                tentativas = 5;
                System.out.println("Você escolheu o nível díficil");
                break;

            default:
                System.out.println("Opção inválida");
                continue;
        }

        // Loop das tentativas

        while (tentativas > 0){

            System.out.println("Digite seu chute");
            int valor1 = leitor.nextInt();

            if (valor1 == aleatorio){
                System.out.println("Parabéns você ganhou!");
                repetir = false;
            }

            else if (valor1 > aleatorio) {
                System.out.println("Seu número é muito grande!");

            }

            else {
                System.out.println("Seu número é muito pequeno!");

            }

            tentativas--;
            System.out.println("Você ainda possui " + tentativas + " tentativas");

        }

        // Se perder

        if (tentativas == 0){
            System.out.println("Você perdeu em " +  tentativas + " tentativas");
            System.out.println("Você deseja continuar com o jogo? [S/N]");

            String opcao2 = leitor.next();
            if (opcao2.equals("S")){

                continue;
            }
            else if (opcao2.equals("N")){
                break;
            }

        }

        ;
    }

    leitor.close();
}

}

Oi, Yago!

Sobre sua última dúvida, agora a estrutura do seu código ficou bem mais organizada com o uso do switch e da variável única de tentativas. O principal ajuste que falta está na geração do número aleatório.

O problema está nesta linha:

int aleatorio = new Random(30).nextInt();

Neste ponto, o 30 passado no Random(30) não limita os números entre 1 e 30. Ele apenas define a seed do gerador aleatório. Além disso, o nextInt() sem parâmetro pode gerar números muito grandes, inclusive negativos.

Ajuste seu código assim:

int aleatorio = new Random().nextInt(30) + 1;

Com isso:

  • nextInt(30) gera números de 0 até 29
  • + 1 faz o intervalo ficar de 1 até 30

Outro ajuste importante: quando o jogador acerta, o loop continua executando porque faltou interromper o while(tentativas > 0).

Resolva fazendo o seguinte:

if (valor1 == aleatorio){
    System.out.println("Parabéns você ganhou!");
    repetir = false;
    break;
}

Sem o break, o jogo continua pedindo números mesmo após acertar.

Seu projeto já está com uma estrutura muito boa para quem está praticando lógica e controle de fluxo em Java.

Fico à disposição!