Возникли проблемы с получением информации из JToggleButton? - PullRequest
0 голосов
/ 17 января 2020

В настоящее время я пытаюсь запрограммировать игру на память / сопоставление. У меня возникла проблема с попыткой выяснить, как проверить, была ли нажата та же карта, и нашел ли пользователь совпадение. Я понимаю, что мне нужно сохранить значение первого клика и сравнить его со вторым кликом, но все еще не уверен, как на самом деле это сделать.

Рассмотрим этот код, я воссоздал более простую версию игры который вы можете запустить ниже:

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!");
        }

    }
}

1 Ответ

0 голосов
/ 17 января 2020

Вам необходимо сохранить выбранные значения и сравнить их. Вот грубый пример.

Я назвал ваш основной класс PuzzleGame.

В основной класс я положил два значения c.

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!");
        }

    }

В первый раз state равен false, поэтому first установлено. Во второй раз state равен true, поэтому выполняется сравнение с тем, что было установлено и first.

В такой игре вы НЕ ДОЛЖНЫ использовать значения stati c. Я сделал это, потому что продемонстрировать технику было легко.

Вам также следует сбросить значения и состояние для неправильного ответа и отключить кнопки для правильного ответа.

Один последний совет.

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

...