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

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