Java匹配游戏

时间:2016-04-10 02:02:13

标签: java netbeans

我正在使用从JButton派生的类编写一个简单的GUI匹配游戏。我创建了一个按钮网格。我有一个Card类,其中包含卡片的颜色,并通过更改背景颜色“翻转”卡片。我在列表中创建了Card1和Card2,它们的背景颜色相互匹配。当我试图匹配我的卡时,以及当我试图延迟卡转回时,我很难过。选择了两张牌之后,有1秒钟的延迟,然后这些牌应该重新开始,但每当我添加该代码时,第二张牌永远不会显示它的颜色。我正在使用Netbeans作为IDE,如果它有所作为

这是我的Card.java

package mygui;

import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import javax.swing.JButton;


interface FlipListener
{
    void flipped(Card card);
}

public class Card extends JButton{
    private List<FlipListener> listeners = new ArrayList<FlipListener>();
    private Color backColor;
    public final Color originalColor;

    public void AddListener(FlipListener listener)
    {
        listeners.add(listener);
    }

    public Card(Color color)
    {
        originalColor = getBackground();
        backColor = color;
        //Click action Listener
        addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if(getBackground().equals(backColor))
                {
                    setBackground(originalColor);                    
                }
                else
                {
                    setBackground(backColor);

                }

                for(FlipListener flipListener: listeners)
                {
                    flipListener.flipped((Card)e.getSource()); 
                }
            }
        });
    }
}

这是我的FormMain.java

package mygui;

import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JButton;


public class FormMain extends javax.swing.JFrame{
    //Creates the form and adds the cards
    public FormMain()
    {
        setSize(1000, 750);

        myCards = new ArrayList<Card>();
        for(int i = 0; i < 18; i++)
        {
            Random r = new Random();
            Color color = new Color(r.nextInt(255), r.nextInt(255), r.nextInt(255));
            Card card1 = new Card(color);
            Card card2 = new Card(color);
            card1.setText("Card1");
            card2.setText("Card2");
            myCards.add(card1);
            myCards.add(card2);


            card1.AddListener((card)->{
                if(selectedCard1 == null)
                {
                    selectedCard1 = card;
                    selectedCard1.setText("Card 1 selectedCard1");
                }
                else if(selectedCard2 == null)
                {
                    selectedCard2 = card;
                    selectedCard2.setText("Card 1 selectedCard2");

                    //check for match with selectedCard1
                    if(selectedCard1.getBackground() == selectedCard2.getBackground())
                    {
                        selectedCard1.setText("Clicked SC1");
                        selectedCard2.setText("Clicked SC2");
                      Color black = new Color(0,0,0); 
                      card1.setBackground(black);
                      card2.setBackground(black);

                    }
//                    if(selectedCard1 == card1) //works only one way
//                        //I am selecting myself
//                    {
//                        Color black = new Color(0,0,0); 
//                      //card2.setBackground(black);
//                      card1.setBackground(black);
//                      
//                    }

                    try {
                        //delay for 1 sec
                        Thread.currentThread().sleep(1000);
                    } catch (InterruptedException ex) {
                        Logger.getLogger(FormMain.class.getName()).log(Level.SEVERE, null, ex);
                    }

                    //flip the cards back over

                    selectedCard1.setBackground(card1.originalColor);
                    selectedCard2.setBackground(card1.originalColor);
                        selectedCard1 = null;
                        selectedCard2 = null;

                }
            });

             card2.AddListener((card)->{
                if(selectedCard1 == null)
                {
                    selectedCard1 = card;
                    selectedCard1.setText("cArd 2 selected card 1");
                }
                else if(selectedCard2 == null)
                {
                    selectedCard2 = card;
                    selectedCard2.setText("Card 2 selected card 2");

                    //check for match with selectedCard1
                   if(selectedCard1.getBackground() == selectedCard2.getBackground())
                    {
                        Color black = new Color(0,0,0); 
                      card1.setBackground(black);
                      card2.setBackground(black);
                    }


                    try {
                        //delay for 1 sec
                        Thread.currentThread().sleep(1000);
                    } catch (InterruptedException ex) {
                        Logger.getLogger(FormMain.class.getName()).log(Level.SEVERE, null, ex);
                    }

                   // flip the cards back over
                    selectedCard1.setBackground(card2.originalColor);
                    selectedCard2.setBackground(card2.originalColor);
                        selectedCard1 = null;
                        selectedCard2 = null;
                }
            });

        }
        Collections.shuffle(myCards);
        for (Card card : myCards)
        {
            add(card);
        }


        GridLayout layout = new GridLayout(6,6);
        getContentPane().setLayout(layout);

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
    }

    public static void main(String[] args)
    {
        java.awt.EventQueue.invokeLater(new Runnable(){

            @Override
            public void run() {
                new FormMain().setVisible(true);
            }

        });





}

    private ArrayList<Card> myCards;
    Card selectedCard1;
    Card selectedCard2;

}

1 个答案:

答案 0 :(得分:1)

如果在UI /事件调度线程上调用sleep()(或执行其他需要很长时间的事情),则不会呈现任何内容。解决这个问题的方法是使用javax.swing.Timer

Timer t = new Timer(1000, new ActionListener() {
  public void actionPerformed(ActionEvent ae) {
    //restore the card's backgrounds here
  }
});
t.start();