# "Schiffe versenken" - Code aus einem Lehrbuch - Frage



## I.E. (3. Aug 2014)

Hier ist ein Code aus dem Buch "Java von Kopf bis Fuß" aus dem Kapitel 5. Es geht um eine vereinfachte Version des Spiels "Schiffe versenken". Man hat hier ein Array mit drei aufeinanderfolgenden Zahlen (z.B. 3,4,5), die man hier auch noch selber festlegt. Dann muss man eine Zahl "tippen", und bekommt vom System die Antwort ausgespuckt, ob man jetzt "vorbei" geschossen hat, einen "Treffer" gelandet hat, oder das Schiff "versenkt" hat. 

Das Problem ist Folgendes. Wenn ich jetzt eine 3 als Tipp eingebe, sagt mir das System "Treffer". Bei einer 4 genauso. Bei einer 5 aber auch - es heißt immer noch "Treffer", und nicht "versenkt". Anscheinend kann sich das Programm nach dem jeweiligen Ausführen nicht an den letzten Anlauf erinnern. 

Im Code gibt es ja noch eine SpielHelfer-Klasse, die im Buch vorerst nicht näher beschrieben ist. Es hieß, man soll es erst einmal so hinnehmen, die Erläuterungen dieses und ähnlicher Codes kommen erst im Kapitel 14 (wie gesagt, ich bin im Kapitel 5). Ich dachte  mir, dass dieser Code eben das bewirkt, was ich momentan vermisse - dass sich das Programm jedes Ergebnis einer Ausführung merkt, und dieses bei der nächsten Ausführung berücksichtigt. Tut es aber nicht. 
Wenn ich diese SpielHelfer-Klasse gänzlich weglasse, habe ich am Ende genau dasselbe raus. 

Der Code ist genauso, wie er im Buch steht. Auf meinem Rechner habe ich noch zusätzliche, abgespeckte Versionen erstellt, aber hier ist der Original-Code. Was sagt Ihr dazu? Wie bringe ich das Programm dazu, mir bei der dritten richtigen Zahl "versenkt" rauszugeben? 


```
public class EinfachesDotCom {


int[] zellorte;
int anzahlTreffer;

public void setZellorte(int[] orte) { zellorte = orte;}

public String prüfDich(String stringTipp) 	{
												
												int tipp = Integer.parseInt(stringTipp);
												String ergebnis = "Vorbei";
												for (int zelle : zellorte)  
                                {if (tipp == zelle) {ergebnis = "Treffer"; anzahlTreffer++; break;}}

												if (anzahlTreffer == zellorte.length) 	{
																						ergebnis = "Versenkt";
																						}
												System.out.println(ergebnis); 	
												return ergebnis;

											}
	
}
```


```
public class EinfachesDotComTestlauf {

public static void main (String[] args) {

EinfachesDotCom dot = new EinfachesDotCom();
int[] orte = {2,3,4};

dot.setZellorte(orte);

String tipp = "4";

String ergebnis = dot.prüfDich(tipp);


}
}
```


```
import java.io.*;


public class SpielHelfer {

public String getBenutzereingabe(String prompt) {	
													String eingabeZeile = null;
													System.out.print(prompt + " ");
													
													try {
												BufferedReader is = new BufferedReader(new    InputStreamReader(System.in));
		 										eingabeZeile = is.readLine();
												if (eingabeZeile.length() == 0) return null;
														}
													catch (IOException e) {System.out.println("IOException: " + e);  }	
	
													return eingabeZeile;
												}
													
}
```


----------



## JavaMeister (3. Aug 2014)

Du prüfa t nur einmal.

Du musst die methode mind. 3 mal aufrufen.


----------



## njans (3. Aug 2014)

Ich nehme mal an, in deinem Buch geht es dann noch etwas weiter. So hast du nämlich keine Möglichkeit mehr, als eine Zahl einzulesen. Ich würde mal davon ausgehen, dass deine SpielHelfer Klasse genau dafür dann verwendet wird, zumal du momentan noch keine Interaktion mit dem Nutzer hast. 

Mal eine ganz einfache Möglichkeit beliebig viele Tipps abzugeben.

```
public class EinfachesDotComTestlauf
{

	public static void main(String[] args)
	{
		EinfachesDotCom dot = new EinfachesDotCom();
		int[] orte = { 2, 3, 4 };
		dot.setZellorte(orte);

		String[] tips = { "4", "2", "3" };

		for (String tip : tips)
		{
			String ergebnis = dot.prüfDich(tip);
		}

	}
}
```


----------



## I.E. (3. Aug 2014)

Danke, aber diese Ideen hatte ich von Anfang an, nur dass sie mir nicht besonders gefallen. 

Bei einem richtigen Spiel geht es ja auch so vonstatten - ich tippe auf eine Zahl, erhalte eine Antwort, tippe auf eine zweite Zahl, erhalte eine Antwort, überlege mir eine Strategie, und tippe auf die dritte Zahl, wobei ich die vorherigen Antworten beherzige. Mir geht es darum, einen realistischen Spielfluss hinzukriegen. 

Sonst kann ich ja gleich 100 Zahlen auf einmal raten. 


Und müsste der vorgeschlagene Code anstatt


```
for (String tip : tips)
```

nicht so heißen?


```
for (String tip : orte)
```


Was ist genau mit "Interaktion mit einem Nutzer" gemeint? 

Meinst du damit eine besondere Schnittstelle, dank der sich das Programm bei mehrmaliger Ausführung die Zwischenergebnisse immer merkt, und diese in die logische Kette mit einbaut?


----------

