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
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: 29.04.2005


