DotCom Tippspiel

F

frucht

Gast
Hi,

Bin gerade dabei etwas Java zu lernen und finde bei einem Beispielprogramm meinen Fehler nicht.

DotCom Klasse

Java:
import java.util.ArrayList;

public class DotCom {
	
	private ArrayList<String> zellorte;
	int AnzahlTreffer = 0;
	
	public void setZellorte (ArrayList<String> orte){
		zellorte = orte;	
	}
	
	public int getAnzahlTreffer (){
		
		return AnzahlTreffer;
	}
	
	public void getBla(){
		
		System.out.println(zellorte.get(0));
	}

	public String prüfdich(String Benutzereingabe){
		
		String Ergebnis = "Vorbei";
		
		int tipp = (int) Integer.parseInt(Benutzereingabe);
		int index = zellorte.indexOf(tipp);
		
		if (index >= 0){
			
			zellorte.remove(index);
			System.out.println("Treffer");
			
			if(zellorte.isEmpty()){
				
			   Ergebnis = "Versenkt";
			   System.out.println(Ergebnis);
			}
			
		else {
				
				Ergebnis = "Treffer";
				System.out.println(Ergebnis);
				AnzahlTreffer++;
			}
		}
		
		return Ergebnis;
		
	}
}

Helferklasse:

Java:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Helfer {
	
	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;
	}

}

Testklasse

Java:
import java.util.ArrayList;

public class Test {

	public static void main (String [] args){
		
		
		DotCom Spiel = new DotCom ();
		Helfer helfen = new Helfer();
		
		int random = (int) (Math.random() * 5);
		
		String i = String.valueOf(random);
		String o = String.valueOf(random +1);
		String e = String.valueOf(random +2);
		
		System.out.println(i + o + e);
		
		ArrayList<String> orte = new ArrayList<String>();
		
		orte.add(i);
		orte.add(o);
		orte.add(e);
	
	
		Spiel.setZellorte(orte);
		
	    String Benutzereingabe = helfen.getBenutzereingabe("Bitte Tipp eingeben");
	    Spiel.prüfdich(Benutzereingabe);
			
	
		}
			
	}


Problem ist jetzt das nur die Eingabe kommt aber dannach keine weitere Ausgabe o.Ä.
 
Zuletzt bearbeitet von einem Moderator:

KingOfExceptions

Bekanntes Mitglied
Java:
Ergebnis = "Treffer";
mach das mit
Code:
.equals
.

und
Code:
(int) Integer.parseInt(Benutzereingabe);
zweimal parsen ist auch nicht nötig
 
Zuletzt bearbeitet:
N

nillehammer

Gast
Java:
Ergebnis = "Treffer";
mach das mit .equals .
Quatsch, das ist eine Zuweisung und kein Vergleich!#

Wenn ich mir das Programm so anschaue, müsste was ausgegeben werden. Ich zweifele Deine Aussage also an, dass nichts ausgegeben wird. Es enthält aber tatsächlich einen Fehler in der Klasse DotCom
Java:
private ArrayList<String> zellorte;
Hier hast Du eine Liste von Strings.

Java:
        int tipp = (int) Integer.parseInt(Benutzereingabe);
        int index = zellorte.indexOf(tipp);
Hier machst Du aus der Nutzereingabe ein int und schaust nach, ob das in der Liste drinnen ist. Das wird nie funktionieren. Mach also entweder eine Integer-Liste oder lass das parseInt sein und schau direkt mit Benutzereingabe in die Liste.
 
C

Camino

Gast
Java:
Ergebnis = "Treffer";
mach das mit
Code:
.equals
.

Das ist schon so richtig. Es ist ja eine Zuweisung (=) und kein Vergleich (== oder equals). Mach dir doch einfach mal ein paar Testausgaben nur mit Text oder auch die Variablen, dort wo was ausgegeben werden soll. Dann schaust du, was dort erscheint.
 

El_Rabbit

Mitglied
Ich weiß welches Buch du liest :toll:

Ich bin grad in Kapitel 8 (Vererbung und Polymorphie)
Das Buch ist saugeil, aber manchmal ist es dann doch zu viel des Guten. Die Comics sind z.B. einfach nur schlecht ^^
 

Kevin94

Top Contributor
@ KingOfExeptions: kannst du zählen, dass ist ein = also ein Zuweisung, erklär mir mal bitte wie du mit equals eine String einen Wert zuweist.

Dein Problem ist, dass du erstens deine prüfdich Methode nicht einheitlich programmiert hast, entweder du gibst das Ergeniss immer aus (auch "Vorbei"), oder gar nicht. Und zweitends, dass du diese Methode nur einmal aufrufst. Das Konzept deiner prüfdich Methode macht es etwas schwierig, am einfachsten wäre es, wenn du den Rückgabetyp auf boolean änderst und immer false zurückgibt, auser wenn das Spiel vorbei ist und dann in der main die letzten zwei Zeilen durch folgendes ersetzt:
Java:
 String in = helfen.getBenutzereingabe("Bitte Tipp eingeben");
while(!Spiel.prüfdich(in))
{
   in = helfen.getBenutzereingabe("Bitte Tipp eingeben");
}
 

El_Rabbit

Mitglied
Also es geht hier um das Buch "Java von Kopf Bis Fuss"

