-1

我已经查看了其他一些相同类型的问题并试图找到答案,但我无法看到问题所在,如果有人可以为我指出,那就太好了!

所以基本上我正在创建一个“记忆游戏”,在其中我必须为每张卡片设置一个默认背景图像,但是每次我再次运行它时这个图像都必须改变。此外,我必须使用前景图像(21 个)创建和排列列表,但我每场比赛只使用 8 个。每次我运行程序时,它们也必须更改。也就是说,到目前为止我得到的是:

public class GameBoard extends javax.swing.JPanel implements Runnable {

    private JLabel[] _Labels = new JLabel[8];
    private Card[] _Cards = new Card[16];

    public GameBoard(){

        setLayout(new GridLayout(4, 4));

        for(int i = 0; i<8; i=i+1){

            _Labels[i] = new JLabel();

        }

        for(int i = 0; i<16; i=i+2){

            _Cards[i] = new Card(_Labels[i]);
            _Cards[i+1] = new Card(_Labels[i]);

            add(_Cards[i].getLabel());
            add(_Cards[i+1].getLabel());

            _Labels[i].addMouseListener(new LabelListener(_Cards[i]));
            _Labels[i+1].addMouseListener(new LabelListener(_Cards[i+1]));

        }

    }

    @Override
    public void run() {


    }

}

卡类是:

public class Card{

    private JLabel _Label;

    ImageIcon imageOne;

    ImageIcon imageTwo;

    public Card(JLabel once){

        _Label = once;

 //-----------------------Foreground--------------------------------

        ArrayList<String> foregroundCard = new ArrayList<String>();       
        int i = 1;
        while(i < 23){
            if(i > 9){
                String addGreaterNine = "F" + i + ".png";
                foregroundCard.add(addGreaterNine);
            }
            else{
                String addLesserNine = "F0" + i +".png";
                foregroundCard.add(addLesserNine);
            }
            i = i + 1;
        }

        //-----------------Add 8---------------------

        int a = 0;

        while(a < 8){

            Collections.shuffle(foregroundCard); 

            ArrayList<String> stringsGoingToBeUsed = new ArrayList<String>();            
            stringsGoingToBeUsed.add(foregroundCard.get(0));
            stringsGoingToBeUsed.add(foregroundCard.get(0));

            for(int l = 0; l<16; l=l+1){

            Collections.shuffle(stringsGoingToBeUsed);  

            String frontName = "Images/" + stringsGoingToBeUsed.get(0);
            imageOne = new ImageIcon(frontName);

            }

            a = a + 1;

        }       


//------------------------Background--------------------------------        

        ArrayList<String> backgroundCard = new ArrayList<String>();
        backgroundCard.add("B01.png");
        backgroundCard.add("B02.png");
        backgroundCard.add("B03.png");
        Collections.shuffle(backgroundCard);
        String location = "Images/" + backgroundCard.get(0);
        imageTwo = new ImageIcon(location);

//-------------------------------------------------------------------        

        _Label.setIcon(imageTwo);   

    }
    public void TurnCard (){

        ImageIcon temp;
        temp = imageTwo;
        imageTwo = imageOne;
        imageOne = temp;
        _Label.setIcon(imageTwo);

    }

    public JLabel getLabel(){

        return _Label;

    }

}

LabelListener 类是:

public class LabelListener implements MouseListener {

    private Card _Card;

    public LabelListener(Card c){

        _Card = c;

    }

    @Override
    public void mouseClicked(MouseEvent arg0) {

        _Card.TurnCard();

    }

    @Override
    public void mouseEntered(MouseEvent arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mouseExited(MouseEvent arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mousePressed(MouseEvent arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mouseReleased(MouseEvent arg0) {
        // TODO Auto-generated method stub

    }

}

主要方法是:

public class Game {
    public static void main(String[] args) {

        JFrame main = new JFrame("Memory Game");
        main.add(new GameBoard());  

        main.pack();
        main.setVisible(true);
        main.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    }
}
4

3 回答 3

2

我怀疑这是因为它_Labels是一个包含 8 个元素的数组,但是您尝试在以下代码中最多引用 16 个元素:

for(int i = 0; i<16; i=i+2){
    ...
    _Labels[i+1].addMouseListener(new LabelListener(_Cards[i+1]));
    ...
于 2013-04-23T02:28:02.477 回答
0

由于产生. Card_ 您可以添加另一个索引来解决此问题:JLabelArrayIndexOutOfBoundsExceptionj

for (int i = 0, j = 0; i < 16; i += 2, j++) {

   _Cards[i] = new Card(_Labels[j]); // AIOOBE was happening here
   _Cards[i + 1] = new Card(_Labels[j]);

   add(_Cards[i].getLabel());
   add(_Cards[i + 1].getLabel());

   _Labels[j].addMouseListener(new LabelListener(_Cards[i]));

   // not necessary
   // _Labels[j + 1].addMouseListener(new LabelListener(_Cards[i + 1])); 
}

另外:使用 Java 命名约定来命名变量,例如cards代替_Cards.

于 2013-04-23T02:43:11.540 回答
0
for(int i = 0; i<16; i=i+2){

        _Cards[i] = new Card(_Labels[i]);
        _Cards[i+1] = new Card(_Labels[i]);

        add(_Cards[i].getLabel());
        add(_Cards[i+1].getLabel());

        _Labels[i].addMouseListener(new LabelListener(_Cards[i]));
        _Labels[i+1].addMouseListener(new LabelListener(_Cards[i+1]));

    }

不起作用,因为 _Labels 的大小仅为 8,可能的解决方案是将其拆分为单独的循环或更改程序架构。

于 2013-04-23T02:28:04.217 回答