# memory spiel



## pinar (14. Jan 2013)

hallo leute,
ich muss ein memory spiel programmieren, aber komme nicht weiter. ich habe es geschafft, dass ich 8 karten habe und wenn ich draufklicke "dreht" sich die karte auch (es ändert vorerst nur die farbe) nur brauche ich 8*2 Karten. wie kriege ich es hin dass die karten doppelt werden und wenn ihr meinen code sieht merkt ihr dass es irgendwie zu lang ist gibt es für die buttons eine bessere lösung??? wäre für jede hilfe dankbar...

```
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;


public class feld extends JFrame {
	
JPanel panel;
JButton button, button1, button2, button3, button4, button5, button6, button7, button8;

JMenuBar menubar;
//Spiel
JMenu spiel;
JMenuItem newgame, score, close ;
//Einstellungen
JMenu einstellungen;
JMenuItem info;
//Fragezeichen
JMenu fragez;
JMenuItem mitwir;


	
Klick klick = new Klick();
	

	
	public feld() {
		
		super("Memory");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setSize(700, 550);
		//Menüleiste erzeugen
		menubar = new JMenuBar();
		
		//Menüelemente erzeugen
		spiel = new JMenu("Spiel");
		einstellungen = new JMenu("Einstellungen");
		fragez = new JMenu("?");
		
		//Untermenüelemente erzeugen
		newgame = new JMenuItem("Neues Spiel");
		score = new JMenuItem("Highscore");
		close = new JMenuItem("Beenden");
		
		info = new JMenuItem("Info");
		mitwir = new JMenuItem("Mitwirkende");
		
		//Menüelemente hinzufügen
		menubar.add(spiel);
		menubar.add(einstellungen);
		menubar.add(fragez);
		
		//Untermenüelemente hinzufügen 
		spiel.add(newgame);
		spiel.add(score);
		spiel.add(close);
		einstellungen.add(info);
		fragez.add(mitwir);
		setJMenuBar(menubar);
		
				
		
		panel = new JPanel();
		panel.setBackground(Color.white);
		panel.setLayout(new GridLayout(4, 4, 10, 10));
		
		//bei 32 karten wäre dieser codeblock nicht die beste idee :/
		button = new JButton();
		button.setBackground(Color.black);
		panel.add(button);
		button.addActionListener(klick);
		
		button1 = new JButton();
		button1.setBackground(Color.black);
		panel.add(button1);
		button1.addActionListener(klick);
		
		button2 = new JButton();
		button2.setBackground(Color.black);
		panel.add(button2);
		button2.addActionListener(klick);
		
		button3 = new JButton();
		button3.setBackground(Color.black);
		panel.add(button3);
		button3.addActionListener(klick);
		
		button4 = new JButton();
		button4.setBackground(Color.black);
		panel.add(button4);
		button4.addActionListener(klick);
		
		button5 = new JButton();
		button5.setBackground(Color.black);
		panel.add(button5);
		button5.addActionListener(klick);
		
		button6 = new JButton();
		button6.setBackground(Color.black);
		panel.add(button6);
		button6.addActionListener(klick);
		
		button7 = new JButton();
		button7.setBackground(Color.black);
		panel.add(button7);
		button7.addActionListener(klick);
		
		button8 = new JButton();
		button8.setBackground(Color.black);
		panel.add(button8);
		button8.addActionListener(klick);
	
		
		add(panel);
		
		
		setVisible(true);
	}
	
	
	
public class Klick implements ActionListener {

public void actionPerformed(ActionEvent e) {
	Object obj = e.getSource();
	
		if (obj == button){ button.setBackground(Color.orange);}
		if (obj == button1){button1.setBackground(Color.red);}
		if (obj == button2){button2.setBackground(Color.blue);}
		if (obj == button3){button3.setBackground(Color.gray);}
		if (obj == button4){button4.setBackground(Color.green);}
		if (obj == button5){button5.setBackground(Color.cyan);}
		if (obj == button6){button6.setBackground(Color.YELLOW);}
		if (obj == button7){button7.setBackground(Color.pink);}
		if (obj == button8){button8.setBackground(Color.magenta);}
		}
	}


}]
```


----------



## Gast2 (14. Jan 2013)

Wenn es doppelt soviele Button werden sollen, dann führst du noch button9 bis button16 ein und erstellst die genauso wie die vorherigen buttons... oder... du lässt dir was schlaueres einfallen 

Als erstes sollte man buttons in einer Schleife (und/oder Methode) erstellen, damit man sich den ganzen Code spart. Außerdem solltest du drüber nachdenken ein Model einzuführen, dass das Spiel verwaltet. Das Model würde z.b. alle Karten beinhalten und sich darum kümmern was passiert wenn Karten aufgedeckt wurden.


