Как подсказывает Hot Licks, это ваша проблема: вы используете ==
для проверки эквивалентности строк, а не метод equals(...)
или equalsIgnoreCase(...)
.Поймите, что ==
проверяет, являются ли два объекта одинаковыми, что вас не интересует. С другой стороны, методы проверяют, имеют ли две строки одинаковые символы в одинаковом порядке, ивот что здесь важно.Таким образом, вместо
if (fu == "bar") {
// do something
}
do,
if (fu.equals("bar")) {
// do something
}
или
if (fu.equalsIgnoreCase("bar")) {
// do something
}
Другая проблема, а не загрузка блоков ifпочему бы не использовать win-матрицу, чтобы просто, легко и кратко проверить , чтобы увидеть, побеждает ли один выбор другой.Для этого могут быть полезны перечисления, может сработать что-то подобное:
import java.util.Comparator;
public enum HandGameChoice {
ROCK,
PAPER,
SCISSORS,
LIZARD,
SPOCK;
private static MyComparator myComparator = new MyComparator();
public static int compare(HandGameChoice o1, HandGameChoice o2) {
return myComparator.compare(o1, o2);
}
private static class MyComparator implements Comparator<HandGameChoice> {
private int[][] winMatrix = {
{ 0, -1, 1, 1, -1},
{ 1, 0, -1, -1, 1},
{-1, 1, 0, 1, -1},
{-1, 1, -1, 0, 1},
{ 1, -1, 1, -1, 0}
};
@Override
public int compare(HandGameChoice o1, HandGameChoice o2) {
return winMatrix[o1.ordinal()][o2.ordinal()];
}
}
}
Класс для проверки этого перечисления может выглядеть так:
public class TestHandGameChoices {
public static void main(String[] args) {
for (HandGameChoice choice1 : HandGameChoice.values()) {
for (HandGameChoice choice2 : HandGameChoice.values()) {
int value = HandGameChoice.compare(choice1, choice2);
String result = "";
if (value > 0) {
result = "win";
} else if (value < 0) {
result = "lose";
} else {
result = "tie";
}
System.out.printf("%-8s vs %-8s: %s%n", choice1, choice2, result);
}
}
}
}
Вывод тестового класса показывает:
ROCK vs ROCK : tie
ROCK vs PAPER : lose
ROCK vs SCISSORS: win
ROCK vs LIZARD : win
ROCK vs SPOCK : lose
PAPER vs ROCK : win
PAPER vs PAPER : tie
PAPER vs SCISSORS: lose
PAPER vs LIZARD : lose
PAPER vs SPOCK : win
SCISSORS vs ROCK : lose
SCISSORS vs PAPER : win
SCISSORS vs SCISSORS: tie
SCISSORS vs LIZARD : win
SCISSORS vs SPOCK : lose
LIZARD vs ROCK : lose
LIZARD vs PAPER : win
LIZARD vs SCISSORS: lose
LIZARD vs LIZARD : tie
LIZARD vs SPOCK : win
SPOCK vs ROCK : win
SPOCK vs PAPER : lose
SPOCK vs SCISSORS: win
SPOCK vs LIZARD : lose
SPOCK vs SPOCK : tie
Тогда графический интерфейс будет использовать его так:
import java.awt.*;
import java.awt.event.*;
import java.util.Random;
import javax.swing.*;
@SuppressWarnings("serial")
public class HandGameGui extends JPanel {
private JTextArea tArea = new JTextArea(13, 40);
public HandGameGui() {
ButtonListener btnListener = new ButtonListener();
JPanel btnPanel = new JPanel(new GridLayout(1, 0, 5, 0));
for (HandGameChoice hgChoice : HandGameChoice.values()) {
String choiceString = hgChoice.name();
String initCapChoiceString = choiceString.substring(0, 1)
+ choiceString.substring(1, choiceString.length()).toLowerCase();
JButton button = new JButton(initCapChoiceString);
button.setActionCommand(choiceString);
button.addActionListener(btnListener);
btnPanel.add(button);
}
setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
setLayout(new BorderLayout(5, 5));
add(new JScrollPane(tArea, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
JScrollPane.HORIZONTAL_SCROLLBAR_NEVER), BorderLayout.CENTER);
add(btnPanel, BorderLayout.PAGE_END);
}
private class ButtonListener implements ActionListener {
private Random random = new Random();
@Override
public void actionPerformed(ActionEvent e) {
String actionCommand = e.getActionCommand();
HandGameChoice userChoice = HandGameChoice.valueOf(actionCommand);
int randomInt = random.nextInt(HandGameChoice.values().length);
HandGameChoice aiChoice = HandGameChoice.values()[randomInt];
int gameResult = HandGameChoice.compare(userChoice, aiChoice);
String resultStr = "";
if (gameResult > 0) {
resultStr = "win";
} else if (gameResult < 0) {
resultStr = "lose";
} else {
resultStr = "tie";
}
String output = String.format("You chose %s, and the computer chose %s; you %s%n",
userChoice, aiChoice, resultStr);
tArea.append(output);
}
}
private static void createAndShowGui() {
HandGameGui mainPanel = new HandGameGui();
JFrame frame = new JFrame("Rock Paper Scissors Lizard Spock");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}