# Programmieren eines Memorys mit Java (in Eclipse)



## aaronjacoby (10. Apr 2019)

Hallo Liebe Community
Ich habe in der Schule den Auftrag bekommen, ein Memory (aus 64 JButtons) mit Java zu programmieren. Als Programmierumgebung nutze ich Eclipse. Ich bin wie folgt vorgegangen: Um die 64 Buttons zu erstellen, habe ich ein Button-Array erstellt. Anschliessend habe ich ein Zahlen-Array vom Typ "int" mit 64 Felder erstellt, welches zweimal die Zahlen 1-32 in einer zufälligen Reihenfolge enthält. Danach habe ich die Zahlen dieses Arrays den zugehörigen Buttons mittels einer for-Schleife zugeordnet. Sobald ein Button angeklickt wird, zeigt er seine "Zahl" an und ändert die Farbe auf grün (für angewählt). Es läuft soweit gut, nun stehe ich aber vor einem Problem. Das Programm soll diese Aktion (Anwählen der Buttons) auf 2 Buttons beschränken. Anschliessend soll es prüfen, ob die Zahlen der beiden Buttons übereinstimmen. Wenn dies der Fall ist, soll es die beiden Buttons verschwinden lassen. Ich habe dabei an setVisible(false) gedacht. Wenn die Werte nicht übereinstimmen, sollen die Karten "zugedeckt" werden und das Ganze soll wieder von vorne anfangen. Ich kann mir gut vorstellen, dass es mit einer for-Schleife funktionieren könnte. Ich habe heute lange studiert und ausprobiert, aber nichts scheint richtig zu funktionieren. Ich wäre daher sehr dankbar, wenn mir jemand weiterhelfen könnte.

Zum besseren Verständnis habe ich unten noch mein Programmcode aufgeführt, damit ihr sehen könnt, wo ich bereits stehe.


```
package Umsetzung;

import javax.swing.*;
import java.awt.event.*;
import java.util.Random;
import java.awt.Color;

public class Window extends JFrame implements ActionListener {

    private JButton Start;// Variabeln deklarieren
    private JButton Exit;
    private JButton Reset;
    private JButton Card;
    final int Kartenanzahl = 64;
    JButton[] Spielkarten = new JButton[Kartenanzahl]; // Button-Array erstellen
    final int Zahlenanzahl = 64;
    int[] Werte = new int[Zahlenanzahl]; // Zahlenarray erstellen
    

    public Window() // Konstruktor
    {
        super("Memory");
        JPanel Feld = new JPanel();
        Feld.setLayout(null);
        Start = new JButton("Start Game");
        Start.setSize(110, 30);
        Start.setLocation(20, 600);
        Start.addActionListener(this);
        Feld.add(Start);
        Exit = new JButton("Exit Game");
        Exit.setSize(110, 30);
        Exit.setLocation(605, 600);
        Exit.addActionListener(this);
        Feld.add(Exit);
        Reset = new JButton("Reset Game");
        Reset.setSize(110, 30);
        Reset.setLocation(312, 600);
        Reset.addActionListener(this);
        Feld.add(Reset);
        setContentPane(Feld); // Eigenschaften der Buttons definieren

        for (int i = 0; i < 32; i++) {
            Werte[i] = i + 1;
        }
        for (int f = 32; f < 64; f++) {
            Werte[f] = f - 31; // Zahlenarray mit Zahlen von 1-32 füllen, dabei kommt jede Zahl 2 mal vor
        }

        Random Zahlengenerator = new Random();
        for (int p = 0; p < Werte.length; p++) {
            int randomPosition = Zahlengenerator.nextInt(Werte.length);
            int temp = Werte[p];
            Werte[p] = Werte[randomPosition];
            Werte[randomPosition] = temp; // Mischen der Zahlen innerhalb des Zahlenarrays
        }

        for (int a = 0; a < 64; a++) {
            Spielkarten[a] = new JButton();
            Spielkarten[a].setSize(50, 50); // Eigenschaften der Spielkarten definieren
            Spielkarten[a].setLocation((a % 8 * 78) + 68, (((int) a / 8) * 68) + 40);
            Spielkarten[a].setActionCommand("klick");
            Spielkarten[a].addActionListener(this);
            Spielkarten[a].setBackground(Color.YELLOW);
            Feld.add(Spielkarten[a]);
            Spielkarten[a].setEnabled(false);
        }

    }

    public void actionPerformed(ActionEvent Aktion) {

        Object Source = Aktion.getSource();

        if (Source == Exit) {
            System.out.println("Sie haben das Spiel verlassen");
            System.exit(0);
        } // Spiel beenden

        for (int b = 0; b < 64; b++) {
            if (Source == Start) {
                Spielkarten[b].setEnabled(true);
            } // Spiel starten
        }
        if (Source == Start) {
            System.out.println("Sie haben ein Spiel gestartet");
        }

        if (Source == Reset) {
            System.out.println("Sie haben das Spiel zurückgesetzt");
            dispose();
            Window ResetFenster = new Window();
            ResetFenster.setSize(750, 680);
            ResetFenster.setLocationRelativeTo(null);
            ResetFenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            ResetFenster.setVisible(true);
        } // Spiel zurücksetzen

        for (int c = 0; c < 64; c++)
            for (int d = 0; d < 64; d++) {
                
            if (Source == Spielkarten[c]) {
                Spielkarten[c].setText("" + Werte[c]);
            }
            if (Source == Spielkarten[c]) {
                Spielkarten[c].setBackground(Color.GREEN);
            } // Beim Klick auf den Button die Farbe wechseln

            
            
            }
        
    }

    public static void main(String[] args) {

        Window Fenster = new Window();
        Fenster.setSize(750, 680);
        Fenster.setLocationRelativeTo(null);
        Fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Fenster.setVisible(true); // Eigenschaften des Fensters definieren
    }

}
```