----------



## pinar (14. Jan 2013)

naja ich hab gehofft dass man mir hier helft einen besseren code zu finden 
danke für deine tipps aber ehrlich gesagt kann ich damit nichts anfangen bin wirklich noch ein anfänger ich hab vieles schon ausprobiert aber bis auf das was ich im moment habe, habe ich nichts gescheidenes hinbekommen


----------



## Timothy Truckle (14. Jan 2013)

pinar hat gesagt.:


> hallo leute,
> ich muss ein memory spiel programmieren, aber komme nicht weiter. ich habe es geschafft, dass ich 8 karten habe und wenn ich draufklicke "dreht" sich die karte auch (es ändert vorerst nur die farbe) nur brauche ich 8*2 Karten. wie kriege ich es hin dass die karten doppelt werden


Wie wäre es mit doppelt so vielen Buttons?


pinar hat gesagt.:


> und wenn ihr meinen code sieht merkt ihr dass es irgendwie zu lang ist gibt es für die buttons eine bessere lösung??? wäre für jede hilfe dankbar...


Also dieses kleine Spiel eignet sich super für den Einstieg in das MVC-Pattern:
Zuerst definiert Du ein Modell: Eine Liste aus 
	
	
	
	





```
Paar
```
-Objekten. So ein Paar-Objekt hält immer 2 
	
	
	
	





```
boolean
```
-Werte und eine Liste von 
	
	
	
	





```
MatchListener
```
-Objekten, an die ein 
	
	
	
	





```
MatchEvent
```
 erhalten, wenn der zweite boolean auf true gesetzt wurde (dass sind z.B. die beiden Buttons, die sich dann deaktivieren und das Spiel, um das Spielende zu ermitteln, [JAPI]Observable[/JAPI] kann uns dabei helfen...).
Dann Erzeugen wir eine eigene Ableitung von [JAPI]AbstractAction[/JAPI]. Die bekommt 3 Konstruktor-Parameter: "Ihr" Paar-Objekt, welcher boolean darin "ihrer" ist und auf welche Farbe der Button zu setzen ist. Immer 2 AbstractActionImplementierungen bekommen natürlich das selbe Paar aus dem Modell.

Jetzt müssen die AbstractActionImplementierungen nur noch zufällig auf die Buttons verteilt werden.

Also alles ganz easy... ;o)

bye
TT


----------



## pinar (14. Jan 2013)

```
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;

import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;


public class feld extends JFrame {
	
JPanel panel;
JButton button;

JMenuBar menubar;
//Spiel
JMenu spiel;
JMenuItem newgame, score, close ;
//Einstellungen
JMenu einstellungen;
JMenuItem info;
//Fragezeichen
JMenu fragez;
JMenuItem mitwir;

	
Icon icon1 = new ImageIcon(getClass().getResource("asd.jpg"));
Icon icon2 = new ImageIcon(getClass().getResource("asd1.jpg"));

	
Klick klick = new Klick();
	

	
	public feld() {
		
		super("Memory");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setSize(700, 550);
		//Menüleiste erzeugen
		menubar = new JMenuBar();
		
		//Menüelemente erzeugen
		spiel = new JMenu("Spiel");
		einstellungen = new JMenu("Einstellungen");
		fragez = new JMenu("?");
		
		//Untermenüelemente erzeugen
		newgame = new JMenuItem("Neues Spiel");
		score = new JMenuItem("Highscore");
		close = new JMenuItem("Beenden");
		
		info = new JMenuItem("Info");
		mitwir = new JMenuItem("Mitwirkende");
		
		//Menüelemente hinzufügen
		menubar.add(spiel);
		menubar.add(einstellungen);
		menubar.add(fragez);
		
		//Untermenüelemente hinzufügen 
		spiel.add(newgame);
		spiel.add(score);
		spiel.add(close);
		einstellungen.add(info);
		fragez.add(mitwir);
		setJMenuBar(menubar);
		
				
		
		panel = new JPanel();
		panel.setBackground(Color.white);
		panel.setLayout(new GridLayout(4, 4, 10, 10));
		
		List<JButton> liste = new LinkedList<JButton>();
		 for ( int i=1; i <=16; i++) {
			JButton button = new JButton("Button " + i);
			liste.add(button);
			button.addActionListener(klick);
			panel.add(button);
		 }
		 
		
		 		
		add(panel);
		
		
		setVisible(true);
	}
	
	
	
public class Klick implements ActionListener {

public void actionPerformed(ActionEvent e) {
	Object obj = e.getSource();
		List<JButton> list = new LinkedList<JButton>();
		for(JButton button1 : list){
			if(obj == button1){
				button.setBackground(Color.CYAN);

		}
	
	}
}

}
}
```

