# Memory Spiel



## MLB (8. Feb 2011)

Hallo!
Wir haben die folgende Aufgabe gestellt bekommen und sollen diese mit Hilfe von Arrays lösen:


_Memory

Schreiben Sie ein Memoryspiel bei dem alle Pärchen zufällig bestimmt werden und ihre Position im Feld ebenso zufällig bestimmt wird. Das Memoryspiel soll 6 Felder groß sein. Jedes Feld soll (von 1-6) beschriftet werden. Der Spieler soll gefragt werden welches Feld aufgedeckt werden soll. Dann soll das Feld aufgedeckt angegeben werden:


		Code:In die Zwischenablage kopieren


Bsp.: 	1 2 3
	B 5 6

Als nächstes soll gefragt werden welches Feld aufgedeckt werden soll. Hat der Spieler zwei gleiche Felder aufgedeckt, soll ausgegeben werden, dass dies richtig ist und diese Felder sollen aufgedeckt bleiben. Sind die Felder nicht gleich, soll dies ausgegeben werden und die Felder sollen wieder zugedeckt werden:


		Code:In die Zwischenablage kopieren


Bsp.: 	1 2 B 		1 2 B
	B 5 6 		4 R 6
	„Richtig!“	„Falsch!“
nächste Ausgabe:
	1 2 B 		1 2 3
	B 5 6 		4 5 6

Versucht der Spieler ein Feld aufzudecken, was bereits aufgedeckt ist, soll dies als Fehler angezeigt werden und der Zug beginnt von neu. Sind alle Felder aufgedeckt ist das Spiel zu Ende. Jeder Buchstabe darf nur zweimal (als ein Pärchen) in einem Spiel vorkommen.
_


```
import util.*;
import java.util.*;

public class memory
{
	public static void main (String[]args)
	{
		//Variablen-Arrays
		char[] felder=new char[6];
		Random r=new Random();
		int counter=0;
		int anzahl=0;
		int eingabe1=0;
		int eingabe2=0;
		int richtige=0;
		//Belegung der Felder mit Buchstaben
		for(int i=0;i<6;i++)
		{

			anzahl=0;
			felder[i]=(char)(65+Math.abs(r.nextInt())%(67-65+1));
			for(int z=0;z<6;z++)
			{
				if(felder[i]==felder[z])
				{
					anzahl=anzahl+1;
				}

			}

			if(anzahl>2)
			{
				i=0;
			}
		}
		for(int i=0;i<6;i++)
		{
			System.out.println(felder[i]);
		}


		System.out.println("\n1\t2\t3\n4\t5\t6");

		while(richtige<3)
		{
			eingabe1=StdInput.readInt("Geben Sie das erste Feld ein, was Sie aufdecken moechten!");
			if(eingabe1==1)
			{
				System.out.println("\n"+felder[0]+"\t2\t3\n4\t5\t6");
			}
			else if(eingabe1==2)
			{
				System.out.println("\n1\t"+felder[1]+"\t3\n4\t5\t6");
			}
			else if(eingabe1==3)
			{
				System.out.println("\n1\t2\t"+felder[2]+"\n4\t5\t6");
			}
			else if(eingabe1==4)
			{
				System.out.println("\n1\t2\t3\n"+felder[3]+"\t5\t6");
			}
			else if(eingabe1==5)
			{
				System.out.println("\n1\t2\t3\n4\t"+felder[4]+"\t6");
			}
			else if(eingabe1==6)
			{
				System.out.println("\n1\t2\t3\n4\t5\t"+felder[5]);
			}





			eingabe2=StdInput.readInt("Geben Sie das erste Feld ein, was Sie aufdecken moechten!");

			if(eingabe2==1)
			{
				System.out.println("\n"+felder[0]+"\t2\t3\n4\t5\t6");
			}
			else if(eingabe2==2)
			{
				System.out.println("\n1\t"+felder[1]+"\t3\n4\t5\t6");
			}
			else if(eingabe2==3)
			{
				System.out.println("\n1\t2\t"+felder[2]+"\n4\t5\t6");
			}
			else if(eingabe2==4)
			{
				System.out.println("\n1\t2\t3\n"+felder[3]+"\t5\t6");
			}
			else if(eingabe2==5)
			{
				System.out.println("\n1\t2\t3\n4\t"+felder[4]+"\t6");
			}
			else if(eingabe2==6)
			{
				System.out.println("\n1\t2\t3\n4\t5\t"+felder[5]);
			}





		}

	}
}
```


