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