Grundlagen der Programmierung 2 SS 2005 - Datei Memory.java
import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JComponent; import java.awt.Color; import java.awt.Container; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; // Ein einfaches Memory-Spiel // Autoren Falke, Kastens, Thies public class Memory extends JFrame { public Memory() { // Konstruktor super("Memory"); // Nur ein Listener-Objekt fuer alle Felder: MemoryListener memListener = new MemoryListener(); Container content = this.getContentPane(); content.setLayout(new GridLayout(4, 4)); // Buttons fuer die Felder erzeugen: for (int i = 0; i < 16; i++) { CharButton b = new CharButton(this.getCharacter()); content.add(b); b.addActionListener(memListener); b.cover(); } setSize(300, 330); setDefaultCloseOperation(EXIT_ON_CLOSE); setVisible(true); } // Die Beschriftungen der Felder: private String[] labels = new String[] { "A", "B", "C", "D", "E", "F", "G", "H", "A", "B", "C", "D", "E", "F", "G", "H" }; private int labelsLength = labels.length; private String getCharacter() { // Waehlt einen Label zufaellig aus dem Array // und entfernt ihn daraus. int pos = (int) (Math.random() * 100) % labelsLength; String c = labels[pos]; // Luecke im Array schliessen: for (int i = pos + 1; i < labelsLength; i++) { labels[i - 1] = labels[i]; } labelsLength--; return c; } public static void main(String[] args) throws Exception { Memory m = new Memory(); } } // separate Klasse fuer den Listener: class MemoryListener implements ActionListener { // Die bisher aufgedeckten Felder: private CharButton firstSelection = null; private CharButton secondSelection = null; public void actionPerformed(ActionEvent e) { // Das gerade gewaehlte Feld: CharButton flipped = (CharButton) e.getSource(); // Drei Zustaende: // kein, ein, zwei Feld(er) ist/sind aufgedeckt: if (firstSelection == null) { // kein Feld - nun das erste: firstSelection = flipped; flipped.setEnabled(false); flipped.uncover(); } else if (secondSelection == null) { // ein Feld - nun das zweite: flipped.setEnabled(false); flipped.uncover(); secondSelection = flipped; if (firstSelection.getChar().equals(secondSelection.getChar())) { // Die Marken sind gleich: firstSelection.setBackground(Color.BLACK); secondSelection.setBackground(Color.BLACK); // Neue Wahl vorbereiten: firstSelection = null; secondSelection = null; } else { // Die Marken sind verschieden // Sie bleiben aufgedeckt bis zur naechsten Wahl } } else { // Nach einem Fehlversuch wurde drittes Feld aufgedeckt: flipped.setEnabled(false); flipped.uncover(); firstSelection.cover(); firstSelection.setEnabled(true); firstSelection = flipped; secondSelection.cover(); secondSelection.setEnabled(true); secondSelection = null; } } } // Hilfsklasse: Button-Unterklasse mit verdeckbarer Beschriftung: class CharButton extends JButton { private String myLabel; CharButton(String lab) { super(lab); myLabel = lab; } void uncover() { setText(myLabel); } void cover() { setText("?"); } String getChar() { return myLabel; } }
Generiert mit Camelot | Probleme mit Camelot? | Geändert am: 13.05.2005