2012-04-06 3 views
1

Надеюсь, это быстрый вопрос. Я делаю простую игру для ножниц из каменной бумаги. Я делаю случайный выбор компьютера в порядке и получаю выбор пользователя в порядке. Но когда я пытаюсь найти, кто победит, он печатает последнее в моем else, если блок, который используется для недопустимого ввода.Java Else If Block Not Working Правильно

Он печатает «Введите правильный выбор», когда был сделан правильный выбор.

import java.util.Random; 
import javax.swing.JOptionPane; 

public class JavaApplication4 { 

    public static void main(String[] args) 
    { 
     Random ranNums = new Random(); 

     int comp = ranNums.nextInt(3); 
     String comp2; 
     String winner; 

     String user = JOptionPane.showInputDialog 
       (null, "Enter rock, paper, or scissors"); 
     user.toLowerCase(); 

     if(comp == 0) 
      comp2 = "rock"; 
     else if(comp == 1) 
      comp2 = "paper"; 
     else 
      comp2 = "scissors"; 

     //Computer wins 
     if(comp2 == "rock" && user == "scissors") 
      winner = "The computer wins"; 

     else if(comp2 == "paper" && user == "rock") 
      winner = "The computer wins";  

     else if(comp2 == "scissors" && user == "paper") 
      winner = "The computer wins"; 

     //Tie game 
     else if(comp2 == "rock" && user == "rock") 
      winner = "It's a tie"; 

     else if(comp2 == "paper" && user == "paper") 
      winner = "It's a tie"; 

     else if(comp2 == "scissors" && user == "scissors") 
      winner = "It's a tie"; 

     //User wins 
     else if(comp2 == "scissors" && user == "rock") 
      winner = "You win!"; 

     else if(comp2 == "rock" && user == "paper") 
      winner = "You win!"; 

     else if(comp2 == "paper" && user == "scissors") 
      winner = "You win!"; 
     else 
      winner = "Enter a valid choice"; 

     JOptionPane.showMessageDialog(null, "You picked " + user + "\n" + 
      "The computer picked " + comp2 + "\n" + 
       winner); 



    } 
} 
+0

Я согласен, что это дубликат. Я не знал, что это была проблема сравнения строк, когда я спрашивал. –

ответ

3

вы не можете использовать

comp == "paper" 

сравнить строки в java. Вы можете использовать

comp.equals("paper") 

или если дело не имеет значения

comp.equalsIgnoreCase("paper") 
+2

Чтобы избежать NullPointerException, лучше с «paper» .equals (comp) – Uhlen

3

Не сравнивать строки, используя ==. Вместо этого используйте equals или equalsIgnoreCase (...). Поймите, что == проверяет, являются ли объекты те же, что вас не интересует. Методы, с другой стороны, проверяют, имеют ли две строки одинаковые символы в одном порядке, и это имеет значение здесь. Таким образом, вместо

if (fu == "bar") { 
    // do something 
} 

сделать,

if ("bar".equals(fu)) { 
    // do something 
} 

или,

if ("bar".equalsIgnoreCase(fu)) { 
    // do something 
} 

Один из способов упростить ваш код, чтобы создать перечисление RockPaperScissors и дать ему его на сравнение метода. Что-то вроде:

enum RockPaperScissors { 
    ROCK("Rock"), PAPER("Paper"), SCISSORS("Scissors"); 

    private String text; 
    private static int[][] winMatrix = {{0, -1, 1}, {1, 0, -1}, {-1, 1, 0}}; 

    private RockPaperScissors(String text) { 
     this.text = text; 
    } 

    @Override 
    public String toString() { 
     return text; 
    } 

    // can't use compareTo since it is a final method for enums 
    public int compareVs(RockPaperScissors other) { 
     int thisOrdinal = ordinal(); 
     int otherOrdinal = other.ordinal(); 
     return winMatrix[thisOrdinal][otherOrdinal]; 
    } 
} 

Затем сравнить один перечисление против другого, просто вызовите его compareVs (...) метод прохождения в другом перечислении.

Так что ваш огромный, если/иначе блок будет сократить до:

// assuming that user and comp are RockPaperScissors variables 
int result = user.compareVs(comp); 
if (result == 1) { 
    System.out.println("You've won!"); 
} else if (result == 0) { 
    System.out.println("It's a tie!"); 
} if (result == -1) { 
    System.out.println("You've lost!"); 
} 
+1

Чтобы избежать NullPointerException, лучше с «bar» .equals (fu) – Uhlen

+0

@Uhlen: Благодарю вас за отличное предложение! Код изменен. –

+1

Спасибо, что показали мне, как оптимизировать код! Я не очень хорошо знаком с перечислениями, но когда я прочитаю о них, я обязательно вернусь сюда. –

1

Вы не можете сравнивать строку, как это: if (comp2 == "rock")

Вам нужно написать: if ("rock".equals(comp2))

2

Если вы похожи на меня, и вы наслаждаетесь необработанный код:

import java.util.Random; 
import javax.swing.JOptionPane; 

public class JavaApplication4 { 

public static void main(String[] args) 
{ 
    Random ranNums = new Random(); 

    int comp = ranNums.nextInt(3); 
    String comp2; 
    String winner; 

    String user = JOptionPane.showInputDialog 
      (null, "Enter rock, paper, or scissors"); 
    user.toLowerCase(); 

    if(comp == 0) 
     comp2 = "rock"; 
    else if(comp == 1) 
     comp2 = "paper"; 
    else 
     comp2 = "scissors"; 

    //Computer wins 
    if(comp2.equals("rock") && user.equals("scissors")) 
     winner = "The computer wins"; 

    else if(comp2.equals("paper") && user.equals("rock")) 
     winner = "The computer wins";  

    else if(comp2.equals("scissors") && user.equals("paper")) 
     winner = "The computer wins"; 

    //Tie game 
    else if(comp2.equals("rock") && user.equals("rock")) 
     winner = "It's a tie"; 

    else if(comp2.equals("paper") && user.equals("paper")) 
     winner = "It's a tie"; 

    else if(comp2.equals("scissors") && user.equals("scissors")) 
     winner = "It's a tie"; 

    //User wins 
    else if(comp2.equals("scissors") && user.equals("rock")) 
     winner = "You win!"; 

    else if(comp2.equals("rock") && user.equals("paper")) 
     winner = "You win!"; 

    else if(comp2.equals("paper") && user.equals("scissors")) 
     winner = "You win!"; 
    else 
     winner = "Enter a valid choice"; 

    JOptionPane.showMessageDialog(null, "You picked " + user + "\n" + 
     "The computer picked " + comp2 + "\n" + 
      winner); 
} 
} 

Надежда, что помогает!

+0

Чтобы избежать NullPointerException, лучше с «rock» .equals (comp2) – Uhlen

+0

@ Uhlen Я знаю, но я сделал это с помощью функции замены Eclipse, и это было бы немного сложнее с регулярным выражением. – Xyene