Nun wissen wir nicht wie wir weiter machen sollen.

Wir bitten um Hilfe!


----------



## SlaterB (8. Feb 2011)

eine wichtige Erkenntnis ist schonmal:
Mega-Codeblöcke wie Zeile 48-70 sind für sich schon fragwürdig, auf keinen Fall dürfen die aber zweimal im Programm stehen (80 - 100)

die Aufgabenstellung ist für mich undeutlich, gibt es nur genau 6 Felder, also 3 Paare 
oder 2x 6 Felder untereinander mit insgesamt 6 Paaren?
(edit: habe die Aufgabe im ersten Post ein bisschen formatiert, jetzt ein wenig klarer)

wie auch immer, das Array muss deutlich aufgebohrt werden, nur char reicht nicht, da muss eine eigene Klasse Feld her,
jedes Feld mit Informationen wie Wert (A, B, C), Position (alternativ reicht der Array-Index), aktuell aufgedeckt oder nicht, dauerhaft aufgedeckt oder nicht usw.,
wenn das Array alle Informationen speichert, dann lautet der Code etwa so:


```
eingabe1=StdInput.readInt("Geben Sie das erste Feld ein, was Sie aufdecken moechten!");
felder[eingabe1].duBistJetztAufgedeckt(); // hier bisher nicht geprüft ob falsche Eingabe, Karte schon sichtbar usw.,
allgemeineAusgabe(); // allgemeine Methode, funktioniert ohne eingabe1, da das Array alles nötige weiß
felder[eingabe1].duBistJetztNichtMehrAufgedeckt(); // oder je nach Spielsituation was anderes
```

das sind jetzt nur wenige von vielen nötigen Ideen, wenn diese Strukturierung Schwung rein bringt dann besteht Hoffnung,
ansonsten ist 'wir wissen nix' keine gute Grundlage für solche Aufgeben..


----------



## MLB (9. Feb 2011)

Danke für den Tipp! Wir haben die Aufgabe noch halbwegs hinbekommen. Heute haben wir dann von unserem Lehrer die Musterlösung bekommen. Bei Bedarf kann ich sie mal posten.
Gruß MLB


----------



## raven1 (23. Aug 2011)

Hallo,

bin neu hier.....

habe ein Memory Spiel mit Schummelfunktion programmiert. 
Alles läuft soweit gut. Einziges Problem ist, falls ich auf eine Karte geklickt habe, dreht diese sich um, sobald ich dann auf dem Button Schummelfunktion klicke, und dann nochmals auf die gleiche Karte,
erkennt das Programm nicht, dass die Karte schon aufgedeckt war, dreht sie um und erkennt die gleiche Karte als "Paar" an.

für einen Denkanstoss wäre ich dankbar


----------



## SlaterB (23. Aug 2011)

Denkanstoß: programmiere weniger Fehler hinein, dann treten auch weniger Fehler auf,

mehr ist da absolut nicht zu sagen, du hast ein Programm mit deterministischer Logik, 
alles was passiert ist exakt auf deine Code-Zeilen zurückzuführen,
irgendwas wird falsch sein und ist noch zu korrigieren, ohne Code nicht zu erraten 

ein eigenes Thema ist für dein Programm gerechtfertigt, zur Sicherheit schließe ich dieses Thema


----------

