# problem beim Memory Logik



## boss1986 (23. Jun 2007)

hallo zusammen...ich programmiere zur zeit ein Memory Spiel für ein Schulprojekt und hänge momentan beim Logik des Spiels. Die nötigen Oberflächen, Zeit-Programm und andere Kleinigkeiten sind soweit in Ordnung. 
Mein Problem ist dass ich eine Klasse mit Spiellogik erstellen will welche danach mit GUI-Klasse verbunden wird da es sich hier um ein OOP-Projekt handelt. 
In meiner GUISpielfeld werden die Buttons durch ein Array erstellt und in der GUIEinstellung werden die Anzahl der Karten(Buttons) je nach Schwierigkeitsgrad erstellt. Mir fällt eben nur noch die Spiellogik...

soweit bin ich gekommen: 

public class Spiellogik {

	private GUISpielfeld dieGUI;

		public void setGUI(GUISpielfeld dasObjekt) {
		  dieGUI = dasObjekt;
		 }
	}


würde mir jemand dabei helfen? wäre sehr nett....

dankeschön


----------



## Marco13 (23. Jun 2007)

So als Ansatz ist das ein bißchen wenig. Und über die Frage, ob man ERST die GUI und DANN das eigentliche Spiel programmieren sollte, oder umgekehrt, könnte man jetzt diskutieren. Du könntest mal nach "MVC" oder "Model View Controller" suchen, um da ein paar Infos zu erhalten. Im Moment weiß auch niemand, welche "Rolle" deine GUI übernimmt, und OB es z.B. einen Controller gibt. Aber "irgendwie" mußt du versuchen, deine Spiellogik von der GUI ansteuern zu lassen, und die GUI den aktuellen Spielzustand anzeigen lassen. Die Information, welche Methoden deine GUI anbietet, und eine _etwas konkretere Fragestellung_ wären da schon hilfreich...


----------



## boss1986 (23. Jun 2007)

danke für die antwort ^^
also ich erklärs kurz wie ich mir das spiel vorstelle: also ich habe jetzt 2 GUIs (GUIEinstellung, GUISpielfeld) die GUIEinstellung ist mein start fenster, hier hat man 3 schwierigkeitsgraden und je nach gewählte schwierigkeit wird die anzahl der buttons festgelegt und es kommt dann die andere GUI (GUISpielfeld) welche die buttons dort erscheinen.
In der GUISpielfeld-Klasse werden Buttons in einem jPanel erzeugt und in der GUIEinstellung-Klasse wird die anzahl der Buttos festgelegt (8*8 , 6*6 , 4*4)

hier sind die methoden welche die karten erzeugen (in GUISpilefeld):

p
	
	
	
	





```
rivate JPanel getJPanelButtons() {
		if (jPanelButtons == null) {

			GridLayout gridLayout = new GridLayout();
			gridLayout.setColumns(kartenanzahl);
			gridLayout.setRows(kartenanzahl);
			jPanelButtons = new JPanel();
			jPanelButtons.setLayout(gridLayout);
			getButtons(kartenanzahl);
		}
		return jPanelButtons;
	}

	private void getButtons(int kartenAnzahl) {
		int buttonNr = 0;
		for (int j = 0; j < kartenAnzahl; j++) {
			for (int i = 0; i < kartenAnzahl; i++) {
				buttonNr++;
				buttons[j][i] = new JButton();
				buttons[j][i].setName("Button" + buttonNr);
				buttons[j][i].setIcon(new ImageIcon(getClass().getResource("/fussball-ballII.gif")));
				buttons[j][i].addActionListener(this);
				jPanelButtons.add(buttons[j][i]);

			}
		}

	}
```


und hier ist die Methode welche die anzahl der Karten gibt (in GUIEinstellung):


```
public void actionPerformed(ActionEvent e) {
		if (e.getSource().equals(jButtonFertigstellen)) {
			this.setVisible(false);
			GUISpielfeld dieGUI = null;
			if (jRadioButton3.isSelected()) {
				dieGUI = new GUISpielfeld(8, this);
			}
			else if (jRadioButton2.isSelected()) {
				
				dieGUI = new GUISpielfeld(6, this);				
			}
			
			else if (jRadioButton1.isSelected()) {
				
				dieGUI = new GUISpielfeld(4, this);
			}
			dieGUI.setVisible(true);
		}
	}
```


ich hoffe diese Infos helfen weiter um mein problem zu lösen ^^

danke


----------



## Marco13 (24. Jun 2007)

