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

[Dúvida] Desafio do Jogo de Adivinhação | Dúvida quanto a um looping

Oi!

Estou fazendo o desafio do Jogo de Adivinhação e estou com uma dúvida que a Luri não conseguiu me ajudar muito.

A dúvida é: como faço para que enquanto o usuário não digite "ok" ele permaneça no looping, mas quando ele digite "ok" ele possa continuar a aplicação?

Já tentei usar o "Do While", "If/Else", "Switch Case" e por enquanto nada.

O resto do código está funcionando muito bem, apenas essa parte que está me incomodando.

Segue o programa no GitHub pois o número de caracteres ultrapassa o limite da caixa de texto do fórum.

Deixei especificado no arquivo .java qual é o trecho que estou com problemas.

https://github.com/victoramato/JogoDaAdivinhacaoTeste.git

7 respostas

Olá!!! Boa tarde...

Dei uma olhada no teu código e acredito que o problema esteja em não atribuir o valor do leitor a variavel inputStringOk que está sendo validada no looping. Um outro ponto q tenho dúvida por não ser do mundo de Java é o break, pq ele não encerraria o processo e continuaria o jogo. Eu coloquei uma versão do código que imagino ser a correta abaixo, tenta com e sem break para ver qual o resultado obteve e manda aqui pra mim por favor!

Código Antes:

do {
                System.out.println("Digite 'ok' para prosseguir para o jogo.");
                leitor.nextLine();
                break;
            } while (!inputStringOk.equalsIgnoreCase("ok"));

Código depois

do {
                System.out.println("Digite 'ok' para prosseguir para o jogo.");
                String inputStringOk = leitor.nextLine();
            } while (!inputStringOk.equalsIgnoreCase("ok"));

Abraços!!!

Testa aí e me fala!!!

usando o do..while eu ainda removeria a primeira pergunta q faz antes e o if... e manteria apenas o do..while antes do código. pq imagino que possa perguntar mais de uma ou nem passar para o else depois do while vou colocar abaixo:

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

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

        /* Crie um programa que simula um jogo de adivinhação, que deve gerar um número aleatório entre 0 e 100 e pedir para que o usuário tente adivinhar o número,
         em até 5 tentativas. A cada tentativa, o programa deve informar se o número digitado pelo usuário é maior ou menor do que o número gerado.

        Dicas:

        Para gerar um número aleatório em Java: new Random().nextInt(100);
        Utilize o Scanner para obter os dados do usuário;
        Utilize uma variável para contar as tentativas;
        Utilize um loop para controlar as tentativas; / OK
        Utilize a instrução break; para interromper o loop. */


        // Começo do programa:
        System.out.println("""
                                
                Vamos jogar um jogo!
                                
                Nesse jogo você deve adivinhar o número aleatório sorteado pelo algoritmo que poderá ser qualquer um entre 0 e 100.
                                
                Para isso você terá 5 chances para acertar.
                                
                Se o número que você digitar for maior ou menor do que o sorteado, irei te notificar para que tenha uma ideia se está chegando perto ou não de acertar ;)
                """);


        // Scanner
        Scanner leitor = new Scanner(System.in);

        do {
            System.out.println("Digite 'ok' para prosseguir para o jogo.");
             String inputStringOk = leitor.nextLine();
             
             // Testar com e sem o break !!!!!
             
        } while (!inputStringOk.equalsIgnoreCase("ok"));


        // Variáveis para gerar o número aleatório e para guardar cada iteração do "for":
        int numAleatorio = new Random().nextInt(100);
        int contTent = 0;


        // Mensagem de início do jogo:
        System.out.println("\nÓtimo! Vamos começar o jogo!\nDigite um número:");


        // Estrutura de repetição "for" para dar looping enquanto o usuário não acertar o número. Caso acerte ou acabe as tentativas o programa se encerra.
        for (int contador = 4; contador >= 0; contador--) {

            int leitorNum = leitor.nextInt();
            contTent += contador;


            /* Estabelecimento dos limites 0 e 100.
            Caso o usuário digite um número menor que 0 ou maior que 100 ele ainda perde uma tentativa como penalização pois está ciente das regras do jogo. */
            if (leitorNum > 100) {
                System.out.println("O limite máximo é 100. Escreva um número menor ou igual a 100.");
            } else if (leitorNum < 0) {
                System.out.println("O limite mínimo é 0. Escreva um número maior ou igual a 0.");
            }


            /* Mensagens exibidas quando o usuário digita um número para
             que tenha ideia se está perto ou não de acertar, ou se acertou o número aleatório. */
            if (leitorNum < numAleatorio) {
                System.out.println("\nO número que você digitou é MENOR do que o número sorteado pelo algoritmo. Tente novamente!");
            } else if (leitorNum > numAleatorio) {
                System.out.println("\nO número que você digitou é MAIOR do que o número sorteado pelo algoritmo. Tente novamente!");
            } else {
                System.out.printf("""

                        Parabéns!! Você acertou!

                        O número sorteado pelo algoritmo é %d!

                        Sinta-se livre para jogar novamente apertando Ctrl + F5 :D
                        """,numAleatorio);
                break;
            }


            // Mensagem que exibe as tentativas restantes do usuário.
            System.out.println(contador + " tentativas restantes.");


            // Mensagem exibida caso o usuário não acerte o número aleatório e acabe suas chances.
            if (contador == 0) {
                System.out.printf("""

                        Infelizmente suas chances acabaram.

                        O número aleatório sorteado pelo algoritmo era %d

                        Reinicie o programa utilizando o comando 'Ctrl + F5' para tentar novamente! Boa sorte ;)!

                        """, numAleatorio);
            }
        }
    }

}