Liebe Grüsse Aaron


----------



## M.L. (10. Apr 2019)

Auf die Schnelle: es sollte eine Zählervariable deklariert und verwendet werden für die Anzahl der geklickten gelben Felder. Bei genau zwei Klicks (bei gelben Feldern) UND einem Treffer die setEnabled-Eigenschaft der grünen Felder geeignet setzen. Ansonsten wieder zurück auf gelb. Und Meldungen in einem GUI-Programm sollte man nicht auf der Konsole ausgeben


----------



## aaronjacoby (10. Apr 2019)

M.L. hat gesagt.:


> Auf die Schnelle: es sollte eine Zählervariable deklariert und verwendet werden für die Anzahl der geklickten gelben Felder. Bei genau zwei Klicks (bei gelben Feldern) UND einem Treffer die setEnabled-Eigenschaft der grünen Felder geeignet setzen. Ansonsten wieder zurück auf gelb. Und Meldungen in einem GUI-Programm sollte man nicht auf der Konsole ausgeben


Danke für deine Antwort! Ich werde versuchen, deine Tipps umzusetzen.


----------



## MoxxiManagarm (11. Apr 2019)

Bitte halte dich außerdem an die Java Namenskonventionen und benenne deine Variablen in lowerCamelCase. Außerdem hast du sowohl englische als auch deutsche Benennungen, bitte versuche das zu vereinheitlichen.


```
Spielkarten[a].setLocation((a % 8 * 78) + 68, (((int) a / 8) * 68) + 40);
```
Nutze doch einfach einen geeigneted LayoutManager anstatt sowas x.x

Du wirst außerdem noch einen Timer brauchen der nichts anderes tut als die Buttons eine definierte Zeit nach der 2. Auswahl offenzuhalten.


----------



## mihe7 (11. Apr 2019)

MoxxiManagarm hat gesagt.:


> Du wirst außerdem noch einen Timer brauchen der nichts anderes tut als die Buttons eine definierte Zeit nach der 2. Auswahl offenzuhalten.


Könnte man auch beim nächsten Klick zurücksetzen.



MoxxiManagarm hat gesagt.:


> Nutze doch einfach einen geeigneted LayoutManager anstatt sowas x.x


@aaronjacoby Hier böte sich das GridLayout an.


----------



## MoxxiManagarm (11. Apr 2019)

Noch ein Tipp von mir: Die ActionListener sind zwar immer Geschmacksache, aber ich rate dir von einem solchen komplexen (viele Kontrollstrukturen) Listener ab. Stattdessen rate ich zu einer anonymen Klasse


```
start.addActionListener(new ActionListener() {
  @Override
  public void actionPerformed(ActionEvent actionEvent) {
    // do whatever clicking on start should do
  }
});
```

Oder verkürzt mit Java 8+

```
start.addActionListener(actionEvent -> {
  // do whatever clicking on start should do
});
```


----------

