Hangman!

Status
Nicht offen für weitere Antworten.

Skinny

Mitglied
Ich muss für die Schule das Programm "Hangman" schreiben!
Da ich aber keine Ahnung von Java habe, brauche ich dringend Hilfe!
Ich habe es geschaft, dass ich ein Wort eingeben kann und dann so viele Unterstriche kommen wie das Wort Buchstaben hat.
Code:
import java.io.*;

public class Hangman
{
	public static void main(String arg[]) throws IOException
	{
		String str=new String();
	
		BufferedReader input=new BufferedReader(new InputStreamReader(System.in));
	
		str=input.readLine();       
                        
		Hangman a=new Hangman();
		
		a.ausgabe(str);	 
			
	}
		
		void ausgabe(String str)
  	{
		int anzahl;
		
		anzahl=str.length();	
			
			for (int k=0; k<=25; k=k+1)
		{
			System.out.println(" ");
		}
		
		for (int i=0; i<=anzahl-1; i=i+1)
		{
			System.out.print(" _");
		}

	}

}


Jetzt muss mir einer bitte weiterhelfen.
Ich muss jetzt noch die Abfrage machen!

Also das soll so aussehen:
-Man gibt einen Buchstaben ein
-Es wird abgefragt ob der Buchstabe in dem Wort vorhanden ist
-Wenn er vorhanden ist kommt er an die stelle wo er im Wort sitzt
-Wenn er nicht vorhanden ist wir ein fehler angezeigt
-Mann darf 10 Fehler haben


Das ist so die grobe Aufgabe!

Wäre echt nett wenn ihr mir helfen könntet!!!!

DANKE!
 

Marco13

Top Contributor
FAQ lesen ("Wir machen keine Hausaufgaben" etc.). Die Eingabe müßtest du noch hinkriegen - ist ja seit Java 1.5 mit der "Scanner" klasse sehr einfach. Vermutlich würde eine Websuche nach "Java Hangman" 1000 fertige Lösungen liefern, aber da du das nicht getan hast, sondern hier nachfragst, willst du es vielleicht(!?) ja doch selbst schaffen. Dazu mußt du aber sagen, woran's gerade hängt....
 

Skinny

Mitglied
Also ich abe jetzt ein neues Programm, wo es aber noch einen Haken gibt, und zwar läuft das Programm nicht so oft durch bis ich alle Buchstaben des Wortes erraten habe, sondern nur ein einziges mal.

Code:
import java.io.*;

public class Hangman
{
	private char[] wort;

   	public Hangman()
   	{
      	this.startGame();
   	}

  	private void startGame()
   	{
      	String s = this.readStdin("Spieler 1, bitte geben sie das Wort ein: ");
      	this.wort = s.toCharArray();
      	for (int k=0; k<=25; k=k+1)
		{
			System.out.println(" ");
		}
      	this.printUnsichtbaresWort();
      	String s2 = this.readStdin("Geben Sie einen Buchstaben ein: ");
      	char aktuellerChar = s2.charAt(0);
      	this.find(aktuellerChar);
   	}

   	private void printUnsichtbaresWort()
   	{
      	for (int i =0; i < this.wort.length; i++)
      	{
        	 System.out.print("*");
      	}
      	System.out.println("");
   	}
   
   	private String readStdin(String message)
   	{
      	BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
      	System.out.println( message );
      	String out = null;
      	try
      	{
         	out= br.readLine();
      	}
      	catch (IOException e)
      	{
         	e.printStackTrace();
      	}
      	return out;
   	}

   	public void find(char aktuellerChar)
   	{
      	for (int i = 0; i < wort.length; i++)
      	{
         	if (this.wort[i] != aktuellerChar)
         	{
            	this.wort[i] = '*';
         	}
      	}
      	System.out.println(this.wort);
   	}

   	public String toString()
   	{
      	StringBuffer sb = new StringBuffer();
      	for (int i = 0; i < wort.length; i++)
      	{
         	sb.append(this.wort[i]);
      	}
      	return sb.toString();
   	}

   	public static void main(String[] args)
   	{
      	new Hangman();
   	}
}

Danke!
 

Marco13

Top Contributor
Habs jetzt nicht getestet, aber da muß wohl um den Teil
Code:
this.printUnsichtbaresWort();
         String s2 = this.readStdin("Geben Sie einen Buchstaben ein: ");
         char aktuellerChar = s2.charAt(0);
         this.find(aktuellerChar);
noch eine Schleife.

Also so in etwa
Code:
while (!wortErraten())
{
     // der teil von oben
}
und "wortErraten()" ist eine Funktion, die ein 'boolean' zurückgibt, das genau dann 'true' ist, wenn man alle Buchstaben gefunden hat.
 

Skinny

Mitglied
OK!
Also ich hab das verstanden wie du das meinst aber ich habe keine ahnung wie das geht mit diesem boolean????
 

Marco13

Top Contributor
Jo, hab nochmal drübergeschaut - in deiner find-Methode ersetzt du ja jedes mal, wenn ein Buchstabe des Wortes NICHT der gesuchte ist, den Buchstaben durch einen Stern. D.h. wenn du ein Wort hast
TEST
Dann gibt man "E" ein und es wird zu
*E**
Egal, welchen Buchstaben man dann eingibt: Es wird (FALLS ich das jetzt richtig sehe) nie wieder TEST dastehen können.

