Как сделать оператор if с несколькими переменными и несколькими условиями в случае переключения?Можно ли сравнивать случаи? - PullRequest
0 голосов
/ 27 сентября 2018

Я делаю игру «Ножницы из бумаги для камней», и у меня есть рабочая игра, но ее длина 213 строк.Я пытался сократить его до некоторой степени, добавив вместо моего оператора if регистр переключателя.Есть ли случаи, когда регистр переключателя просто не работает, и это должен быть оператор if?

String weaponChoice = keyboard.nextLine();
switch (weaponChoice) {
    case "Rock":
        System.out.println("You Chose Rock");
        break;
    case "Paper":
        System.out.println("You Chose Paper");
        break;
    case "Scissors":
        System.out.println("You chose Scissors");
        break;
    default:
        System.out.println(weaponChoice + " is not a valid answer the computer gets a point!");
        compScore++;
        break;
}

У меня был приведенный выше код в операторе if, и я переключил его без проблем, но с приведенным ниже кодом я не уверен, как его изменить.

String getComputerChoiceVariable = getComputerChoice();
System.out.println("The computer chose " + getComputerChoiceVariable);

if (weaponChoice.equals(getComputerChoiceVariable)) {
    System.out.println("It's a draw!");
    ties++;
} else if ((weaponChoice.equals("Rock")) && (getComputerChoiceVariable.equals("Scissors"))) {
    System.out.println("You won!");
    userScore++;
} else if ((weaponChoice.equals("Paper")) && (getComputerChoiceVariable.equals("Rock"))) {
    System.out.println("You won!");
    userScore++;
} else if ((weaponChoice.equals("Scissors")) && (getComputerChoiceVariable.equals("Paper"))) {
    System.out.println("You won!");
    userScore++;
} else if (weaponChoice.equals("Rock") && getComputerChoiceVariable.equals("Paper")) {
    System.out.println("You Lost!");
    compScore++;
} else if (weaponChoice.equals("Paper") && getComputerChoiceVariable.equals("Scissors")) {
    System.out.println("You Lost!");
    compScore++;
} else if (weaponChoice.equals("Scissors") && getComputerChoiceVariable.equals("Rock")) {
    System.out.println("You Lost!");
    compScore++;
}

Может быть, что-токак

switch (weaponChoice,getComputerChoiceVariable){
    case "Rock",case "Scissors":
        System.out.println("You won!");
}

Но Java не любит, что я получаю массу ошибок.Может ли переключатель принимать два параметра?Я супер новичок в Java.Могу ли я как-то использовать && для сравнения случаев?

Ответы [ 3 ]

0 голосов
/ 27 сентября 2018

Блок переключателей не может быть записан с двумя параметрами.Из документации Oracle :

Коммутатор работает с примитивными типами байтов, коротких символов, символов типа char и int.Он также работает с перечисляемыми типами (обсуждается в Enum Types), классом String и несколькими специальными классами, которые заключают в себе определенные примитивные типы: Character, Byte, Short и Integer (обсуждаемые в Numbers и Strings).

Однако вы можете сделать вашу программу более модульной, написав:

if (weaponChoice.equals(getComputerChoiceVariable)) {
  System.out.println("It's a draw!");
  ties++;
} else if (userWins(weaponChoice, getComputerChoiceVariable)) {
  System.out.println("You won!");
  userScore++;
} else {
  System.out.println("You Lost!");
  compScore++;
}

и используя что-то вроде:

public boolean userWins(String userWeapon, String compWeapon) {
  if((userWeapon.equals("Rock")) && (compWeapon.equals("Scissors"))) {
      return true;
  } else if((userWeapon.equals("Paper")) && (compWeapon.equals("Rock"))){
      return true;
  } else if((userWeapon.equals("Scissors")) && (compWeapon.equals("Paper"))){
      return true;
  } else if(userWeapon.equals("Rock") && compWeapon.equals("Paper")) {
      return false;
  } else if(userWeapon.equals("Paper") && compWeapon.equals("Scissors")) {
      return false;
  } else {
      return false;
  }
}
0 голосов
/ 27 сентября 2018

Вам не обязательно менять свой код, чтобы сократить его.Вы можете поместить параметры дерева в список и сравнить выбор пользователя со значением, которое следует за выбором компьютера, чтобы увидеть, выиграл ли пользователь.

Если у вас есть список [Rock, Paper, Scissors], компьютер выбралРок.Найдите элемент после него, так что бумага в этом случае.Теперь вам нужно только увидеть, равно ли это значение выбору пользователя, и если это так, пользователь выиграл.

List<String> choices = Arrays.asList("Rock", "Paper", "Scissors");

if (playerChoice.equals(computerChoice)) {
    System.out.println("Draw!");
} else if (playerChoice.equals(choices.get((choices.indexOf(computerChoice) + 1) % 3))) {
    System.out.println("You won!");
} else {
    System.out.println("You lost!");
}

Здесь choices.indexOf(computerChoice) находит текущие позиции выбора компьютера в списке,Он добавляет единицу, чтобы найти следующий элемент в списке, и использует оператор остатка (% 3), чтобы убедиться, что, если следующий индекс выше, чем последний элемент в списке, он возвращается к первому элементу.

0 голосов
/ 27 сентября 2018

Оператор switch может проверять значение только одного выражения.Можно вложить switch операторов, но это слишком многословно и не лучше, чем серия if / else операторов.

В качестве отступления, вы можете захотеть проверить оружие пользователявыбор, чтобы кто-то не выбрал Lizard, Spock, Foo или что-то еще неожиданное.

Вы можете объединить строки в одну, чтобы ее можно было проверить.Я бы использовал разделитель, такой как "|", чтобы сделать выбор ясным.Кроме того, разные случаи имеют одинаковую логику, избегая повторения.

switch(weaponChoice + "|" + computerChoice)
{
    case "Rock|Scissors":
    case "Scissors|Paper":
    case "Paper|Rock":
        System.out.println("You won!");
        userScore++;
        break;
    case "Rock|Paper":
    case "Paper|Scissors":
    case "Scissors|Rock":
        System.out.println("You lost!");
        compScore++;
        break;
    default:
        System.out.println("It's a draw!");
        ties++;
}

Это сжато и в нем перечислены все похожие случаи вместе, без повторения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...