# Memory



## Lumix (4. Mai 2010)

Hey Leute,

wie die Überschrift schon sagt, programmiere ich z.Zt ein Memory-Spiel

Also ich bin nicht gerade ein Java-Profi:noe:

...so weit bin ich bis jetzt gekommen:


```
import java.applet.*; import java.awt.*; import java.awt.event.*;
public class Memory extends Applet implements ActionListener {

    Button b[] = new Button [20];
    Panel bereich1 = new Panel();
    Panel bereich2 = new Panel();
    Button start1 = new Button("Spiel starten!");

         public void init() {
           add(bereich2);
           add(bereich1);
           bereich2.add(start1);
           start1.addActionListener(this);
           bereich1.setLayout(new GridLayout(5,4,4,4));
           bereich1.setBackground(Color.red);

             for (int i=0; i<20; i=i+1){
               b[i] = new Button ("           ");
               b[i].setBackground(Color.yellow);
               bereich1.add(b[i]);
               b[i].addActionListener(this);
               
             }
         }
      public void actionPerformed(ActionEvent e){

      Object o = e.getSource();
      for(int i = 0; i<20; i++){
        if (o.equals(b[i])){
          b[i].setBackground(Color.white);
          zeitschleife();
          b[i].setBackground(Color.yellow);
        }
      }
      if (o.equals(start1)) stellen();
      }

    void zeitschleife(){
      try{Thread.sleep(1000);}
      catch(InterruptedException e){return;}

      }
      public void stellen () {
        int n=0; int merke;
        while (n<20) {

        merke=0;
        double z = Math.random ();
        int z10= (int) (z*10);
        b[n].setLabel("" + z10);
        for (int j = 0; j<n;j++) {
          if (b[n].getLabel().equals(b[j].getLabel()))
          merke = merke + 1;
        }
        if (merke < 2)
        n = n +1;
        }
      }
    }
```

Nun will ich noch, dass nur 2 Karten geklickt werden können, die erste die geklickt wurde soll so lange aufbleiben bis die zweite geklickt wurde und beide sollen dann nach 1 Sekunde wieder zugehen(Zeitschleife bereits eingefügt) Wenn ein Paar geklickt wurde sollen sie verschwinden.

Joa und das wichtigste fehlt auch noch, das Programm soll kontrollieren ob die Karten ein Paar sind oder nicht. (Habe jeder Karte schon eine Nummer gegeben)

Wäre echt sehr nett wenn mir jmd. zeigen kann wie ich das alles hinbekomme 

Danke im Voraus


----------



## Lumix (5. Mai 2010)

Achso, ich hatte noch vergessen, dass so ein VersuchezÃ¤hler vielleicht ganz praktisch wÃ¤re. Da kÃ¶nnte man ja immer wenn der Zwischenspeicher gelÃ¶scht wird einen ZÃ¤hler hochstellen, aber wie mach ich das?


----------



## eRaaaa (5. Mai 2010)

Hi,

vllt erst einmal einige Kleinigkeiten:

- Wieso benutzt du setLabel? Es macht doch gar keinen Sinn den Spieler die Zahlen zu zeigen, dann kann ers ja direkt lösen  Ein Vorschlag wäre anstelle setLabel vllt setActionCommand die Zahl zu verpassen, das hätte a) den Vorteil dass der Spieler die Zahlen nicht zu Gesicht bekommt und b) könntest du in der actionPerformed mit e.getActionCommand indirekt abfragen welcher Button gedrückt wurde und brauchst so auch nicht alle durchlaufen und vergleichen (das war eig. eh unnötig  )

- Die Zeitschleife würde ich auch rausmachen, a) sollten Aktrionen auf dem EDT schnell ausgeführt werden, b) bringt das sleep gar nichts, da du in der Zeit nichts machen kannst ..benutze evtl. Timer.

- Dann musst du dir natürlich auch irgendwie immer die aktuelle/vorherige Karte merken um sie dann vergleichen zu können!

so in etwa ( basierend auf deinem Code und noch ausbaufähig  )