Du solltest in Erwägung ziehen, dir enimal das original-Wort zu speichern, und zusätzlich das aktuelle Wort mit den Sternchen. Etwa so
Code:
...
this.originalWort = s.toCharArray(); 
this.wort = (ein char-Array, der so lang ist, wie 'originalWort', aber nur * sternchen enthält);
Wenn dann ein Buchstabe eingegeben wird, kann man in der "find"-Methode 'wort' entrpechend mit den Daten aus dem originalWort füllen:
Code:
find(buchstabe)
{
    for (i=0, i<orignalWort.length)
    {
         if (originalWort[i] == buchstabe) wort[i] = buchstabe;
    }
}
D.h. wenn man einen Buchstaben eingibt, werden die * sternchen an den Stellen im 'wort' durch den Buchstaben ersetzt - wenn der Buchstabe an dieser Stelle im originalWort stand.

Die WortErraten-Methode liefert dann einfach zurück, ob das aktuelle 'wort' noch sternchen enthält.
Code:
boolean wortErraten()
{
    for (i=0, i<wort.length) if (wort[i] == '*') return false;
    return true;
}
 

Skinny

Mitglied
ok hab ich mal so eingegeben udn auch verstanden aber was ich noch nicht so versteh ist was du damit meinst:
Code:
this.wort = (ein char-Array, der so lang ist, wie 'originalWort', aber nur * sternchen enthält);

und wo ich die finde-Methode einfügen soll
 

Marco13

Top Contributor
Naja - am Anfang soll ja nur eine Reihe von Sternchen erscheinen. Im Moment machst du das indirekt in "printUnsichtbaresWort". Dort werden aber nur sternchen ausgegeben. Das Problem bei deinem bisherigen Ansatz ist/war, dass du zwar am Anfang das ganze Wort speicherst, aber nicht wirklich spielen konntest, weil du ja nicht weißt, welche Buchstaben schon richtig erraten wurden.

Dazu wäre es notwendig (oder zumindest sinnvoll) sich
1. Das komplette, eigegebene Wort zu speichern (als char-Array 'wort' bzw. 'originalWort') - als "Referenz", damit man immer weiß, um welches Wort es gerade geht.
2. Sich irgendwo zu speichern, welche Buchstaben schon erraten wurden - am besten in einem array, der am Anfang nur Sternchen enthält, die aber dann durch die eingegebenen Buchstaben ersetzt werden - bis am Ende der array das komplette Wort enthält.

Die fragliche Zeile sollte genau diesen Array erstellen, der (am Anfang) nur die Sternchen enthält, aber dann mit Buchstaben gefüllt wird.

this.wort = new char[originalWort.length];
for (i=0...wort.length) wort = '*'; // Ginge auch mit Arrays.fill(wort,0,wort.length, '*');
 

Skinny

Mitglied
Mhhhh... sry wenn ich nerven sollte aber ich hab wirklich kA von Java....
Ich hab das jetzt mal versucht umzusetzen:

Code:
import java.io.*;

public class Hangman
{
	char[] wort;

   	public Hangman()
   	{
      	this.StartGame();
   	}

  	void StartGame()
   	{
      	String s = this.readStdin("Spieler 1, bitte geben sie das Wort ein: ");
      	this.wort = s.toCharArray();
      	for (int k=0; k<=25; k=k+1)
		{
			System.out.println(" ");
		}
      	this.printUnsichtbaresWort();
      	this.wort = new char[originalWort.length];
		Arrays.fill(wort,0,wort.length, '*');
      	while (!wortErraten())
		{ 
      		String s2 = this.readStdin("Geben Sie einen Buchstaben ein: ");
      		char aktuellerChar = s2.charAt(0);
      		this.find(aktuellerChar);
     	}
   	}

   	void printUnsichtbaresWort()
   	{
      	for (int i =0; i < this.wort.length; i++)
      	{
        	 System.out.print("*");
      	}
      	System.out.println("\n");
   	}
   	
   	void find (int buchstabe; int originalWort)
	{
    	for (int o=0; o<=orignalWort.length;)
    	{
         	if (originalWort[o] == buchstabe) 
         	{
         	wort[o] = buchstabe;
         	}
    	}
	} 
   	 
   	String readStdin(String message)
   	{
      	BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
      	System.out.println( message );
      	String out = null;
      	try
      	{
         	out= br.readLine();
      	}
      	catch (IOException e)
      	{
         	e.printStackTrace();
      	}
      	return out;
   	}

   	void find(char aktuellerChar)
   	{
      	for (int i = 0; i < wort.length; i++)
      	{
         	if (this.wort[i] != aktuellerChar)
         	{
            	this.wort[i] = '*';
         	}
      	}
      	System.out.println(this.wort);
   	}
	
	boolean wortErraten()
	{
    	for (int l=0; l<wort.length;) 
    	{
    		if (wort[l] == '*')
    		{
    			return false;
    		}
    		return true;
    	}
   	} 
   	
   	public String toString()
   	{
      	StringBuffer sb = new StringBuffer();
      	for (int i = 0; i < wort.length; i++)
      	{
         	sb.append(this.wort[i]);
      	}
      	return sb.toString();
   	}

   	public static void main(String[] args)
   	{
      	new Hangman();
   	}
}

Hab aber immer noch Fehler und vielleicht kannst du sie ja in dem Quellcode verbesser.

Danke für deine Hilfe
 

Marco13

Top Contributor
Marco13 hat gesagt.:
Du solltest in Erwägung ziehen, dir enimal das original-Wort zu speichern, und zusätzlich das aktuelle Wort mit den Sternchen. Etwa so
Code:
...
this.originalWort = s.toCharArray(); 
this.wort = (ein char-Array, der so lang ist, wie 'originalWort', aber nur * sternchen enthält);
D.h. originalWort ist (genau wie 'wort') ein char-Array, der da deklariert ist, wo auch 'wort' rumliegt.
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben