Preciso de uma ajuda nesse código, o resultado da variável opcao1 não esta executando dentro do while, só a variável opcao2 que esta sendo executada pelo while, podem me ajudar?
Scanner sc = new Scanner(System.in);
List <String> list= new ArrayList<>();
System.out.print("Jogador 1 - Digite o seu nome: ");
String primeiro_nome = sc.nextLine();
System.out.print("Jogador 2 - Digite o seu nome: ");
String segundo_nome = sc.nextLine();
Jogadores jogadores = new Jogadores(primeiro_nome, segundo_nome);
System.out.print(primeiro_nome + ", você escolhe 'pedra', 'papel' ou 'tesoura'? ");
String opcao1 = sc.nextLine();
list.add(opcao1);
System.out.print(segundo_nome + ", você escolhe 'pedra', 'papel' ou 'tesoura'? ");
String opcao2 = sc.nextLine();
list.add(opcao2);
for(String obj : list) {
String opcao_antigo = "";
while (!obj.equalsIgnoreCase("pedra") & !obj.equalsIgnoreCase("papel")
& !obj.equalsIgnoreCase("tesoura")) {
System.out.println("Favor escrever 'pedra', 'papel' ou 'tesoura'!");
obj = sc.nextLine();
}
while (obj.equalsIgnoreCase(opcao_antigo)) {
System.out.println("O Jogador 1 ja escolheu " + obj.toUpperCase() + ".
Escolha outra opção!");
obj = sc.nextLine();
while (!obj.equalsIgnoreCase("pedra") & !obj.equalsIgnoreCase("papel")
& !obj.equalsIgnoreCase("tesoura")) {
System.out.println("Favor escrever 'pedra', 'papel' ou 'tesoura'!");
obj = sc.nextLine();
}
}
opcao_antigo = obj;
}
Inicialize a variavel opcao_antigo antes do for. Assim:
String opcao_antigo = ""
for(String obj : list) {
Uma sugestão eu vi que você tá validando a entrada do usuário!
while (!obj.equalsIgnoreCase("pedra") & !obj.equalsIgnoreCase("papel")
& !obj.equalsIgnoreCase("tesoura")) {
System.out.println("Favor escrever 'pedra', 'papel' ou 'tesoura'!");
obj = sc.nextLine();
}
Então seria mais interessante se você fizesse isso no momento em que o usuário digita pela primeira vez o valor!
Que sabe você não cria uma função para isso!
@Jelson1 eu ja fiz uma função e não deu certo, cheguei a fazer tb duas funções separadas, uma para cada parâmetro recebido e mesmo assim ele não esta executando a opção 1 q é o primeiro jogador, só executa a opção 2…aonde esta o erro?
OPA! Pode explicar o que ele deveria fazer? E o que tá acontecendo? Por que eu olhando seu código aqui, não percebo nada de errado! Um exemplo do que é para acontecer!
Nessa outra parte abaixo: o while recebe a palavra digitada da opcao1 e a palavra da opcao2 e ele verifica se escrevi corretamente a palavra ‘pedra ou papel ou tesoura’, se por exemplo eu escrever outra palavra tipo mouse. ele tem que entrar do while que aparece a mensagem: (“Favor escrever ‘pedra’, ‘papel’ ou ‘tesoura’!”);…quando eu rodo o programa a palavra da opcao1 não faz essa checagem se escrevi a palavra corretamente, só na palavra digitada da opcao2 que ele verifica essa condição e aparece a mensagem (“Favor escrever ‘pedra’, ‘papel’ ou ‘tesoura’!”) , deu pra entender?
String opcao_antigo = "";
for(String obj : list) {
while (!obj.equalsIgnoreCase("pedra") & !obj.equalsIgnoreCase("papel")
& !obj.equalsIgnoreCase("tesoura")) {
System.out.println("Favor escrever 'pedra', 'papel' ou 'tesoura'!");
obj = sc.nextLine();
}
while (obj.equalsIgnoreCase(opcao_antigo)) {
System.out.println("O Jogador 1 ja escolheu " + obj.toUpperCase() + ".Escolha outra opção!");
obj = sc.nextLine();
while (!obj.equalsIgnoreCase("pedra") & !obj.equalsIgnoreCase("papel")
& !obj.equalsIgnoreCase("tesoura")) {
System.out.println("Favor escrever 'pedra', 'papel' ou 'tesoura'!");
obj = sc.nextLine();
}
}
opcao_antigo = obj;
}
@Albertassi88 acho que entendi! Que dizer que quando você coloca algo diferente de pedra, papel e tesoura o programa não faz a verificão?
exemplo se você colocar pão e papel o programa aceita?
@Jelson1 sim se colocar pão e papel ele aceita, pois a opcao 1 não esta sendo verificada, mais se eu colocar exemplo pão e pneu, o pneu vai ser verificado e vai pedir para eu digitar a palavra correta…
Uma coisa é que as opções estão sendo modificadas. Então você tem que atualizar na lista (caso você utilize novamente essa lista). Alterando o for, fique atento aos comentários:
String opcao_antigo = "";
for(int i = 0; i<list.size();i++) {
System.out.println("Opção: "+list.get(i)+"\n"); //só para mostrar qual é a palavra que está sendo processada!
String obj = list.get(i); //aqui Eu pego o valor da opção;
while (!obj.equalsIgnoreCase("pedra") & !obj.equalsIgnoreCase("papel")
& !obj.equalsIgnoreCase("tesoura")) {
System.out.println("Favor escrever 'pedra', 'papel' ou 'tesoura'!");
obj = sc.nextLine();
}
while (obj.equalsIgnoreCase(opcao_antigo)) {
System.out.println("O Jogador 1 ja escolheu " + obj.toUpperCase() + ".
Escolha outra opção!");
obj = sc.nextLine();
while (!obj.equalsIgnoreCase("pedra") & !obj.equalsIgnoreCase("papel")
& !obj.equalsIgnoreCase("tesoura")) {
System.out.println("Favor escrever 'pedra', 'papel' ou 'tesoura'!");
obj = sc.nextLine();
}
}
list.set(i,obj); //aqui Eu atualizo o valor na lista!
opcao_antigo = obj;
}
@Albertassi88 olha de novo eu editei o post! Tava confundido as coisas! Como tá trabalhando com lista o correto era list.get(i). Olha de novo o codigo que postei e vê se dá certo!
@Jelson1 entendi, funciona sim obrigado, mais eu queria mesmo fazer sem usar o get e set, eu cheguei a fazer dois métodos, um para cada opção recebida e sinceramente não deu para entender o pq a primeira opção esta sendo modificada pois os métodos q tinha feito eram individuais para cada opção recebida…eu queria entender o pq não deu certo dessa forma…
Você tinha criado um tipo especial de for: for(String obj: list)
Que criar a variavel obj e atribuí um elemento da lista em cada interação do laço até pecorrer todos.
Depois vem o primeiro while que, se a entrada do usuário for inválida ele obriga digitar novamente e atribuí o valor digitado a variavel obj, o mesmo ocorrer com o segundo while
Então é na etapa 2 que ocorre o perigo! Como eu falei, ele atribui a nova entrada a variave obj, ou seja a sua lista permanece intacta, sem ser alterada!
Então depois que esse for os valores da lista continua a mesma coisa! Por isso o uso do for padrão: for(int i = 0; i < list.size(); i++) e do método get é set.
Por que dessa forma eu consigo atualizar os valores da lista e não só da variável obj.
Existem várias formas de percorrer uma lista é tudo isso depende da situação.
Exemplo: numa situação que eu quero apenas mostrar os valores na tela, é mais fácil eu fazer isso:
for(int i = 0; i<minha lista.size(); i++){
s = minhaLista.get(i);
System.out.println(s);
}
Mas quando eu quero alterar um valor da lista o segundo exemplo acaba se tornando mais prático! Então tudo isso depende da sua situação, e também do seu gosto, qual método você prefere!
Não sei se eu respondi a sua pergunta! Kkkkk
Mas seu problema foi resolvido?
@Jelson1 sobre a sua pergunta, é coisa minha mesmo, o get eu não ligo em usar mais a questão de alterar valores usando o set não gosto muito, só em algumas situações mesmo…mais é coisa minha rsrs…mais olha esse exemplo abaixo:
Eu estou com dois métodos para cada opção recebido e mesmo assim o primeiro valor esta sendo alterado, nesse exemplo não estou conseguindo entender o motivo, pois cada método esta recebendo e retornando o seu valor…
package Brin;
import java.util.Scanner;
public class Pedr {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("J 1: ");
String op1 = sc.nextLine();
System.out.println("J 2: ");
String op2 = sc.nextLine();
Reg reg = new Reg();
reg.Regggg(op1);
reg.Regggg2(op2);
package Brin;
import java.util.Scanner;
public class Reg {
Scanner sc = new Scanner(System.in);
public String Regggg(String op1) {
@Albertassi88, Olha tem duas coisa que você tem que ter em mente:
Você criou duas funções que faz a mesma coisa, sendo que uma das finalidades das funções é reutilizar o código!
As suas funções estão retornado uma String, mas você não está armazenando elas em lugar nenhum.
Uma alternativa é criar uma função na mesma classe, cuja a única finalidade é pegar a entrada do usuário e validar ao mesmo tempo!
public class Pedr {
public static void main(String[] args) {
//Quando eu for pegar as opções eu uso a função!
// passando o Scanner criado (sc) como parâmetros.
Scanner sc = new Scanner(System.in);
System.out.println("J 1: ");
String op1 = pegarEntrada(sc); // pega o valor e armazena em op1;
System.out.println("J 2: ");
String op2 = pegarEntrada(sc); //pega a nova entrada e armazena em op2
System.out.println("Opçao 1: "+op1);
System.out.println("Opçao 2: "+op2);
}
//Essa é a função para pegar a entrada e validar
public static String pegarEntrada(Scanner sc){
String op = "";
do{
op = sc.nextLine();
}while ( !op.equalsIgnoreCase("ped") & !op.equalsIgnoreCase("tes") & (!op.equalsIgnoreCase("pap"));
return op;
}
// nesse caso eu usei o (do while) no lugar de while
}