# Schere, Stein, Papier



## suzerl (24. Okt 2012)

Hallo Freunde, (wuhu mein erster Post) 
wir haben derzeit ein kleines Schulprojekt. Leider blicke ich in dem Thema nicht ganz durch. 
Folgende Aufgabenstellung: 
Erstellen Sie ein einfaches „Schnick-Schnack-Schnuck“-Spiel (Schere, Papier, Stein). Ihre Antworten sollen über die Tastatur ausgelesen werden. ( r=Stein, p=Papier, s=Schere.) 

Folgende Hilfestellungen wurden uns noch dazu bereit gestellt: 
Folgende Routine liest eine Zeile von der Tastatur ein und liefert das erste Zeichen zurück:

```
public static int readChar() throws Exception {
        int myChar = System.in.read();
        while (System.in.read() != '\n');
        return myChar;
    }
```
Aufgerufen wird die Routine wie folgt:

```
int myChar = <NameIhrerKlasse>.readChar();
```
Auf die Taste „B“ können Sie z.B. so abfragen:

```
if (myChar == 'b') { ... }
```

Das ganze läuft dann über einen Zufallsgenerator, so dass ich quasi gegen den Computer spiele. 

Im Folgenden nun mein Code-Ansatz... mit dem ich aber leider einige Fehlermeldungen bekomme... Die zum Teil für mich auch etwas unverständlich sind. Ich hoffe ihr könnt mir da ein wenig weiterhelfen, damit mich noch weiter in die Materie vertiefen kann.


```
class SSP10
	public static void main(String[] args)  	{
	
	public static int readChar() throws Exception { 
		int myChar = System.in.read(); 
		while (System.in.read() != '\n'); 
		return myChar		
			
			/*int s =  1; 
			int p =  2;
			int r =  3; 
			int pcwahl; 
			int spielerwahl;*/ 				
					
					intMyChar = SSP10.readChar();
					pcwahl = (int) (Math.random()*3 + 1); 
			
			
									//Spieler wählt Schere
			 							if (myChar == 1){
			 
									//Computer wählt Schere
										if (pcwahl == 1) {
										System.out.println("Unentschieden"); }
				
									//Computer wählt Papier
										if (pcwahl == 2) {
										System.out.println ("Du hast gewonnen"); }
				
						
									//Computer wählt Stein 
										if (pcwahl == 3) {
										System.out.println ("Du hast verloren");} 
				
		}		
			
									//Spieler wählt Papier 
										if (myChar == 2); {
			
			
									//Computer wählt Papier
										if (pcwahl == 2); {
										System.out.println ("Unentschieden");}
				
									//Computer wählt Stein
										if (pcwahl == 3); {
										System.out.println ("Du hast gewonnen");}
				
									//Computer wählt Schere
										if (pcwahl == 1); { 
										System.out.println ("Du hast verloren");}
				
		}	
									//Spieler wählt Stein
										if (myChar == 3) { 
			
									//Computer wählt Stein
										if (pcwahl) == 3;
										{System.out.println ("Unentschieden");} 
				
									//Computer wählt Schere
										if (pcwahl) == 1; {
										System.out.println ("Du hast gewonnen");} 
				
									//Computer wählt Papier
										if (pcwahl) == 2; {
										System.out.println ("Du hast verloren");}
					
			
		}
	}

}
}
```


----------



## Michael... (24. Okt 2012)

suzerl hat gesagt.:


> [JAVA=2]	public static void main(String[] args)  	{
> 
> public static int readChar() throws Exception { [/code]


Fehler Nr.1: Man kann innerhalb einer Methode keine weiteren Methoden definieren. Methoden werden immer "parallel" in einer Klasse implementiert.


----------



## Gast2 (24. Okt 2012)

[JAVA=1]class {...}[/code] Klammern vergessen
[JAVA=15]
int MyChar = (int)readChar();
int pcwahl = (int) (Math.random()+ 1);[/code]
[JAVA=38] if (myChar == 2);[/code] ohne Semikolon
[JAVA=58]if (pcwahl) == 3;[/code] :autsch:


----------



## suzerl (24. Okt 2012)

oh super danke... das hilft mir doch weiter


----------



## Jess (24. Okt 2012)

Bin zum lernen - just for fun - eben auch an Schnick-Schnack-Schnuck


----------



## Landei (24. Okt 2012)

Das ist doch völlig out! Heutzutage spielt man Stein-Schere-Papier-Echse-Spock:

Rock, paper, scissors, lizard, Spock..... - YouTube


----------



## suzerl (25. Okt 2012)

so bekomme vom compiler nur noch einen fehler ausgegeben der für mich jedoch etwas unverständlich ist. 
hier mal mein code: 


```
class SSP10	
{	
	public static int readChar() throws Exception { 
		int myChar = System.in.read(); 
		while (System.in.read() != '\n'); 
		return myChar;		
	
			//Variablen 
			int s = 1; 
			int p = 2;
			int r = 3;
			
			//Einführungstext							
				System.out.println("Lass uns ein Spiel spielen!");
				System.out.println("Treffe deine Wahl!");
					int myChar = (int)readChar(); //Fehler myChar ist schon in readChar definiert?
					int pcwahl = (int) (Math.random()*3 + 1); 
			
									//Regeln: 
			
									//Spieler wählt Schere
			 							if (myChar == 's'){
			 				
									//Computer wählt Schere
										if (pcwahl == 's') {
										System.out.println("Unentschieden"); }
							
									//Computer wählt Papier
										if (pcwahl == 'p') {
										System.out.println ("Du hast gewonnen"); }
				
							
									//Computer wählt Stein 
										if (pcwahl == 'r') {
										System.out.println ("Du hast verloren");} 
				
						
			
									//Spieler wählt Papier 
										if (myChar == 'p') {
			
			
									//Computer wählt Papier
										if (pcwahl == 'p') {
										System.out.println ("Unentschieden");}
				
									//Computer wählt Stein
										if (pcwahl == 'r') {
										System.out.println ("Du hast gewonnen");}
				
									//Computer wählt Schere
										if (pcwahl == 's') { 
										System.out.println ("Du hast verloren");}
				
			
									//Spieler wählt Stein
										if (myChar == 'r') { 
			
									//Computer wählt Stein
										if (pcwahl == 'r')
										{System.out.println ("Unentschieden");} 
				
									//Computer wählt Schere
										if (pcwahl == 's') {
										System.out.println ("Du hast gewonnen");} 
				
									//Computer wählt Papier
										if (pcwahl == 'p') {
										System.out.println ("Du hast verloren");}
					
			
		}
	
}


}
		return 0; 
}
}
```

In Zeile 16 spuckt der compiler mir dann folgende Fehlermeldung aus: ariable myChar is already defined in method readChar(). Weiss leider nicht so ganz was ich mit der Meldung anfangen soll ???:L


----------



## Gast2 (25. Okt 2012)

du vereinbarst myChar 2x
[JAVA=4]  int myChar = System.in.read(); [/code]
[JAVA=16] int myChar = (int)readChar();[/code]

du müsstest einfach eine umbenennen.


----------



## suzerl (25. Okt 2012)

hilft nicht wirklich :/ habe das myChar zu Char mal umbenennt. Der Compiler spuckt mir nun die Fehlermeldung unreachable Statement in der Zeile 15 aus.


----------



## Jo.Jo (25. Okt 2012)

Entfern mal das Semikolon bei 
	
	
	
	





```
while (System.in.read() != '\n');
```


----------



## SlaterB (25. Okt 2012)

die readChar()-Methode ist doch nach drei Zeilen, nach dem return zu Ende, da gehört eine geschweifte Klammer hin,
anderer Code muss in eine neue Methode, z.B. der main-Methode stehen usw..

Tipp für den Anfang:
möglichst wenig Code, erstmal Grundstrukturen einbauen, leere Methoden


```
class SSP10    
{   
   public static int readChar() {
     return 0;
  }

   public static void main(String[] args)      {
        // in einer nicht-public-Klasse generell fraglich
   }

}
```
kompiliert? immerhin ein Anfang

danach Zeile für Zeile Code einfügen, zwischendurch auch laufen lassen,
ein altbekanntes
> System.out.println("Hello World");
welches tatsächlich zu einer Ausgabe führt, also Programm kompiliert und läuft, ist schon viel viel Wert,
besser als hunderte Codezeilen ohne Struktur durcheinanderzuwirbeln


----------



## Michael... (25. Okt 2012)

Die Art einzurücken ist ganz schon merkwürdig! In einem normalen Ablauf einzurücken ist nicht die übliche Art und macht m.M. auch keinen Sinn. Dagegen sollte man bei Verschachtelten if Abfrage o.ä. einrücken, damit man die Zusammenhänge und Abschnitte besser erkennen kann.
Einrückungen dienen dazu den Code übersichtlicher zu gestalten und sollten nicht einfach wahllos, weil man "gerade man Lust hat" eingesetzt werden.

Zum Problem. Ursprünglicher Gedanke mit der Hilfestellung 
	
	
	
	





```
public static int readChar()
```
 war es vermutlich diese Methode als Hilfsmethode in Deinem Ablauf zu nutzen und nicht diese Methode aufzublasen und mit eigenem Code zu erweitern. Ist ja auch nicht unbedingt ein leuchtend wenn man eine Methode 
	
	
	
	





```
readChar
```
 hat, die so nebenbei noch ein Schere-Stein-Papier-Spiel durchführt.

Und wenn Dein Code funktionieren würde, würde es zu einer Endlosschleife kommen, da die Methode in Zeile 16 sich selbst aufruft.

Ergo: Zurück zum Start klein anfangen. Eine Methode schreiben, die zufallsgesteuert die Wahl des Computers ausführt. Eine Methode schreiben, die zwei Symbole miteinander vergleicht und zurückgibt ob oder wer gewonnen hat.
Eine Spielschleife die (u.a.) mittels readChar die Wahl des Anwenders einliest, anschließend die Computer Methode und darauf die Vergleichsmethode aufruft, um dann anschließend auszugeben wer gewonnen hat.


----------



## Gast2 (25. Okt 2012)

Ich kann meine Vorrednern nur recht geben.
nach 
	
	
	
	





```
return
```
 endet eine Methode standartgemäß (da sie ja dann einen Wert zurückgibt, mehr soll sie ja ursprünglich nicht tun)
Den ganzen Rest musst du in die main-Methode schreiben, das wird dann bei Programm-Start ausgeführt!

EDIT: Was soll denn dein 
	
	
	
	





```
while
```
 überhaupt machen?


----------



## suzerl (25. Okt 2012)

das war in der Vorgabe so angegeben :/ 

hab das jetzt alles mal Step-by Step gemacht. Und hey...es funktioniert. Vielen Dank an euch


----------

