Universität Paderborn - Home Universität Paderborn
Die Universität der Informationsgesellschaft

Grundlagen der Programmierung 2 SS 2005 - Datei Memory.java

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;


public class Memory extends JFrame
{
    // Konstruktor
    public Memory()
    {
        super("Memory");

        // Nur ein Listener-Objekt fuer alle Felder:
        MemoryListener memListener = new MemoryListener();

        Container content = this.getContentPane();
        content.setLayout(new BorderLayout());

        JPanel buttonPanel = new JPanel();
        buttonPanel.setLayout(new GridLayout(4, 4));

        // Buttons fuer die Felder erzeugen:
        for (int i = 0; i < 16; i++)
        {
            CharButton b = new CharButton(this.getCharacter());
            buttonPanel.add(b);
            b.addActionListener(memListener);
            b.cover();
        }

        // Elemente auf den ContentPane packen
        content.add(buttonPanel, BorderLayout.CENTER);

        // Fenster anzeigen
        setSize(300, 350);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setVisible(true);
    }

    // Die Beschriftungen der Felder:
    private String[] labels = { "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;

    // Zaehler fuer die bisher entdeckten Paare
    private int pairsFound = 0;

    // Konstruktor
    public MemoryListener()
    {
        super();
    }

    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;

                // Zaheler erhoehen
                pairsFound++;

                // Spiel beendet?
                if (pairsFound == 8)
                {
                    JOptionPane.showMessageDialog(null,
                            "You have completed the game!", "Memory",
                            JOptionPane.INFORMATION_MESSAGE);
                }
            }
            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: 20.05.2005