Sitzung: Jeden Freitag in der Vorlesungszeit ab 16 Uhr c. t. im MAR 0.005. In der vorlesungsfreien Zeit unregelmäßig (Jemensch da?). Macht mit!

Javakurs/Übungsaufgaben/Hangman/Musterloesung

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;}
			}
}