hab den code noch mal bearbeitet aber es macht trotzdem nicht das was ich wil wo ist mein fehler o bitte hilft mir doch ???:L???:L???:L


----------



## Timothy Truckle (14. Jan 2013)

pinar hat gesagt.:


> ```
> button.addActionListener(klick);
> ```


Hier sollte 
	
	
	
	





```
button.addActionListener(new Klick(/*patameter*/));
```
stehen. Parameter sollte mindestens die Farbe sein, die nach dem Klick erscheinen soll.

Wenn Du die erste Änderung gemacht hast kann der AL nur von einem einzigen Button aktiviert worden sein. Man muss also nicht mehr nach dem Schuldigen suchen:
	
	
	
	





```
private final Color color; // vom Konstruktor zu setzen
public void actionPerformed(ActionEvent e) {
 Button button = (Button)e.getSource(); 
     if(color.equals( button.getBackground()) { // wir wollen ja auch zurück wechseln können
       button.setBackground(color); 
     } else {
       button.setBackground(new JLabel().getBackground()); // nicht elegant aber wirkungsvoll
     }
 } 
}
```
Feddisch (wie mir Hesse sogn)
So kann dein Memory die Farben der Buttons wechseln. Allerdings steckt da noch gar keine Logik drin. Es ist weder sichergestellt, dass nur 2 Felder aufgedeckt werden noch, dass die Felder von allein wieder zugedeckt werden.

bye
TT


----------



## pinar (15. Jan 2013)

ich danke dir für deine antwort...
ja die logik für das spiel wollte ich nicht aufbauen, aber da ich nicht mal hinbekam dass die einzelnen buttons beim anklicken etwas tun, kam ich noch nicht zu dem restlichen... vlt komme ich jetzt dank dir schnelle voran :idea:


----------



## Timothy Truckle (15. Jan 2013)

pinar hat gesagt.:


> ich danke dir für deine antwort...
> ja die logik für das spiel wollte ich nicht aufbauen, aber da ich nicht mal hinbekam dass die einzelnen buttons beim anklicken etwas tun, kam ich noch nicht zu dem restlichen... vlt komme ich jetzt dank dir schnelle voran :idea:


Ich sehe gerade, dass in meinem if ein Ausrufezeichen fehlt...[JAVA=4]if(!color.equals( button.getBackground()) {[/code]

bye
TT


----------



## Spacerat (15. Jan 2013)

Hmm... Memory...
1. Du brauchst eine Liste oder ein Array mit verschiedenen Karten bzw. Farben oder andere Objekte, z.B. Strings (statisch).
2. Du brauchst ein "Hintergrund-Objekt" des Typs welchen du in der Liste verwendet hast. (statisch, Name: DEFAULT);
3. Nun erstellst du von der statischen Liste eine Kopie, fügst den Inhalt der Liste noch ein zweites mal ein und mischt sie mittels "Collections.shuffle()".
4. Nun erstellst du eine Map<Button, Karte> (Name: cards), erstellst zu jeder Karte einen Button, welchem du folgenden ActionListener anhängst (Achtung! Beispiel mit Strings und JButton!) und mittels "put" der Map hinzufügst (und natürlich dem Panel addest ).

```
class GlobalActionListener implements ActionListener {
  private JButton first;
 
  public void actionPerformed(ActionEvent e) {
    JButton b = (JButton) e.getSource();
    String s = cards.get(b);
    if(first != null) {
      if(first.getText().equals(s) {
        b.setText(s);
        b.setEnabled(false);
      } else {
        first.setText(DEFAULT);
        first.setEnabled(true);
      }
      first = null;
    } else {
      b.setText(s);
      b.setEnabled(false)
      first = b;
    }
    revalidate();
    repaint();
  }
}
```


----------



## pinar (15. Jan 2013)

danke spacerat für deine antwort und hilfe...
und allen anderen danke ich natürlich auch...
ich hab in den büchern nachgelesen und viel gegooglet und sonst eigentlich alles mögliche getan aber langsam begreif ich, dass das nichts wird. ich komme einfach nicht weiter und merke dass ich viele befehle noch nicht beherrsche und somit auch die logik nicht programmieren kann...
ich muss leider einen fehlversuch für die prüfung in kauf nehmen :/
und wer weiss vlt bin ich nächstes jahr dann so fit dass ich hier selber anderen helfen kann


----------



## homer65 (15. Jan 2013)

Auf der MyOggRadio Webseite gibt es im Download Bereich ein Open Source Memory Spiel (jgspiel).
Der Quellcode ist im .jar enthalten - einfach entpacken.
Vielleicht wirst du davon inspiriert.


----------