```
import java.applet.*;
import java.awt.*;
import java.awt.event.*;

import javax.swing.Timer;

public class Memory extends Applet implements ActionListener {

	Button b[] = new Button[20];
	Panel bereich1 = new Panel();
	Panel bereich2 = new Panel();
	Button start1 = new Button("Spiel starten!");
	Button memory;
	boolean isOpen;

	public void init() {
		add(bereich2);
		add(bereich1);
		bereich2.add(start1);
		start1.addActionListener(this);
		bereich1.setLayout(new GridLayout(5, 4, 4, 4));
		bereich1.setBackground(Color.RED);
		bereich1.setEnabled(false);
		for (int i = 0; i < 20; i = i + 1) {
			b[i] = new Button("           ");
			b[i].setBackground(Color.YELLOW);
			bereich1.add(b[i]);
			b[i].addActionListener(this);

		}
	}

	public void actionPerformed(ActionEvent e) {
		final Button btn = (Button) e.getSource();
		if (e.getSource().equals(start1)) {
			stellen();
			bereich1.setEnabled(true);
			start1.setEnabled(false);
			return;
		}
		if (isOpen) {
			isOpen = !isOpen;
			btn.setLabel(e.getActionCommand());
			if (btn.getActionCommand().equals(memory.getActionCommand())) {
				System.out.println("Yeaah ein Paar gefunden!");
				btn.setEnabled(false);
				memory.setEnabled(false);
			} else {
				Timer t = new Timer(1000, new ActionListener() {
					@Override
					public void actionPerformed(ActionEvent e) {
						memory.setLabel("");
						btn.setLabel("");
					}
				});
				t.setRepeats(false);
				t.start();
			}
		} else {
			btn.setLabel(e.getActionCommand());
			memory = btn;
			isOpen = !isOpen;
		}
	}

	public void stellen() {
		int n = 0;
		int merke;
		while (n < 20) {
			merke = 0;
			double z = Math.random();
			int z10 = (int) (z * 10);
			b[n].setActionCommand("" + z10);
			for (int j = 0; j < n; j++) {
				if (b[n].getActionCommand().equals(b[j].getActionCommand()))
					merke = merke + 1;
			}
			if (merke < 2)
				n = n + 1;
		}
	}
}
```

denke das mit dem Zähler bekommste auch selbst hin


----------



## Lumix (5. Mai 2010)

Vielen Danke für die mühe und die Hinweise :toll:

Werds gleich mal ausprobieren und versuchen einen Zähler reinzupacken

MfG


----------



## Lumix (5. Mai 2010)

Mir ist noch aufgefallen, dass die Buttons direkt auf Enabled schalten wenn man 2 mal auf die selbe Karte klickt. Kann man das irgendwie unterbinden?

Ich hatte noch vor ein "Neues Spiel"-Button reinzusetzen, damit man nach einem beendetem Spiel ein neues starten kann. Hat da jmd. eine Idee?

Und als letztes ist mir aufgefallen, dass ich für [java=54]bereich1.setEnabled(true);[/code] nicht [java=54]bereich1.setVisible(true);[/code] einsetzen kann. Weiß jmd. warum das nicht geht?

Danke im Voraus


----------



## eRaaaa (5. Mai 2010)

Also ein bisschen Selbstinitiative kann nicht schaden ;D

Also im Moment ist das alles ja eh nicht so optimal gelöst 
Um dein Problem mit dem 2 x selbe Karte zu lösen, gibts sicherlich mehrere Möglichkeiten, dir fällt da gar keine ein? (Button disablen, if-Abfrage ob btn != memory ist usw...)

Neues Spiel bedeutet ja eig. nur, alle Buttons wieder aktivieren, neue Zahlen generieren ....
(da wäre es vllt schon gut wenn du den Code mal etwas aufräumen würdest un in entsprechende Methoden verlagerst, so wie der im Moment ist, ist das alles etwas durcheinander  )





Lumix hat gesagt.:


> Und als letztes ist mir aufgefallen, dass ich für [java=54]bereich1.setEnabled(true);[/code] nicht [java=54]bereich1.setVisible(true);[/code] einsetzen kann. Weiß jmd. warum das nicht geht?



Mhm? sichtbar ist das Panel doch(oder?), es wurde halt nur zu Beginn "deaktiviert" (damit man nicht schon die Buttons drücken kann, bevor das Spiel (der Start-Button gedrückt wurde) begonnen hat, daher wird es halt nach Klick auf den "start-Button" das Panel aktiviert...klar gibts da auch wieder andere/bessere Methoden, überleg dir halt was schickes


----------



## ARadauer (3. Dez 2010)

Ich glaub du musst deiner Kollegin noch den Code erklären...
http://www.java-forum.org/java-basics-anfaenger-themen/109940-codeerklaerung-memory.html


----------

