Ich schreibe ein einfaches GUI-Matching-Spiel mit Klassen, die von JButton abgeleitet sind. Ich habe ein Raster von Schaltflächen erstellt. Ich habe eine Kartenklasse, die die Farbe der Karte enthält und die Karte "umdreht", indem sie die Hintergrundfarbe ändert. Ich habe Card1 und Card2 in einer Liste erstellt, die in ihrer Hintergrundfarbe übereinstimmen. Ich habe eine harte Zeit, wenn ich versuche, meine Karte abzugleichen und auch wenn ich versuche, die Karten vom Zurückdrehen abzuhalten. Nachdem zwei Karten ausgewählt worden sind, gibt es eine Verzögerung von 1 Sekunde und dann sollen die Karten wieder zurückgehen, aber wenn ich diesen Code hinzufüge, zeigt die zweite Karte niemals die Farbe an. Ich benutze Netbeans wie IDE, ob das einen UnterschiedJava Matching Spiel
Hier macht, ist mein 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());
}
}
});
}
}
Hier ist meine 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;
}
Ich erhalte eine NullPointerException, wenn ich diesen Code verwende. –