# MemorySpiel



## ayou (1. Aug 2009)

Hej leutz,

ich programmiere in einer Java -GUI in Netbeans an einem Memory. Ich bekomme es leider nicht hin, dass meine Spielkarten in meinem GridLayout angezeigt werden. 
Die Spielkarten befinden sich in einen angelegten Ordner. Diese möchte ich per Zufall (Array) aufrufen, damit sie auf meiner Oberfläche angezeigt werden nach eine Karte aufgedeckt wurde.
Ich habe die Bilder per getResource gespeichert, ihnen einen Namen zugewiesen und möchte diese per Zufall aus dem Array auslesen. 

Ich wäre euch für eine Hilfestellung sehr dankbar, bastle wirklich schon ewig, dass es endlich läuft



```
package memoryspiel;

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

public class Memory extends javax.swing.JFrame {


    private static Memory Memory;
    private ImageIcon bild1 = new javax.swing.ImageIcon(getClass().getResource("/kartenbilder/bild1.png"));
    private ImageIcon bild2 = new javax.swing.ImageIcon(getClass().getResource("/kartenbilder/bild2.png"));
    private ImageIcon bild3 = new javax.swing.ImageIcon(getClass().getResource("/kartenbilder/bild3.png"));
   

    /** Creates new form Memory */
    /* Konstruktor für Spielfeld-Objekte */
    public Memory() {
        /* Zunächst wird im JFrame nur ein leeres Panel mit GridLayout angelegt */
        /* initComponents() wird von NetBeans generiert und kann nicht geändert werden */
        initComponents();
        /* Die folgende Methode wird das Spielfeld füllen*/
        buildSpielkarten();
    }

                                            

    /* Methode zum Anlegen von Feldern und zum Befüllen des Spielfelds */
    public void buildSpielkarten() {
        // Die folgende Methode wird das Spielfeld füllen
         /* Das Spielbrett wird zeilenweise mit Feldern (JLabel-Objekten) befüllt */
        for (int zeile = 0; zeile < 4; zeile++) {
            /* Spalte für Spalte setzen wir nun die Felder */
            for (int spalte = 0; spalte < 4; spalte++) {
                /* Neues JLabel-Objekt erzeugen und auf opaque setzen */
                JLabel jKarte = new JLabel(this.getCharacter());
                jKarte.setIcon(bildKarteRückseite);
                jKarte.setOpaque(true);
                /* Jede Karte bekommt einen eigenen "Listener" für die Event-
                Behandlung zugeordnet */
                jKarte.addMouseListener(new java.awt.event.MouseAdapter() {

                    public void mouseClicked(java.awt.event.MouseEvent evt) {
                        KarteAngeklickt(evt);
                    }
                });
                /* Die Karte auf das Panel bringen */
                spielfeld.add(jKarte);
                /* die Karte im Array merken */
                jKarten[zeile][spalte] = jKarte;
            }
        }
    }

    /* Einfügen der Bilder, die oben angesprochen wurden */
    private ImageIcon[] labels = {bild1, bild2, bild3, bild4, bild5, bild6, bild7, bild8};

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].toString();

        // 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();
    }

    // Zähler für die entdeckten Paare */
    private int paarKarten = 0;

    /* Ereignisbehandlungsmethode für angeklickte Karten auf dem Spielfeld - auf Eingabe warten */
    private void KarteAngeklickt(MouseEvent evt) {
        /* Durch Befragen des Events herausfinden, welche Karte angeklickt wurde */
        JLabel aufgedeckteKarte = (JLabel) (evt.getSource());
        /* Die Karte nach seinem Bild fragen */
        /* getIcon(): liefert den Icon dieser Registerkarte oder null wenn keiner gesetzt ist */
        Icon aktiveKarte = aufgedeckteKarte.getIcon();
        Icon String = null;
        /* Erste Karte aufdecken */
        if (ersteKarte == null) {
            /* In diesem Fall gibt es derzeit keine aktive Karte, also wird
            die angeklickte Karte aktiv */
            // kein Feld - nun das erste:
            aufgedeckteKarte.setIcon(String);
            ersteKarte = aktiveKarte;
        } /* else-Zweig: es gibt also bereits eine aktive Karte. Wir decken noch
        eine zweite Karte auf */
        else if (zweiteKarte == null) {
            // ein Feld - nun das zweite:
//            aufgedeckteKarte.setEnabled(false);
//            aufgedeckteKarte.uncover();
            zweiteKarte = aktiveKarte;
            aufgedeckteKarte.setIcon(String);

            /* Vergleich der beiden Karten */
            /* equals(Object): beide Objekte repräsentieren denselben Inhalt, sie sind aber nicht am selben Ort */
            // Hier muss man sicherstellen, dass das Objekt, auf welchem die Methode equals aufgerufen werden soll, nicht null ist.
            if (ersteKarte.equals(zweiteKarte)) {
                /* Die Karten sind gleich */
                System.out.println("Jawohl!");
                ersteKarte = aktiveKarte;
                zweiteKarte = aktiveKarte;
                aufgedeckteKarte.setIcon(String);

                /* Neue Auswahl vorbereiten */
                ersteKarte = null;
                zweiteKarte = null;

                /* Zähler erhöhen */
                paarKarten++;

                /* Prüfung, ob bereits alle Kartenpaare gefunden wurden */
                if (paarKarten == 8) {
                    JOptionPane.showMessageDialog(null,
                            "Geschafft! Spiel beendet.", "MemorySpiel",
                            JOptionPane.INFORMATION_MESSAGE);
                }
            } else {
                /* Die Karten sind verschieden, sie bleiben aufgedeckt bis zur nächsten Wahl */
                System.out.println("Knapp daneben...");
            }
        } else {
            ersteKarte = aktiveKarte;
            zweiteKarte = null;
        }
    }

    public static void main() {
        java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {
                new Memory().setVisible(true);
            }
        });
    }
    /* Spielfeld aus 4 Reihen mit je 4 Karten */
    private JLabel[][] jKarten = new JLabel[4][4];

    /* Icons für das Kartensymbol des Spiels */
    private ImageIcon bildKarteRückseite = new ImageIcon(getClass().getResource("/kartenbilder/karte_back.png"));

    /* Variablen zum Merken der aktiven (=zuletzt angeklickten) Karte und dessen Icon */
    private Icon ersteKarte = null;
    private Icon zweiteKarte = null;                  
    private javax.swing.JPanel spielfeld;                
}
```


----------



## Marco13 (1. Aug 2009)

Sagst du auch was die Frage ist, oder erwartest du, dass sich das irgendjeman auf einen Stand bringt, bei dem man es compilieren kann?


----------



## ayou (1. Aug 2009)

ich habe extra gleich den ganzen code gepostet, nicht damit es jemand compiliert, sondern besser nachvollzogen werden kann, was ich vorhabe. mein frage: Warum werden meine "importierten" bilder (per getRessorce) die ich zufällig über ein array abfrage (zeile 54) nicht auf meinen angelegen gridlayout (zeile 31) angezeigt? ich habe dieses zeilen und spaltenweise aufgebaut. ich erwarte mir einfach einen tipp, wo mein denkfehler liegt, um zu einer lösung zu gelangen

gruß


----------



## Marco13 (2. Aug 2009)

???:L Es ging gerade darum, dass es eben NICHT compilierbar ist, und das ist halt blöd zum nachvollziehen.

Bis man sowas wie

```
Icon String = null;
...
            aufgedeckteKarte.setIcon(String);
```
als MÖGLICHE Ursache aus dem Code rausgefiltert hat, dauert's u.U, und das kann lästig sein.


----------