Dort wird in 2 Kapiteln das Spiel DotCom Versenken (in Anlehnung an Schiffe versenken) programmiert.
Im ersten Kapitel in einer einfachen Version (mit einem 1 Dimensionalen array und einem DotCom Objekt, später erweitert auf die zweite Dimension und diesmal außerdem umgesetzt mittels einer ArrayList.

(Es wird in dem Beispiel ein 3 Zellen einnehmendes DotComObjekt in einem Array abgebildet, welches erraten werden muss => Schiffe versenken)

Erklärt wird in dem Kapitel was Testcode ist und warum Testcode wichtig ist.

Die Lösung deines Problems hat nillehammer bereits gepostet, das indexOf in deiner ArrayList funktioniert nicht, es liefert immer -1, weil dein Integer nicht in der Liste aus Strings ist!
Dadurch wird die Ausgabe auf der Konsole in der Methode nicht ausgeführt!

Entstanden ist das Problem, weil im Buch das ganze erst mit einem int Array aufgebaut wird und die Benutzereingabe (Die ein String ist) auf einen Integer geparset wird bevor sie in das int Array gesteckt wird.

Im nächsten Kapitel wird dann erklärt, dass ArrayListen auch komplexe Datentypen wie Strings oder Integer, die mittels Wrapper Klasse gewrapped sind aufnehmen kann. Also wird zur Demonstration eine ArrayList<String> benutzt und auf das Integer.parse der Benutzereingabe verzichtet.
Letzteres hast du übersehen.

Oder so ähnlich... Ich versteh das selber alles noch nicht so ganz.

Jetzt wo ich mich nochmal damit beschäftigt habe frage ich mich allerdings, warum ein gewrappter Integer (also komplexer Datentyp) in ein elementares [int] Array passt?!
Hab nochmal nachgeguckt, so steht es im Buch.
Dabei wird ein großer Vortei von ArrayLists gerade damit begründet, dass er komplexe Datentypen aufnehmen kann, ein "dummes" elementares array dagegen nicht. Hmmm. :bahnhof:

edit: Ich nehme mal an die Klasse Integer ist zwar komplex aber liefert den elemenatren Datentyp int zurück, right? ;)
 
Zuletzt bearbeitet:
F

frucht

Gast
Hi,

Danke für die vielen Antworten! ;) Habe es jetzt mal versucht zu verbessern und nun auch ein boolean als Rückgabetyp verwendet. Es hat jetzt zumindest schonmal eine Ausgabe nur wird das ganze noch nicht so richtig beendet.

Java:
import java.util.ArrayList;

public class DotCom {
	
	private ArrayList<String> zellorte;
	int AnzahlTreffer = 0;
	
	public void setZellorte (ArrayList<String> orte){
		zellorte = orte;	
	}
	
	public boolean prüfdich(){
		
		Helfer H = new Helfer();
		boolean lebt = false;	
		
		String tipp = H.getBenutzereingabe("Bitte Zahl eingeben");
		int index = zellorte.indexOf(tipp);
		
		if(index >= 0){
			
			zellorte.remove(index);
			
			if (!zellorte.isEmpty()){
				
				System.out.println("Treffer");	
				lebt = false;
			}
			
			else{
				
				System.out.println("Herzlichen Glückwunsch, sie haben das Schiff versenkt!");
				lebt = true;
			    }
		   }
		
		else{
			
			System.out.println("Vorbei");
			lebt = false;
			
			}
			return lebt;
	}				
}

Java:
import java.util.ArrayList;

public class Test {

	public static void main (String [] args){
		
		
		DotCom Spiel = new DotCom ();
		
		int random = (int) (Math.random() * 5);
		
		String i = String.valueOf(random);
		String o = String.valueOf(random +1);
		String e = String.valueOf(random +2);
	
		ArrayList<String> orte = new ArrayList<String>();
		
		orte.add(i);
		orte.add(o);
		orte.add(e);
	
		
		Spiel.setZellorte(orte);
		
		while (!Spiel.prüfdich()){
			
			Spiel.prüfdich();
		}
		
	}
			
}
 

jgh

Top Contributor
du setzt bei jedem Aufruf von der Methode prüfdich() den boolean auf wahr, deswegen beendet er das prog nicht, du musst die variable vor der methode initialisieren...

Java:
boolean lebt = false;

	public boolean prüfdich() {

		Helfer H = new Helfer();
//boolean lebt = false;
		String tipp = H.getBenutzereingabe("Bitte Zahl eingeben");
		int index = zellorte.indexOf(tipp);

//...
 
F

frucht

Gast
Okey danke funktioniert! Nur versteh ich das nicht so ganz. Ich setze am Anfang der Methode lebt auf false aber nach 3 Treffern wird es ja auf true gesetzt. Demnach müsste die Schleife da doch unterbrochen werden?

Gruß
 

Kevin94

Top Contributor
Du rufst in der schleife auch prüfdich auf, wenn du bei diesem Aufruf gewinnst, wirds nochmal aufgerufen. Korrekt müsstest die while-Schleife leer sein:
Java:
while(!Spiel.prüfdich());
 

HimBromBeere

Top Contributor
Ich hab zwar nicht ganz verstanden, wer eigtl. lebt, wenn das Schiff versenkt wurde, aber auch egal. Die Schleife muss - wie mein Vorredner bereits erwähnt hat - leer sein.

Einen Hinweis hab ich noch: vermeide Umlaute, sowohl bei Methoden- als auch Variablen- oder Klassennamen. Des Weiteren werden Klassen groß, Variablen sowie Methoden klein geschrieben.
 

Ähnliche Java Themen

Neue Themen


Oben