首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >没有所需的输出,可能的原因是过载

没有所需的输出,可能的原因是过载
EN

Stack Overflow用户
提问于 2011-11-25 10:00:18
回答 1查看 239关注 0票数 0

我正在创建一个简单的石头布剪刀游戏,但改变了它的传统方式,增加了两个选择,“蜥蜴”和“斯波克”。这个游戏的重点是让它比传统的玩它的方式更复杂。不确定我是否重载了Action事件,但我在代码中得到了这个奇怪的bug。假设有5个按钮包含石布剪刀等,和1个JTextArea。问题是,每当我点击按钮"Spock“时,字符串AI也会得到"Spock"/choices4,它似乎忽略了下面我希望它响应的代码,而是使用了"You lose...haha”选项。

代码语言:javascript
运行
复制
if ((e.getSource() == b5) && (AI == choices[4])) {
  text.append("It's a Tie!\n\n");
  return;
}

此外,当单击“蜥蜴”按钮时,它也会忽略下面的代码,并显示"You Won!“选项而不是

代码语言:javascript
运行
复制
if ((e.getSource() == b4) && (AI == choices[3])) {
  text.append("It's a Tie!\n\n");
  return;
}

游戏规则

代码语言:javascript
运行
复制
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

为那些有好奇心的人完成代码。http://www.mediafire.com/?x4853rq3a4fp4ah *没有病毒。;)

代码:

代码语言:javascript
运行
复制
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;
     }
    }
   }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-11-25 10:22:29

正如Hot所建议的,这就是您的问题所在:您使用==而不是equals(...)equalsIgnoreCase(...)方法来检查字符串的等价性。要知道,==会检查这两个对象是否相同,而这不是您感兴趣的。另一方面,这些方法检查两个字符串是否具有相同顺序的相同字符,这才是关键所在。因此,不是

代码语言:javascript
运行
复制
if (fu == "bar") {
  // do something
}

做,

代码语言:javascript
运行
复制
if (fu.equals("bar")) {
  // do something
}

或,

代码语言:javascript
运行
复制
if (fu.equalsIgnoreCase("bar")) {
  // do something
}

另一个问题是,与其使用一堆if块,不如使用win-matrix来简单、轻松和简短地检查一个选择是否击败了另一个选择。枚举对此很有用,像这样的东西可能会起作用:

代码语言:javascript
运行
复制
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()];
      }
   }
}

测试此枚举的类可能如下所示:

代码语言:javascript
运行
复制
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);
         }
      }
   }
}

测试类的输出显示:

代码语言:javascript
运行
复制
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会像这样使用它:

代码语言:javascript
运行
复制
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();
         }
      });
   }
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8264150

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档