Ir ao conteúdo

Posts recomendados

Postado

Caros, boa noite. 

 

Estou aprendendo a desenvolver Java e num determinado exercício ocorreu um looping infinito e eu não entendi exatamente o motivo. 

 

@SuppressWarnings("empty-statement")
    public static void main(String[] args) {
        // TODO code application logic here
        
        Scanner teclado = new Scanner (System.in);
        
        int opc = 0;
        int compv = 0;
        int userv = 0;
        int emp = 0;
        int usuario; 
        
        
        System.out.println("*****Jokey Poh!*****" + "\n");
        
        
        
        do{
            
            System.out.println("Informe um número de acordo com a opção desejada" + "\n");
            System.out.println("Pedra = 0, papel = 1, tesoura = 2" + "\n");
            
            
            try{
                
                double aleatorio = Math.random();
                int computador = (int) ( 0 + aleatorio * (3 - 0));
                if (computador == 3){
                    computador -= 1;
                }
                
                 
                usuario = teclado.nextInt();
                
                switch (usuario){
                    case 0: 
                    case 1:
                    case 2:
            
                    System.out.println("*****Resultado*****" + "\n");
                    System.out.println("Ecolha do Computador: " + computador);
                    System.out.println("Escolha do Usuário: " + usuario);

                    if (usuario == 0 && computador == 1){
                        System.out.println("O Computador é o vencedor." + "\n");
                        compv += 1;}

                    if (computador == 0 && usuario == 1){
                        System.out.println("Parabens ! Você venceu! " + "\n");
                        userv += 1;}
                    if (computador == 0 && usuario == 2){
                        System.out.println("O Computador é o vencedor. "+ "\n");
                        compv += 1;}
                    if (usuario == 0 && computador == 2){
                        System.out.println("Parabens ! Você venceu! " + "\n");
                        userv += 1;}
                    if (usuario == 1 && computador == 2){
                        System.out.println("O Computador é o vencedor. " + "\n");
                        compv += 1;}
                    if (computador == 1 && usuario == 2){
                        System.out.println("Parabens ! Você venceu! " + "\n");
                        userv += 1;}
                    if (computador == 1 && usuario == 1){
                        System.out.println("Empatou!" + "\n");
                        emp += 1;}
                    
                    if (computador == 2 && usuario == 2){
                        System.out.println("Empatou!" + "\n");
                        emp += 1;}
                    if (computador == 0 && usuario == 0){
                        System.out.println("Empatou!" + "\n" );
                        emp ++;}
                    
                        break;
                    default: 
                        System.out.println("Informe uma opção Valida" + "\n");
                        break;
               
                }
                
                System.out.println("*****PLACAR*****");
                System.out.println("Computador: " + compv);
                System.out.println("Você: " + userv);
                System.out.println("Empates: " + emp);
                System.out.println("\n");

            System.out.println("Deseja Jogar mais uma vez ? Então Digite '1' !");
                opc = teclado.nextInt();
            }   
            
            catch (java.util.InputMismatchException e){
                System.out.println("Informe um valor numérico");
                
            }
        }while (opc == 1);
    }
        
}    

Como podem ver, eu criei um "joguinho" para treinar looping, try cath, if, etc.É mais para praticar mesmo, mas o lopping não para sempre que executo e ocorre a captura de uma exceção. Exemplo: Onde pede para eu digitar uma dos três números, caso eu digite uma letra ocorre um lopping, mas caso eu aperte um número invalido o looping não ocorre. 

 

Poderiam me ajudar ? 

 

 

Postado

Existe um excesso de "ifs" no seu código, bastaria isso:
 

//pedra == 0  papel == 1 tesoura == 2 

if (usuario < computador || (usuario == 2 && computador == 0)){ //se o computador tiver mais pontos ele vence
     System.out.println("O Computador é o vencedor." + "\n");//se o computador jogou pedra e o usuario tesoura ele vence
     compv += 1;
}
else if (usuario > computador || (computador == 0 && usuario == 2)){ //se o usuário tiver mais pontos ele vence
	 System.out.println("Parabéns! Você venceu!" + "\n")//se o usuário jogou pedra e o computador tesoura ele vence
     userv += 1;
}  	
else {//Se nenhuma das situações acima funcionou, significa que foi empate
     System.out.println("Empate" + "\n");
     empt += 1;
}

O else if só vai rodar caso o if acima seja falso. Se o computador não tem mais pontos que o usuário (e nem jogou pedra e o usuario tesoura) o java irá ler o else if, caso contrário ele irá ignorar as novas verificações (pois são desnecessária pois o usuário já venceu.).

No seu código o computador está checando todas as possibilidades mesmo que ele já tenha verificado que o usuário ganhou (por exemplo).

Pelo fato de você está usando try/catch quando um erro ocorre o programa ao invés de fechar irá pular do bloco try para o bloco catch

 

Em 14/07/2019 às 00:24, GR Carvalho disse:

Onde pede para eu digitar uma dos três números, caso eu digite uma letra ocorre um lopping, mas caso eu aperte um número invalido o looping não ocorre. 

System.out.println("Informe um número de acordo com a opção desejada" + "\n");

System.out.println("Pedra = 0, papel = 1, tesoura = 2" + "\n");

usuario = teclado.nextInt();

 

Quando você digita uma letra nessa parte o código pula direto para o catch, ou seja, tudo depois dessa linha não é rodado.
Você definiu opc=0  e só altera ela depois do switch. Caso você digite uma letra o código é rodado apenas uma vez, se você digita um número inválido o opc continua igual a 0.

 

Em 14/07/2019 às 00:24, GR Carvalho disse:

System.out.println("Deseja Jogar mais uma vez ? Então Digite '1' !");

opc = teclado.nextInt(); }

Aqui é onde o loop é definido, se o usuário digitar qualquer coisa que não seja 1 o código não entra em loop. Se esse trecho não for lido o programa não prossegue (pois opc continuará como 0).

Caso o usuário digite 1 na primeira vez, o código entrará em loop com opc = 1, na segunda vez que ele chega nessa linha se o usuário digitar uma letra um novo valor não será atribuído para opc, ou seja, opc continua igual a 1 e código repete.
Se o usuário digitar um número inteiro (que não seja 1), esse valor é atribuído para opc, que deixa de ser 1 e o código não entra em loop.

 

Para corrigir isso você precisa iniciar a variavel opc dentro do DOWHILE, assim toda vez que o código repetir essa variável será redefinida

do{
	int opc = 0;

//resto do código

}while(opc == 1);


 

 

  • Curtir 1

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...