【问题标题】:Having some trouble retrieving information from JToggleButton?(Matching Game)从 JToggleButton 检索信息时遇到问题?(匹配游戏)
【发布时间】:2020-01-17 20:14:37
【问题描述】:

我目前正在尝试编写记忆/匹配游戏。我在尝试弄清楚如何检查是否单击了同一张卡片并且用户找到了匹配项时遇到了问题。我了解我需要存储第一次点击的值并将其与第二次点击进行比较,但仍不确定如何实际执行。

考虑一下这段代码,我重新创建了一个更简单的游戏版本,您可以在下面实际运行它:

class start {

    JToggleButton DisplayCards[][] = new JToggleButton[4][4];
    Shuffle shuffle = new Shuffle();
    void main() {
        JFrame frame = new JFrame();

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(600, 600);
        int y = 20;
        int x = 60;

        for (int i = 0; i < DisplayCards.length; ++i) {
            for (int j = 0; j < DisplayCards[i].length; ++j) {
                DisplayCards[i][j] = new JToggleButton("Click Me!");


                DisplayCards[i][j].setBounds(x, y, 90, 126);
                y = y + 135;
                if (y >= 540) {
                    y = 20;
                    x = x + 120;
                }
                frame.add(DisplayCards[i][j]);
                DisplayCards[i][j].addActionListener(new Clicked(i, j, shuffle));
            }
        }

        frame.setLayout(null);
        frame.setVisible(true);
    }
}

洗牌类:

class Shuffle {

    String[][] cards = {
        {"A", "B", "C", "D"},
        {"E", "F", "G", "H"},
        {"A", "B", "C", "D"},
        {"E", "F", "G", "H"}

    };

    public void random() {
        for (int i = 0; i < cards.length; i++) {
            for (int j = 0; j < cards[i].length; j++) {
                int i1 = (int) (Math.random() * cards.length);
                int j1 = (int) (Math.random() * cards[i].length);

                String temp = cards[i][j];
                cards[i][j] = cards[i1][j1];
                cards[i1][j1] = temp;
            }

        }
    }
}

ActionListener 类:

class Clicked implements ActionListener {

    Shuffle shuffle;
    JToggleButton tBtn;
    private int i;
    private int j;

    public Clicked(int i, int j, Shuffle shuffle) {
        this.i = i;
        this.j = j;
        this.shuffle = shuffle;
    }

    public void actionPerformed(ActionEvent e) {
        tBtn = (JToggleButton) e.getSource();
        if (tBtn.isSelected()) {
            tBtn.setText(shuffle.cards[i][j]);

        } else {
            tBtn.setText("Click Me!");
        }

    }
}

【问题讨论】:

    标签: java arrays swing actionlistener


    【解决方案1】:

    您需要存储选择的值并进行比较。这是一个粗略的例子。

    我给你的主班打电话PuzzleGame

    在主类中,我放入了两个静态值。

    static String first;
    static boolean state = false;
    
    

    然后我修改了你的动作监听器如下。

        public void actionPerformed(ActionEvent e) {
            tBtn = (JToggleButton) e.getSource();
            if (tBtn.isSelected()) {
                tBtn.setText(shuffle.cards[i][j]);
                if (!PuzzleGame.state) {
                    PuzzleGame.first = shuffle.cards[i][j];
                    System.out.println(PuzzleGame.first);
                    PuzzleGame.state = true;
    
                } else {
                    if (PuzzleGame.first.equals(shuffle.cards[i][j])) {
                        System.out.println("Correct!");
                    }
                }
            } else {
                tBtn.setText("Click Me!");
            }
    
        }
    
    

    第一次通过,statefalse,所以设置了 first。第二次通过,statetrue,所以与 first 的设置也进行了比较。

    在这样的游戏中,您不应该使用静态值。我这样做是因为它很容易演示该技术。

    您还应该重置错误答案的值和状态,并禁用正确答案的按钮。

    最后一个提示。

    frame.setLocationRelativeTo(null); // centers the frame on screen.
    
    

    【讨论】:

    • 谢谢,但如果两个按钮匹配,我如何让它们消失?
    • setEnabled(false); 它们不会消失,只是变灰并且不响应点击。
    • @JoshuaSaikali 你试过这个吗?它对你有用吗?
    猜你喜欢
    • 2018-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-05
    • 1970-01-01
    • 2019-12-24
    • 1970-01-01
    相关资源
    最近更新 更多