必要な出力がない、考えられる原因が過負荷である

私はシンプルなロックペーパーはさみゲームを作成していますが、従来の方法を変更するには、2つの選択肢「Lizard」と「Spock」を追加します。このゲームのポイントは、それをより伝統的な方法で再生することです。私がアクションイベントをオーバーロードしているかどうかはわかりませんが、コードにこの奇妙なバグがあります。ロックペーパーはさみなどを含む5つのボタンと1つのJTextAreaがあると仮定します。問題は、 "Spock"ボタンをクリックして文字列AIが "Spock"/choices [4]を取得するたびに発生し、以下のコードを無視しているように見えます。 ...ハハ "オプション、

if ((e.getSource() == b5) && (AI == choices[4])) {
  text.append("It's a Tie!\n\n");
  return;
}

また、 "Lizard"ボタンをクリックすると、以下の以下のコードも無視され、 "You Won!"代わりにオプション

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

不思議な人のための完全なコード。 http://www.mediafire.com/?x4853rq3a4fp4ah *ウイルスはありません。 ;)

コード:

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;
     }
    }
   }
0
あなたが比較している文字列がインターンされていると確信していますか?そうでない場合は、 equals()を使用する必要があります。
追加された 著者 Hot Licks,
(「オーバーロード」とはどういう意味ですか?)
追加された 著者 Hot Licks,
単にコードをここに掲載するのはなぜですか?特に、これまでに投稿した内容に基づいて、何が間違っているのか誰も推測することができないので、私は見ていないからです。
追加された 著者 Hovercraft Full Of Eels,

1 答え

Hot Licksが示唆するように、それはあなたの問題です: equals(...)または equals(...)の代わりに == equalsIgnoreCase(...)メソッドを使用します。 2つのオブジェクトが同じであるかどうかを == が調べているかどうかを調べます。文字は同じ順序で表示されますだから代わりに

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

行う、

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

または、

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

もう一つの問題は、ifブロックのchit-loadを使うのではなく、なぜwin-matrixを簡単に使うのか、簡単に列挙型はこれに便利ですが、次のようなものが有効です:

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 {
      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

その後、GUIは次のように使用します。

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
追加された
情報と改善されたGUIをありがとう。私は悲しいことに列挙したことはありませんでした。
追加された 著者 Streak324,