Javakurs/Übungsaufgaben/Hangman/Musterloesung
< Javakurs | Übungsaufgaben | Hangman
Version vom 2. März 2013, 11:44 Uhr von Alibaba (Diskussion | Beiträge) (verschob „Javakurs/Übungsaufgaben/Hangman/Musterlösung“ nach „Javakurs/Übungsaufgaben/Hangman/Musterloesung“: alle Musterlösungen mit oe da sonst tote Links entstehen)
Hangman
Hier meine Version des Galgenmännchens.
Sie verwendet die Terminal.java und ausserdem eine Wörterliste, weshalb ihr für die Ausführung diese braucht.
Am besten, ihr ladet euch das komplette Paket, bestehend aus Hangman.java, selectWord.java, wordlist.txt und Terminal.java herunter.
/* * @author: Kai Sisterhenn, Freitagsrunde, TU-Berlin * @version: 1.0 * @date: 01.05.2010 * Requirements: Terminal.java, wordlist.txt, SelectWord.java */ <nowiki> public class Hangman { public static void main(String[] args) { System.out.println("Welcome to ..... Hangman! \nNeues Spiel? (J, N)"); char newGame = Terminal.readChar(); boolean debug = false; if(args.length == 1){ // Prüfung, ob args vorhanden if( args[0].compareTo("1")==0){ // Denn sonst wird hier auf ein leeres Array getestet, was einen fehler wirft debug = true; // Debugmodus: Gibt das Wort am Anfang aus. } } if (newGame == 'J' || newGame == 'j') { do { newGame = game(debug); // Auf zum eigentlichen Spiel! } while (newGame == 'J' || newGame == 'j'); } else System.out.print("Exiting..."); } // --------------------------------------------------------------------------------------- public static char game(boolean db) { char[] hangman; char[] hangmanR; int n = 0; do { System.out.println("Wie lang soll das Wort werden?"); n = Terminal.readInt(); if(n > 34){ // Woerterbuch enthält Wörter mit max. 34 Buchstaben. System.out.println("Error, Wort zu lang!\n"); // Bei Wechseln des Wörterbuchs entsprechend aendern! } if (n >= 70 || n < 2) { System.out.println("Ach komm, jetzt aber nicht übertreiben ;)"); // Erste Schadensbegrenzung }} while (n > 34 || n < 2); hangman = worterstellung(n); hangmanR = pseudoworterstellung(n); if (db) { System.out.println(hangman); } int[][] u = new int[2][2]; // Uebergangsarray[2][2] u[0][0] = 0; // Fehler: aktuelle Stufe des Hangmans u[1][1] = 0; // Finish: Solange es 1 ist, geht das Spiel do { u = inputCheckPrint(hangman, hangmanR, n, u); // Auf zum Spielen und Überprüfen, } while (u[1][1] == 0); // solange kein Finish, repeat System.out.println("\n\nSpiel vorbei, erneut spielen? (J, N)"); char newGame = Terminal.readChar(); return newGame; } // ----------------------------------------------------------------------------------- public static char[] worterstellung(int n) { char[] hangman = new char[n]; hangman = SelectWord.selectWord(n).toUpperCase().toCharArray(); // String to Großbuchstaben to Char[] //Die Klasse SelectWort beschäftigt sich nur mit dem Wort aussuchen return hangman; } // ------------------------------------------------------------------------------ public static char[] pseudoworterstellung(int n) { char[] hangmanR = new char[n]; for (int i = 0; i < n; i++) { hangmanR[i] = '_'; // Für die "Fortschrittsanzeige" } return hangmanR; } // ---------------------------------------------------------------------------------- public static int[][] inputCheckPrint(char[] hangman, char[] hangmanR, int n, int[][] u) { System.out.println("\nBuchstabe?"); char l = Terminal.readChar(); if(l >= 97 && l <= 122){ l -= 32; } boolean fertig = false; // Spiel um? boolean success = false; // Richtigen Buchstaben geraten? for (int j = 0; j < n; j++) { if (hangman[j] == l) { // Wenn der eingegebene Buchstabe passt hangmanR[j] = l; // wird dieser im Fortschritt vermerkt success = true; } } if (success == false) { u[0][0] += 1; // Bei falschem Buchstaben geht der Fehlercount hoch fertig = buildHangman(u); // und die nächste Stufe des Hangmans wird gezeichnet } // ausserdem wird fertig = true, wenn der Hangman komplett ist System.out.println("Dein Fortschritt bisher:"); System.out.print(hangmanR); int finish = finish(fertig, hangmanR); // Auf, um die Endbedingungen zu prüfen! if (finish == 1) { // Check, ob Spiel vorbei und gewonnen u[1][1] = 1; System.out.print("\nGewonnen!!! :) Das Wort war: "); for (int i = 0; i < n; i++) { System.out.print(hangman[i]); } } if (finish == 2) { // Check ob Spiel vorbei und nicht gewonnen u[1][1] = 1; System.out.print("\nVerloren!!! :( Das Wort war: "); for (int i = 0; i < n; i++) { System.out.print(hangman[i]); } } return u; } // ----------------------------------------------------------------------------------- public static int finish(boolean fertig, char[] hangmanR) { int finish = 1; // finish: 1=User gewonnen, 2=User verloren, 0=Naechster Zug for (int i = 0; i < hangmanR.length; i++) { // Wenn noch ein "_" gefunden wird, kann das Wort noch nicht komplett sein if (hangmanR[i] == '_') { finish = 0; } } if (fertig) { // Wenn der Hangman fertig ist, ist das Spiel verloren finish = 2; } return finish; } // ------------------------------------------------------------------------------------------------- public static boolean buildHangman(int[][] u) { boolean fertig = false; System.out.println("Falsch!\nNoch " + (8 - u[0][0]) // Verbleibene Versuchen ausgeben + " Versuchen uebrig!"); maleMaennchen(u); // ASCII-Hangman je nach Versuche zeichnen if (u[0][0] == 8) { fertig = true; } return fertig; // Ist der Hangman komplett oder nicht? } // -------------------------------------------------------------------------------------------------- public static void maleMaennchen(int[][] u) { 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"); // created by Kais @ freitagsrunde . org 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; } } // Du bist durch! ;) } import java.io.*; class SelectWord { public static String selectWord(int n) { try { // Fehlerhandling String word = ""; boolean ende; double randomZahl; do{ ende = false; randomZahl = Math.random(); randomZahl *= 91681; // Da Math.random nur zwischen 0 und 1, *91000 (grob die Anzahl der Wörter im Wörterbuch) randomZahl = new Double(randomZahl).intValue(); // Math.random gibt auch kommazahlen, also cast nach int FileReader fr = new FileReader("wordlist.txt"); // Lade "wordlist.txt". Im selben Verzeichnis lagern! BufferedReader br = new BufferedReader(fr); // Lese aus dem File for(int i=1;i<randomZahl;i++){ // Lese eine zufällige Anzahl an Wörtern, damit br.readLine(); // der "Lesekopf" an der richtigen Stelle steht } do{ word = br.readLine(); // Nun das Wort auch speichern, falls if(word == null){ // das Wort nicht -Nichts- ist (Ende der Liste) und .... ende = true; break; // break verhindert eine Exception durch Erreichen des Listenendes } } // .... das Wort die geforderte Anzahl an Buchstaben hat, while(word.length() != n); // wenn nicht, nächstes Wort lesen usw. br.close(); // Buffer müssen auch wieder beendet werden, fr.close(); // da es ja wieder ins eigentliche Programm zurückgeht } while (ende); return word; } catch(Exception c) { // Falls es einen Fehler gibt (datei nicht lesbar usw) String word = "1"; // wird word = "1", was später als FehlerZeichen gesehen wird return word;} } }