Guten Tag liebe Community,
ich habe die letzten Tage an einem Projekt für die Schule gearbeitet - Galgenmännchen als Programm für die Konsole. Der Programmablauf ist wie folgt:
Der Code sieht wie folgt aus:
Klasse "Hangman"
Klasse "Terminal"
Klasse "Wortauswahl"
Das nun auftauchende Problem, das ich alleine leider nicht gelöst bekomme, ist folgendes:
Wenn ich nun das Programm starte, funktioniert alles wunderbar, bis zu dem Punkt, wo die Eingabe des "Tipps" registriert und verarbeitet werden soll. Das Programm überspringt diesen Schritt immer, gibt die Grafik und die Meldung aus,dass der Tipp falsch war, und beginnt mit der Abfrage nach dem nächsten "Tipp".
Hat vielleicht jemand von Euch eine Idee, was ich falsch gemacht habe?
Auch für andere Verbesserungsvorschläge bin ich jederzeit offen,
LG Anta
ich habe die letzten Tage an einem Projekt für die Schule gearbeitet - Galgenmännchen als Programm für die Konsole. Der Programmablauf ist wie folgt:
- Begrüßung des Spielers, Spielbeginn durch Eingabe des Buchstaben 'J' / 'j'
- Abfrage der vom Spieler eingegebenen Wortlänge, Zufallsauswahl eines passenden Wortes aus einer .txt-Datei und Beginn des Spiels
- Abfrage des vom Spieler eingegebenen "Tipps"; Überprüfung, ob dieser in dem gewählten Wort vorkommt
- Je nach Ergebnis von 3. Ausgabe des Galgens (in 8 Schritten) oder eine Success-Nachricht
- Erneutes Fragen nach einem "Tipp"
- Usw...
- Beenden des Programmes oder Neustart per 'J' / 'j' oder 'N' / 'n'
Der Code sieht wie folgt aus:
Klasse "Hangman"
Java:
package me.xyz.Hangman;
public class Hangman {
public static void main (String[] args) {
System.out.println("Willkommen bei Galgenmännchen.\nStarte ein neues Spiel mit 'J'\nBeende das Programm mit 'N'");
char newGame = Terminal.readChar();
boolean debug = false;
if (args.length == 1) {
if(args[0].compareTo("1") == 0) {
debug = true;
}
}
if (newGame == 'J' || newGame == 'j') {
do {
System.out.println("Das Spiel beginnt!");
newGame = game(debug);
} while (newGame == 'J' || newGame == 'j');
} else {
System.out.println("Spiel wird beendet...");
}
}
//----------------------------------------------------------------------------------------------------------
public static char game(boolean db) {
char[] wort;
char[] wortPseudo;
int n = wortLaengeFinden();
wort = wortErstellen(n);
wortPseudo = wortPseudoErstellen(n);
if (db) {
System.out.println(wort);
}
int[][] u = new int[2][2];
u[0][0] = 0;
u[1][1] = 0;
do {
u = eingabePruefen(wort, wortPseudo, n, u);
} while (u[1][1] == 0);
System.out.println("\n\n\n Das Spiel ist vorbei! Möchtest du erneut spielen?\'J' für Ja\n'N' für Nein");
char newGame = Terminal.readChar();
return newGame;
}
//-----------------------------------------------------------------------------------------------------------
private static char[] wortPseudoErstellen(int n) {
char[] wortPseudo = new char[n];
for (int i = 0; i < n; i++) {
wortPseudo[i] = '_';
}
return wortPseudo;
}
//-----------------------------------------------------------------------------------------------------------
private static char[] wortErstellen(int n) {
char[] wort = Wortauswahl.wortAuswahl(n).toUpperCase().toCharArray();
return wort;
}
//-----------------------------------------------------------------------------------------------------------
private static int wortLaengeFinden() {
int n = 0;
do {
System.out.println("Wähle die Länge des Wortes!");
n = Terminal.readInt();
if (n > 34 || n < 2) {
System.out.println("Das macht keinen Sinn.\nBitte nimm eine normale Länge");
}
} while (n > 34 || n < 2);
return n;
}
//-----------------------------------------------------------------------------------------------------------
private static int[][] eingabePruefen(char[] wort, char[] wortPseudo, int n, int[][] u) {
System.out.println("Welchen Buchstaben willst du raten?");
char versuch = Terminal.readChar();
boolean fertig = false;
boolean erfolg = false;
for (int i = 0; i < n; i++) {
if (wort[i] == versuch) {
wortPseudo[i] = versuch;
erfolg = true;
}
}
if (erfolg == false) {
u[0][0] += 1;
fertig = erstelleGrafik(u);
}
System.out.println("Dein Forschritt:");
System.out.println(wortPseudo);
int beenden = beenden(fertig, wortPseudo);
if (beenden == 1) {
u[1][1] = 1;
System.out.println("Gewonnen! :) Du hattest Recht! Das Wort war:");
System.out.println(wort);
}
if (beenden == 2) {
u[1][1] = 1;
System.out.println("Verloren! :( Du lagst daneben! Richtig wäre gewesen:");
System.out.println(wort);
}
return u;
}
//-----------------------------------------------------------------------------------------------------------
private static int beenden(boolean fertig, char[] wortPseudo) {
int beenden = 1;
for (int i = 0; i < wortPseudo.length; i++) {
if (wortPseudo[i] == '_') {
beenden = 0;
}
}
if (fertig) {
beenden = 2;
}
return beenden;
}
//-----------------------------------------------------------------------------------------------------------
private static boolean erstelleGrafik(int[][] u) {
boolean fertig = false;
switch (u[0][0]) { // Je nach Fehler unterschiedliche Galgen-Stufen
case 1:
System.out.println("\n __\n| |\n| |\n| |\n| |\n| |\n| |\n| |\n| |\n| |\n| |\n| |\n| |\n| |\n| |\n| |\n| |\n| |\n\"\"\"\n|\"|\n| |\n: :\n. .");
break;
case 2:
System.out.println("\n _\n| |\n| | / /\n| |/ /\n| | /\n| |/\n| |\n| |\n| |\n| |\n| |\n| |\n| |\n| |\n| |\n| |\n| |\n| |\n\"\"\"\n|\"|\n| |\n: :\n. .\n ");
break;
case 3:
System.out.println("\n ___________________\n| ._________________|\n| | / /\n| |/ /\n| | /\n| |/\n| |\n| |\n| |\n| |\n| |\n| |\n| |\n| |\n| |\n| |\n| |\n| |\n\"\"\"\n|\"|\n| |\n: :\n. .\n");
break;
case 4:
System.out.println("\n ____________________\n| .__________________|\n| | / /\n| |/ /\n| | /\n| |/\n| |\n| |\n| |\n| |\n| |\n| |\n| |\n| |\n| |\n| |\n| |\n| |\n\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"|\n|\"|\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"|\"|\n| | | |\n: : : :\n. . . .\n");
break;
case 5:
System.out.println("\n ___________.._______\n| .__________))______|\n| | / / ||\n| |/ / ||\n| | / ||\n| |/ ||\n| | ||\n| | ||\n| | ||\n| | (\\__\n| | `--'\n| |\n| |\n| |\n| |\n| |\n| |\n| |\n\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"|\n|\"|\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"|\"|\n| | | |\n: : : :\n. . . .\n");
break;
case 6:
System.out.println("\n" + " ___________.._______\n"
+ "| .__________))______|\n" + "| | / / ||\n"
+ "| |/ / ||\n" + "| | / || .-''.\n"
+ "| |/ || / _ \\\n"
+ "| | || | `/,|\n"
+ "| | (\\\\_ \\`_.'\n"
+ "| | `- .-'--'.\n"
+ "| | /Y . . Y\\\n"
+ "| | // | | \\\\\n"
+ "| | // | . | \\\\\n"
+ "| | ') | | (`\n"
+ "| | ||'||\n" + "| | || ||\n"
+ "| | || ||\n" + "| | || ||\n"
+ "| | /_| |_\\\n"
+ "\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"|\n"
+ "|\"|\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"|\"|\n"
+ "| | | |\n"
+ ": : : :\n"
+ ". . . .\n ");
break;
case 7:
System.out.println("\n" + " ___________.._______\n"
+ "| .__________))______|\n" + "| | / / ||\n"
+ "| |/ / ||\n" + "| | / ||.-''.\n"
+ "| |/ |/ _ \\\n" + "| | || `/,|\n"
+ "| | (\\\\`_.'\n" + "| | .-`--'.\n"
+ "| | /Y . . Y\\\n" + "| | // | | \\\n"
+ "| | // | . | \\\n" + "| | ') | | (`\n"
+ "| | ||'||\n" + "| | || ||\n"
+ "| | || ||\n" + "| | || ||\n"
+ "| | /_| |_\\\n"
+ "\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"|\n"
+ "|\"|\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"|\"|\n"
+ "| | | |\n"
+ ": : : :\n"
+ ". . . .\n");
break;
case 8:
System.out.println("\n" + " ___________.._______\n"
+ "| .__________))______|\n" + "| | / / ||\n"
+ "| |/ / ||\n" + "| | / ||.-''.\n"
+ "| |/ |/ _ \\\n" + "| | || `/,|\n"
+ "| | (\\\\`_.'\n" + "| | .-`--'.\n"
+ "| | /Y . . Y\\\\\n" + "| | // | | \\\\\n"
+ "| | // | . | \\\\\n"
+ "| | ') | | (`\n" + "| | ||'||\n"
+ "| | || ||\n" + "| | || ||\n"
+ "| | || ||\n" + "| | / | | \\\n"
+ "\"\"\"\"\"\"\"\"\"\"|_`-' `-' |\"\"\"|\n"
+ "|\"|\"\"\"\"\"\"\"\\ \\ '\"|\"|\n"
+ "| | \\ \\ | |\n"
+ ": : \\ \\ : :\n"
+ ". . `' . .\n");
break;
}
System.out.println("Das war falsch!Du hast noch " + (8 - u[0][0]) + " Versuche.");
if (u[0][0] == 8) {
fertig = true;
}
return fertig;
}
}
Klasse "Terminal"
Java:
package me.xyz.Hangman;
import java.io.*;
import java.util.*;
public class Terminal {
public static char readChar () {
int x = 0;
InputStreamReader R = new InputStreamReader(System.in);
try {
x = R.read();
}
catch (IOException e1) { System.out.println("***ERROR***"); }
return (char) x;
}
//-----------------------------------------------------------------------------------------------------------
public static int readInt () {
StringTokenizer tokenizer = getTokenizer();
while (true) {
try {
String token = tokenizer.nextToken();
return Integer.valueOf(token).intValue();
}
catch (NoSuchElementException e1) {System.out.println("***ERROR***");}
catch (NumberFormatException e2) {System.out.println("***ERROR***");}
}//while
}
//-----------------------------------------------------------------------------------------------------------
private static StringTokenizer getTokenizer () {
String line;
StringTokenizer tok = null;
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
try {
line = reader.readLine();
if (line == null) { throw new IOException(); }
tok = new StringTokenizer(line);
}
catch (IOException e) {System.out.println("***ERROR***");}
return tok;
}
}
Klasse "Wortauswahl"
Java:
package me.xyz.Hangman;
import java.io.*;
public class Wortauswahl {
public static String wortAuswahl(int n) {
try {
String wort = "";
boolean ende;
double zufallsZahl;
do {
ende = false;
zufallsZahl = Math.random();
zufallsZahl *= 91681;
zufallsZahl = new Double(zufallsZahl).intValue();
FileReader ausleser = new FileReader("wordlist.txt");
BufferedReader br = new BufferedReader(ausleser);
for (int i = 1; i < zufallsZahl; i++) {
br.readLine();
}
do {
wort = br.readLine();
if (wort == null) {
ende = true;
break;
}
} while (wort.length() != n);
br.close();
ausleser.close();
}
while (ende = true);
return wort;
}
catch (Exception c) {
String wort = "Problem";
return wort;
}
}
}
Das nun auftauchende Problem, das ich alleine leider nicht gelöst bekomme, ist folgendes:
Wenn ich nun das Programm starte, funktioniert alles wunderbar, bis zu dem Punkt, wo die Eingabe des "Tipps" registriert und verarbeitet werden soll. Das Programm überspringt diesen Schritt immer, gibt die Grafik und die Meldung aus,dass der Tipp falsch war, und beginnt mit der Abfrage nach dem nächsten "Tipp".
Hat vielleicht jemand von Euch eine Idee, was ich falsch gemacht habe?
Auch für andere Verbesserungsvorschläge bin ich jederzeit offen,
LG Anta