Java配对游戏

标签 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;

}

最佳答案

如果您在 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();

关于Java配对游戏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36524914/

相关文章:

css - 我如何摆脱 Netbeans 在我的预处理 CSS 上报告的这些错误?

java - 如何在JUNG的DirectedSparseGraph上使用getNeighbors函数?

java - 如何在不使用 HTML 标签的情况下制作漂亮的 jsp GUI?

java - 验证文本字符串是否与 java 中预先确定的格式相匹配

java - 如何知道 fragment 何时在 View 中

java - 更改Java中某种类型的所有对象的属性

java - 配置线程池用于调度任务及其取消

java - 将 ArrayList 的 LinkedList 指针转换为 String

Java 绘制仅在窗口(un?)聚焦时更新

Java - setVisible(true) 对 GUI 没有影响