0

私はしばらくの間、これについて自分のギアを磨いてきましたが、解決できませんでした. このmemorygameでは、ボタンを選択してから左上のボタンを選択するたびに (そのボタンが最初に選択されたとき)、左上のボタンが緑色になります。これはactionPerformed(ActionEvent e)、最初に左上のボタンを選択したときと、2 番目の選択肢として選択したときに public void のコードが 2 回実行されるためです。これを引き起こす可能性のあるものと、それを防ぐ方法はありますか?

をより良く作成する方法はたくさんあると思いますが、memorygame何がうまくいかなかったのかを知らずに先に進むのは嫌いです。

私はあなたの助けに感謝します。

すべてのコード:

public class Alt3_3 extends JFrame implements ActionListener {

    JButton button[] = new JButton[52];
    String[] kort = {"POTATIS", "GLASS", "UNIX", "GLAS", "FOSTERS", "AIGH",
        "VAT 69", "SPIK", "FREDAG", "SITS", "FEST", "DaTe", "ALBIN",
        "42", "BOTTLE", "SANDELS", "DEW", "STOL", "PETSKI", "LAGER", "STOUT",
        "MALT", "EN RUTA", "BASS", "PrtScr", "DEL"};
    String[] svar1;
    String[] svar2;
    boolean firstVald;
    boolean green;
    int score = 0;
    int progress = 0;
    int index1;
    int index2;
    String svark1;
    String svark2;

    Alt3_3() {
        List<String> list1 = Arrays.asList(kort);
        Collections.shuffle(list1);
        svar1 = list1.toArray(new String[0]);
        List<String> list2 = Arrays.asList(kort);
        Collections.shuffle(list2);
        svar2 = list2.toArray(new String[0]);

        setLayout(new FlowLayout());
        setPreferredSize(new Dimension(650, 700));
        setTitle("Memorygame");

        for (int i = 0; i < button.length; i++) {
            button[i] = new JButton("");
            button[i].setPreferredSize(new Dimension(100, 50));
            add(button[i]);
            button[i].addActionListener(this);
        }

        pack();
        setVisible(true);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }

    public void actionPerformed(ActionEvent e) {


        if (firstVald == false) {
            resetRed();
            firstVald = true;

            int index = -1;
            for (int i = 0; i < button.length; i++) {
                if (e.getSource() == button[i]) {
                    index = i;
                    break;
                }
            }
            index1 = index;

            if (index % 2 == 1) {
                button[index].setText(svar1[(index - 1) / 2]);
                svark1 = svar1[(index - 1) / 2];
            } else {
                button[index].setText(svar2[index / 2]);
                svark1 = svar2[index / 2];
            }
            button[index1].removeActionListener(this);

        } else {


            int index = -1;
            for (int i = 0; i < button.length; i++) {
                if (e.getSource() == button[i]) {
                    index = i;
                    break;
                }
            }
            index2 = index;

            if (index % 2 == 1) {
                button[index].setText(svar1[(index - 1) / 2]);
                svark2 = svar1[(index - 1) / 2];
            } else {
                button[index].setText(svar2[index / 2]);
                svark2 = svar2[index / 2];
            }

            if (svark1 == svark2) {
                progress++;
                green = true;
                button[index1].setBackground(Color.green);
                button[index2].removeActionListener(this);
                button[index2].setBackground(Color.green);
            } else {
                green = false;
                score++;
                button[index2].removeActionListener(this);
                button[index1].setBackground(Color.red);
                button[index2].setBackground(Color.red);

            }
            firstVald = false;

        }
        if (progress > 26) {
            showMessageDialog(null, "grattis" + Integer.toString(score));
            filhant.highScore(score);
            System.exit(0);
        }
    }

    public void resetRed() {
        if (green == false) {
            button[index1].setBackground(null);
            button[index2].setBackground(null);
            button[index1].setText("");
            button[index1].addActionListener(this);
            button[index2].setText("");
            button[index2].addActionListener(this);
        }
    }

    public static void main(String[] args) {
        new Alt3_3();
    }
}
4

1 に答える 1

1

2 つのボタンのうち最初のボタンについては、常に を呼び出しますresetRed。とで示さresetRedれるaddActionListenerボタンに移動しindex1ますindex2。これらはゼロに初期化されるため、アクション リスナーの 3 つのコピーがインストールされ、コードは 2 回だけでなく 3 回も実行されます。マッチしたペア。resetRed初めて電話をかけるのは避けましょう。

于 2013-05-10T22:37:28.053 に答える