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

Grundlagen der Programmierung 2 SS 2005 - Datei Memory_LSG.java

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JApplet;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.*;
import java.awt.*;

// Ein einfaches Memory-Spiel
// Autoren Falke, Kastens

public class Memory_LSG extends JApplet
{
   //Array fuer die Buttons
   CharButton [] buttons;     
   private int rows, columns, fields;
   public void init()
   { 
      // init()-Methode statt Konstruktor
      // Nur ein Listener-Objekt fuer alle Felder:
      MemoryListener memListener = new MemoryListener();
      rows = Integer.parseInt (getParameter ("rows"));
      columns = Integer.parseInt (getParameter ("columns"));
      fields = rows*columns;
      Container content = this.getContentPane();
      content.setLayout(new GridLayout(rows, columns));
      
      boolean isOdd = fields % 2 == 1;
      // letztes Feld löschen
      if (isOdd) fields--;      
      // Buttons fuer die Felder erzeugen:
      buttons = new CharButton [fields];
	  initLabels ();
        for (int i = 0; i < fields; i++)
        {
            buttons [i] = new CharButton (getCharacter ());
            content.add(buttons [i]); 
            buttons [i].addActionListener (memListener);
            buttons [i].cover();
        }
	
   }

    // Die Beschriftungen der Felder:
    private String[] labels;
    private int labelsLength;
    private void initLabels ()
    {
	int cnt = 0;
	labels = new String[fields];
	labelsLength = fields;
	for (int i = 0; i < fields; i+=2)
        {
	    labels [i] = labels [i+1] = (new Integer (cnt)).toString();
	    cnt++;
	}
    };

   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;
   }
}

// 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: 20.05.2005