我正在创建一个简单的剪刀石头布游戏,但通过添加两个选项Lizard"和Spock"来改变传统的游戏方式.这个游戏的重点是让它比传统的玩游戏方式更复杂.不确定我是否重载了 Action 事件,但我在代码中遇到了这个奇怪的错误.假设有 5 个按钮包含石头剪刀布等,以及 1 个 JTextArea.问题是每当我单击Spock"按钮时,String AI 也会得到Spock"/choices[4],它似乎忽略了下面我希望它响应的代码,而是使用You Lost"...哈哈"选项,
I am creating a simple Rock Paper Scissors game, but changing the traditional way it is played by adding two more choices, "Lizard" and "Spock". The Point of this game is to make it more complex then the traditional way of playing it. Not sure if I am overloading the Action Event, but I get this weird bug in the code. there is suppose to be 5 buttons containing the Rock Paper Scissors etc., and 1 JTextArea. The problem is whenever I click the button "Spock" and the String AI gets "Spock"/choices[4] as well, It appear to be ignoring the following code below that I want it to respond to and instead goes with "You Lost... Haha" Option,
if ((e.getSource() == b5) && (AI == choices[4])) { text.append("It's a Tie!\n\n"); return; }此外,当单击Lizard"按钮时,它也会忽略下面的代码并显示You Won!"替代选项
Also when clicking the "Lizard" Button, it also ignores the following code below and goes with the "You Won!" Option instead
if ((e.getSource() == b4) && (AI == choices[3])) { text.append("It's a Tie!\n\n"); return; }游戏规则
Scissors cut paper Paper covers rock Rock crushes lizard Lizard poisons Spock Spock smashes scissors Scissors decapitate lizard Lizard eats paper Paper disproves Spock Spock vaporizes rock Rock crushes scissors为那些好奇的人提供完整的代码.www.mediafire/?x4853rq3a4fp4ah*没有病毒.;)
Complete Code for those that are Curious. www.mediafire/?x4853rq3a4fp4ah *No Viruses. ;)
代码:
import java.awt.event.*; import javax.swing.*; class Main2 implements ActionListener { JTextArea text; JButton b1; JButton b2; JButton b3; JButton b4; JButton b5; String[] choices = { "Rock", "Paper", "Scissors", "Lizard", "Spock" }; int l = this.choices.length; public static void main(String[] args) { Main2 gui = new Main2(); gui.go(); } public void go() { JFrame frame = new JFrame("Rock Paper Scissors"); this.text = new JTextArea(13,40); JPanel panel1 = new JPanel(); JPanel panel2 = new JPanel(); b1 = new JButton(choices[0]); b2 = new JButton(choices[1]); b3 = new JButton(choices[2]); b4 = new JButton(choices[3]); b5 = new JButton(choices[4]); b1.addActionListener(this); b2.addActionListener(this); b3.addActionListener(this); b4.addActionListener(this); b5.addActionListener(this); text.setEditable(false); JScrollPane scroller = new JScrollPane(text); scroller.setVerticalScrollBarPolicy(22); panel1.add(scroller); panel2.add(this.b1); panel2.add(this.b2); panel2.add(this.b3); panel2.add(this.b4); panel2.add(this.b5); frame.getContentPane().add("Center", panel1); frame.getContentPane().add("South", panel2); frame.setSize(500, 300); frame.setVisible(true); } public void actionPerformed(ActionEvent e) { int nr = (int)(Math.random() *l); String AI = choices[nr]; if (e.getSource() == b1) { text.append("Your choice was " + choices[0] + "\nComputer's choice was " + AI + "\n"); } if (e.getSource() == b2) { text.append("Your choice was " + choices[1] + "\nComputer's choice was" + AI + "\n"); } if (e.getSource() == b3) { text.append("Your choice was " + choices[2] + "\nComputer's choice was " + AI + "\n"); } if (e.getSource() == this.b4) { text.append("Your choice was " + choices[3] + "\nComputer's choice was " + AI + "\n"); } if (e.getSource() == this.b5) { text.append("Your choice was " + choices[4] + "\nComputer's choice was " + AI + "\n"); } if (((e.getSource() ==b1) && (AI == choices[2])) || (AI == choices[3])) { text.append("You won!\n\n"); return; } if ((e.getSource() == b1) && (AI == choices[0])) { text.append("It's a Tie!\n\n"); return; } if (((e.getSource() == b1) && (AI == choices[1])) || (AI == choices[4])) { text.append("You Lost... Haha!\n\n"); return; } if (((e.getSource() == b2) && (AI == choices[0])) || (AI == choices[4])) { text.append("You won!\n\n"); return; } if ((e.getSource() == b2) && (AI == choices[1])) { text.append("It's a Tie!\n\n"); return; } if (((e.getSource() == b2) && (AI == choices[2])) || (AI == choices[3])) { text.append("You Lost... Haha!\n\n"); return; } if (((e.getSource() == b3) && (AI == choices[1])) || (AI == choices[3])) { text.append("You won!\n\n"); return; } if ((e.getSource() == b3) && (AI == choices[2])) { text.append("It's a Tie!\n\n"); return; } if (((e.getSource() == b3) && (AI == choices[0])) || (AI == choices[4])) { text.append("You Lost... Haha!\n\n"); return; } if (((e.getSource() == b4) && (AI == choices[1])) || (AI == choices[4])) { text.append("You won!\n\n"); return; } if ((e.getSource() == b4) && (AI == choices[3])) { text.append("It's a Tie!\n\n"); return; } if (((e.getSource() == b4) && (AI == choices[0])) || (AI == choices[2])) { text.append("You Lost... Haha!\n\n"); return; } if (((e.getSource() == b5) && (AI == choices[0])) || (AI == choices[2])) { text.append("You won!\n\n"); return; } if ((e.getSource() == b5) && (AI == choices[4])) { text.append("It's a Tie!\n\n"); return; } if (((e.getSource() == b5) && (AI == choices[1])) || (AI == choices[3])) { text.append("You Lost... Haha!\n\n"); return; } } } 推荐答案正如 Hot Licks 所建议的那样,这是您的问题:您正在使用 == 来检查字符串的等效性,而不是使用 ==code>equals(...) 或 equalsIgnoreCase(...) 方法.了解 == 检查两个 对象 是否相同,这不是您感兴趣的.另一方面,方法检查两个字符串是否相同字符以相同的顺序排列,这就是这里的重要性.所以代替
As Hot Licks suggests, that's your problem: you're using == to check for String equivalence rather than use either the equals(...) or the equalsIgnoreCase(...) method. Understand that == checks if the two objects are the same which is not what you're interested in. The methods on the other hand check if the two Strings have the same characters in the same order, and that's what matters here. So instead of
if (fu == "bar") { // do something }做,
if (fu.equals("bar")) { // do something }或者,
if (fu.equalsIgnoreCase("bar")) { // do something }另一个问题,与其使用大量 if 块,为什么不使用获胜矩阵来简单、轻松地简要检查一个选择是否优于另一个选择.枚举对此很有用,这样的事情可以工作:
Another issue, rather than having a chit-load of if blocks, why not use a win-matrix to simply, easily and briefly check to see if one choice beats another. Enums would be useful for this, something like this could work:
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 myComparatorpare(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()]; } } }测试该枚举的类可能如下所示:
A class to test this enum could look like so:
public class TestHandGameChoices { public static void main(String[] args) { for (HandGameChoice choice1 : HandGameChoice.values()) { for (HandGameChoice choice2 : HandGameChoice.values()) { int value = HandGameChoicepare(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然后 GUI 会像这样使用它:
Then the GUI would use it like so:
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 = HandGameChoicepare(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(); } }); } }更多推荐
没有所需的输出,可能的原因是过载
发布评论