-1
private JButton buttons[][] = new JButton[4][4];
int i, j, n, index = 0, calc = 0;
public int open = 0;
private JButton  opens[] = new JButton[1];
public ImageIcon  images[] = new ImageIcon[20];

public Concentration()
{
    super ("Concentration");

    JFrame frame = new JFrame();
    setSize(1000, 1000);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    JPanel panel = new JPanel(new GridLayout(4, 4));
    panel.setSize(400, 400);
    // Getting images
    for (i = 0; i < 8; i++) {
        images[i] = new ImageIcon(getClass().getResource("/images/1 ("+i+").jpg"));
    }

    // Copying images for game
    for (i = 8; i < 16; i++) {
        images[i] = images[i - 8];
    }

    // Shuffling
    Random random = new Random();
    int k;
    ImageIcon imageTemp;

    for (i = 0; i < 16; i++) {
        k = random.nextInt(16);
        imageTemp = images[i];
        images[i] = images[(i + k) % 16];
        images[(i + k) % 16] = imageTemp;
    }

    for (i = 0; i < buttons.length; i++) {
        for (j = 0; j < buttons[i].length; j++) {
            n = i * buttons.length + buttons[i].length;
            buttons[i][j] = new JButton();
            buttons[i][j].setIcon(null);
            /*
             * I made null instad of putting images because if i put images,
             * at start it shows all. but how will i take parameters to
             * actionlistener? for comparing if same?
             */
            //images[i*buttons.length+j]
            panel.add(buttons[i][j]);
            buttons[i][j].addActionListener(this);
        }
    }
    add(panel);
    pack();
    setVisible(true);
}

public void actionPerformed(ActionEvent e) {
    if (e.getSource() instanceof JButton) {
        JButton pressedButton = (JButton) e.getSource();
        if (pressedButton.getIcon() == null) {
            pressedButton.setIcon();
            // How will it take from array? another class?
        } else {
            pressedButton.setIcon(null);
        }
    }
}

我想做一个记忆游戏。当点击 2 张图片时,它们将显示给用户(起初它们都是空的)。但是在 ActionListener 中,我如何获取 button[i][j] ij 变量,因为我需要该索引来比较它们是否相同。我需要图像的位置来保存和比较 2 个图像。我想我需要访问 images[] 数组来进行比较,但是如何在 ActionListener 中使用?

4

1 回答 1

1

您的动作侦听器当前确定单击了哪个按钮。按钮本身绝对无法确定它们的索引。因此,您需要为按钮提供一种方法来识别它们在按钮数组中的位置。为此,我建议您通过添加以下行来扩展按钮类:

MemButton extends JButton {
    private int[] position = new int(2);

    getPosition(int index) {
        if (index >= position.length || index < 0) {
            return null;
        } else {
            return position[index];
        }
    }

    setPosition(int index, int value) {
        if (index >= position.length || index < 0) {
        } else {
            position[index] = value;
        }
    }

}

通过这样做,您可以告诉按钮它在哪里。单击按钮时,actionPerformed 将调用pressedButton.setIcon并执行计算以转换新的pressedButton.getPosition(0)pressedButton.getPosition(1)获取图像数组中的相应图像。请记住,您将使用 MemButton 作为类型(或您将其命名为其他任何名称)。

我相信您可以根据需要修改我的代码。此外,因为您正在扩展 JButton,所以 MemButton 与 JButton 完全一样,除了具有存储其位置的有用方法之外。我不希望将这样的解决方案拼凑在一起,特别是因为确保每个按钮都存储正确的位置会很痛苦(特别是如果您移动按钮很多或添加更多按钮)。尽管如此,对于较小的程序,此解决方案很好。对于更大的,我会尽量让游戏本身独立于输入(图像)和输出(按钮),这样你就可以重用代码,只需要写一点代码来调整到任何 GUI 或数据进行比较。

我希望这会有所帮助;)

PS您可能必须将new int(2)构造函数的内部移动为JButton. 为此,您将进行以下更改:

MemButton extends JButton {
    private int[] position;    

    MemButton() {
        super();
        position = new int(2);
    }
\\The rest of the example

您可能需要花点时间才能按照您想要的方式进行设置。请记住,当您设置阵列时,您需要告诉每个按钮它在哪里MemButton.setPosition(0, i); MemButton.setPosition(1, k);

如果您希望设置位置更简单,请修改代码。

于 2013-09-23T23:44:59.110 回答