Fala, Rodrigo, beleza?

A respeito do Do / While

Cara testei aqui a possível solução de colocar a variável String inputStringOk dentro do Do / While, exatamente da mesma forma que você colocou aqui como resposta, e o Java acabou não executando o programa.

O While, tanto no Java como em outras tecnologias, só funciona se houver uma variável que possa se colocar em condição de boolean e for declarada fora do escopo da estrutura Do / While.

Do contrário, dá esse erro porque o While depende de uma variável independente da estrutura Do para poder fazer as iterações.

A respeito do break;

Agora, quando testo com o break; a estrutura finaliza o programa abruptamente sem continuar pro resto do código, independente se for escrito o esperado "ok" ou qualquer outra palavra.

Quando testo sem o break; o loop do Do / While acaba sendo infinito quando escrevo qualquer coisa que não seja o "ok" (que é a condição para sair da estrutura de repetição).

Agradeço a sua contribuição! Sinto que estou mais perto de chegar a uma possível solução para isso.

Abraço!

Olá Victor, bleza?

Acredito que o que você deseja fazer poderia ser resolvido em iniciar uma variável de controle do while diferente da sua variável inputStringOk e incluir já dentro do while a solicitação para o usuário digitar 'ok'.

Em seguida, você poderia colocar um if..else para verificar a informação que o usuário preencheu. Se for o 'ok', nesse caso true, ele segue com a aplicação e no final você altera o valor da varíavel de controle do while, se não, fica repetindo o loop até o usuário digitar 'ok' e entrar na aplicação de fato.

Fala, Gabriel!

Cara, você poderia colocar um bloco de código em que você aplique essa sugestão sua? Acabei não entendendo tão bem.

solução!

Opa, pessoal!

Voltei pra dizer que achei a solução!

Pensei um pouco a respeito da solução proposta pelo Rodrigo e a solução ficaria assim:

    // Scanner
    Scanner leitor = new Scanner(System.in);


    // Mensagem de confirmação de entendimento das regras e procedimentos:
    System.out.println("DIGITE 'OK' PARA CONTINUAR O PROGRAMA.");


    // Scanner do input do usuário:
    String inputStringOk = leitor.nextLine();


    // Condição para caso o usuário não digite "ok":
    if (!inputStringOk.equalsIgnoreCase("ok")) {
        do {
            System.out.println("Digite 'ok' para prosseguir para o jogo.");
            inputStringOk = leitor.nextLine(); // Atualiza inputStringOk dentro do loop
        } while (!inputStringOk.equalsIgnoreCase("ok"));
    }
    

Como eu disse na resposta para o Rodrigo, o Do / While somente aceita variáveis que estejam fora do escopo dessa estrutura. O negócio é que é necessário que a cada vez que seja digitado algo que não seja "ok", o valor dessa variável de leitura seja atualizado e satisfeito (posteriormente) para sair desse loop.

Coloquei então a variável dentro do Do / While e fora também para que ela seja atualizada conforme as respostas do usuário e também tirei o "else", pois o "If / Else" executa ou o "If" ou o "Else", não existindo assim possibilidade de sair do loop. Portanto, quando eu tinha o "If / Else", apenas o "if" (o loop) estava sendo executado quando não era digitado "ok". Já quando era digitado "ok" apenas o "else" (o resto do código) era executado. Deixando apenas o "If", o código tem uma restrição, que caso não seja satisfeita, continuará dentro do bloco "If". Quando essa restrição é satisfeita o resto do código é executado normalmente.

Agradeço a contribuição de vocês!

Um abraço!

Boa!!!

Sucesso aí nos estudos. Fico contente em saber que contribui um pouco, rssss

Abraços.