Naja. :? Die Buttons vom Spielfeld bekommen ja schon einen ActionListener. Der könnte abfragen, WELCHER der Buttons geklickt wurde (dazu gibt's vielleicht bald einen FAQ-Eintrag :roll: ). Wenn man dan Button hat, kann man ihn "umdrehen", d.h. z.B. ein anderes Icon setzen, und sich merken, dass ein Button aufgedeckt ist. Wenn man dann einen weiteren Button aufdeckt, überprüft man, ob das Symbol gleich ist. Nun. Das weißt du wohl. Memory eben. Man könnte jetzt diese beiden Methoden als "Kern" für ein Memory verwenden. Aber wirklich helfen würde dir eine "Komplettlösung" wohl nicht. In Ermangelung einer konkreten Frage... weiteres Nachfragen: Was soll denn z.B. passieren, wenn zwei gleiche Buttons "aufgedeckt" sind?


----------



## boss1986 (24. Jun 2007)

also eine komplette lösung im sinne einer neue klasse (Spiellogik) würde mir schon helfen, denk ich mal^^. 
Eben Prinzip von Memory ist mir bekannt. Wenn 2 gleiche Karten aufgedeckt sind, dann sollten sie so bleiben und wenn nicht dann werden beide zugedeckt...und eben das ganze, also Kartenziehen, aufdecken, vergleichen, zudecken usw. hätte ich gerne in einer neuen Klasse die dann mit meine GUIs verbunden ist gehabt. 
Es wäre supper wenn mir jemand dabei helfen würde diese Klasse zu realisieren.


----------



## Ellie (24. Jun 2007)

Schau mal in deiner Bücherei nach dem Buch „Einsteig in Java 6“ von Galileo Computing. Im Kapitel über GUI wird ein Memory-Spiel als Beispiel entworfen.


----------



## boss1986 (24. Jun 2007)

danke für den hinweis und ich werds 100% machen aber ich glaub dafür wäre dann die zeit knapp da der abgabetermin in höchstens 2 wochen ist aber ich werde auf jeden fall nachschauen


----------



## Marco13 (24. Jun 2007)

Hier steht ja überall oft genug: Wir machen keine Hausaufgaben. Aber weil du's bist:

```
class Spiellogik
{
    int aufgedecktesSymbol = -1;
    int aufgedeckterButtonID = -1;

    public void karteAufdecken(int neuerButtonID)
    {
         int neuAufgedecktesSymbol = dieGUI.getSymbol(neuButtonID);
         if (augedecktesSymbol == -1)
         {
              aufgedecktesSymbol = neuAufgedecktesSymbol;
              aufgedeckterButtonID = neuerButtonID;
         }  
         else if (aufgedecktesSymbol != neuAufgedecktesSymbol)
         {
              dieGUI.schließeButtons(aufgedeckterButtonID, neuerButtonID);
              aufgedecktesSymbol = -1;
              aufgedeckterButtonID = -1;
         }
    }
}
```
Das war's. Garnicht so schwer, oder?


----------



## boss1986 (24. Jun 2007)

vielen dank...
ich habe noch in meiner GUI klasse eine Methode getSymbol und eine schließeButtons hinzugefügt...ist das richtig?


----------



## Marco13 (25. Jun 2007)

Hmpf  :? eigentlich sollte das ja nur ein Wink mit dem Zaunpfahl sein, und andeuten, dass man die Spiellogik nicht wirklich schreiben kann, wenn man nicht weiß, welche Methoden das GUI (das ja im Moment vmtl. Model und View und Controller gleichzeitig ist) zur Verfügung stellt. Aber ... wenn's jetzt trotzdem geht ist ja gut. Nicht schön, aber OK. Oder - funktioniert es denn nun?


----------



## boss1986 (25. Jun 2007)

oops^^...ich habs dann falsch verstanden, also meine GUIs erhalten Methoden die für die ertstellung der GUI nötig sind plus die zusätzliche Methoden die ich geschickt hab...d.h. außer diese Methoden die hier zu sehen sind, werden die anderen automatisch hinzugefügt um das nötige Fenster zu erstellen und deshalb glaub ich nicht dass diese Methoden eine Rolle in der Spiellogik-Klasse spielen  

das was du mir geschickt hast zeigt kein Fehler aber es funktioniert eben nicht,

hmm...ich glaub ich krieg mein Problem nicht gelöst.


----------



## Marco13 (25. Jun 2007)

Ein lauffähiges Beispiel oder eine Erklärung, WAS nicht funktioniert ... ach, was liegt mir dran :roll:


----------



## boss1986 (25. Jun 2007)

also dein Programm hat keine Funktionen zu mindest mal in meinem Programm^^

da hast du mir eine methode wo die karten aufdecken soll geschickt wenn ich das richtig verstanden habe aber es fehlen methoden die die karten überhaupt auf die buttons zeigen und die, die karten mischen bzw. vergleichen ^^ 

aber danke dass du es verfolgst sehr nett von dir ^^


----------



## Evil-Devil (26. Jun 2007)

Boss, du hast da was nicht verstanden...der Code von Marco war als Beispiel gedacht. Du musst die Logik schon selbst implementieren und mit deiner GUI verknüpfen. -.-


----------

