import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.InputStreamReader; import java.net.URL; import java.util.ArrayList; import java.util.logging.Level; import java.util.logging.Logger; import java.net.HttpURLConnection; public class Game { private static ArrayList rooms = new ArrayList(); private static ArrayList inventory = new ArrayList(); private static ArrayList story = new ArrayList(); private boolean stoppFlag = false; String[] inputArray = null; String itemName = null; String intentName = null; String puzzleName = null; String input = null; Room currentRoom=null; Room keller; Puzzle schloss; Puzzle door; Item schluessel; Item tonne; public Game() { try { startGame(); } catch (Exception ex) { Logger.getLogger(Game.class.getName()).log(Level.SEVERE, null, ex); } } public void setVariables() { //Room Object keller = new Room("Keller"); keller.setDescription("Es ist totenstill, nichts und niemand bewegt sich. Man kann fast nichts erkennen au�er einem kleinen quadratischen Fenster �ber dir, durch dessen Gitterst�be der Mond sehr leicht scheint. " + "Trotz der Schmerzen in deinen Knochen versuchst du aufzustehen und zu fliehen, doch pl�tzlich merkst du, dass du nicht kannst!"); //Puzzle Object schloss = new Puzzle("Schloss"); schloss.setDescription("Es ist ein altes Schloss aus Metall, dass eine Einkerbung f�r einen Schl�ssel hat"); schloss.setSolvedText("Ja, es hat funktioniert! Mit einem Knacksen geht das Schloss auf und du kannst dich von deiner Beinfessel befreien. "); keller.puzzles.add(schloss); //Ausgang door = new Puzzle("Tuer"); door.setDescription("Ausgang aus dem Keller"); door.setGameOverFlag(true); door.setSolvedText("Geschafft! Die Tuer ist offen. Das Intro ist nun beendet"); keller.puzzles.add(door); //Item Object schluessel = new Item("Schluessel"); schluessel.setHiddenFlag(false); schluessel.setPortableFlag(true); schluessel.setDescription("Der Schl�ssel ist kalt und klein. Vielleicht hast du Gl�ck und er passt ins Schloss. Versuche es zu �ffnen!"); schloss.addItem(schluessel); keller.items.add(schluessel); door.setDependency(schloss); door.setDependencyText("Du musst erst das Schloss der Kette knacken um die Tür öffnen zu können"); //Item Object tonne = new Item("Muelltonne"); tonne.setHiddenFlag(false); tonne.setPortableFlag(false); tonne.setDescription("Eine schwarze M�lltonne. Sie stinkt f�rchterlich"); keller.items.add(tonne); rooms.add(keller); story.add("Dein ganzer K�rper schmerzt, du liegst auf Betonboden. Du f�ngst laut an zu husten und Staubklumpen fliegen aus deinem Mund. Du �ffnest langsam und nur schwer die Augen, " + "doch es ist fast gar nichts zu sehen. Die einzige Lichtquelle ist ein kleines Fenster �ber dir, durch die ein schwacher Mondschein f�llt. Es ist also Nachts... " + "Langsam versuchst du dich an die fast komplette Dunkelheit zu gew�hnen und erkennst, dass du dich in einem kleinen dir unbekannten Raum befindest. Dich packt die Angst! " + "Was ist passiert, wo bist du und wie bist du hier gelandet?" + "Du nimmst die Stahlkette in die Hand. Sie ist schwer und verrostet. Mit den H�nden tastest du dich voran bis an die Heizung, wo du ein Schloss an der Kette entdeckst." + "Das Mondlicht ist nur sehr schwach, um den Raum zu begutachten. Du gehst in die Knie und tastest mit deinem H�nden wild und in Panik am Betonboden. " + "Pl�tzlich st��t du auf einen kleinen Gegenstand, der sich tats�chlich anf�hlt wie ein Schl�ssel. Du solltest ihn aufheben"); keller.setDescription("der kleine Mondschein, der zuvor den unbekannten Raum schwach beleuchtet hat, leuchtet viel gr��er und viel heller und du erkennst nun den gesamten Raum. Er ist klein und d�ster. " + "überall h�ngen Spinnennetze und Staub sammelt sich am Betonboden. Du erkennst am anderen Ende des Raumes eine T�r"); currentRoom = keller; } public void play() { if (input.contains(" ")) { inputArray = input.split(" "); for (String s : inputArray) { if (currentRoom.getItem(s) != null) { itemName = s; } else if (currentRoom.getPuzzle(s) != null) { puzzleName = s; } else { intentName = s; } } } else { intentName = input; } switch (intentName.toLowerCase()) { //intent case "lookaroundintent": if (itemName == null && puzzleName == null) { lookaround(); } break; //intent case "inspectintent": if (itemName != null) { inspect(itemName); } else if (puzzleName != null) { inspect(puzzleName); } else { say("Das kann nicht untersucht werden"); } break; //intent case "examineintent": if (itemName == null && puzzleName == null) { examine(); } break; //intent case "takeintent": if (itemName != null) { take(currentRoom.getItem(itemName)); } else { say("das kann nicht mitgenommen werden"); } break; //intent case "openintent": if (puzzleName != null) { open(currentRoom.getPuzzle(puzzleName)); } else { say("das kann nicht geöffnet werden"); } break; } itemName = null; intentName = null; puzzleName = null; if (stoppFlag == true) { endGame(); } } public void lookaround() { say(currentRoom.getDescription()); } public void startGame() { for (int i = 0; i < story.size(); i++) { say(story.get(i)); } } public void inspect(String s) { Item currentItem = currentRoom.getItem(s); Puzzle currentPuzzle = currentRoom.getPuzzle(s); if (currentPuzzle != null) { say(currentPuzzle.getDescription()); } else if (currentItem != null) { say(currentItem.getDescription()); } } public void endGame() { say("Glückwunsch das Spiel ist beendet!"); setVariables(); } public void sendPost(String s) throws Exception { s = s.replace(" ", "%20"); String url = "https://medinf.efi.th-nuernberg.de/tomcat/WebAdventure/Logic"; URL obj = new URL(url); HttpURLConnection httpConn = (HttpURLConnection) obj.openConnection(); //add reuqest header httpConn.setRequestMethod("POST"); httpConn.setRequestProperty("User-Agent", "Mozilla/5.0"); httpConn.setRequestProperty("Accept-Language", "en-US,en;q=0.5"); // Send post request httpConn.setDoOutput(true); DataOutputStream wr = new DataOutputStream(httpConn.getOutputStream()); String urlParameters = "alexaText=" + s; wr.writeBytes(urlParameters); wr.flush(); wr.close(); //int responseCode = httpConn.getResponseCode(); //System.out.println("\nSending 'POST' request to URL : " + url); //System.out.println("Response Code : " + responseCode); BufferedReader in = new BufferedReader( new InputStreamReader(httpConn.getInputStream())); String inputLine; StringBuffer response = new StringBuffer(); while ((inputLine = in.readLine()) != null) { response.append(inputLine); } in.close(); //print result //System.out.println(response.toString()); } public void say(String s) { try { sendPost(s); } catch (Exception ex) { Logger.getLogger(Game.class.getName()).log(Level.SEVERE, null, ex); } } public void setInput(String s) { input = s; } public void setRoom(Room nextRoom) { currentRoom = nextRoom; say(currentRoom.getDescription()); } public void examine() { for (Item bag : inventory) { say(bag.getName()); } if (getInventory().isEmpty()) { say("Deine Taschen sind leer"); } } public void open(Puzzle currentPuzzle) { boolean isSolved = currentPuzzle.isSolved(); // sagt ob das Rätsel gelöst ist oder nicht ArrayList solveItems = currentPuzzle.getItems(); // Items die zum lösen des Rätsels benötigt werden if((currentPuzzle.hasDependency() && currentPuzzle.getDependency().isSolved()) || currentPuzzle.hasDependency() == false) { if (isSolved == false) { // ist ungelöst if (solveItems.isEmpty()) // kein Item zum lösen benötigt { currentPuzzle.setSolved(true); // auf gelöst setzen say(currentPuzzle.getSolvedText()); if (currentPuzzle.getNextRoom() != null) // falls es eine Tür ist wird in den nächsten Raum gewechselt { setRoom(currentPuzzle.getNextRoom()); } if (currentRoom.getGameoverFlag() == true || currentPuzzle.getGameOverFlag() == true) { // letzter Raum/Puzzle stoppFlag = true; } } else // Items werden zum lösen benötigt { if (getInventory().containsAll(solveItems)) { // alle benötigten Items befinden sich in deinem Inventar inventory.removeAll(currentRoom.getItems()); // entfernt all Items aus dem Inventar die für das lösen benötigt werden currentPuzzle.setSolved(true); // setze Rätsel auf gelöst say(currentPuzzle.getSolvedText()); if (currentRoom.getGameoverFlag() == true || currentPuzzle.getGameOverFlag() == true) { // letzter Raum stoppFlag = true; // Spielende } if (currentPuzzle.getNextRoom() != null) { // falls es eine Tür ist wird in den nächsten Raum gewechselt setRoom(currentPuzzle.getNextRoom()); } } else { say("dir fehlt noch etwas um das zu öffnen ..."); } } } else { // ist gelöst say(" ist bereits geöffnet"); } }else { say(currentPuzzle.getDependencyText()); } } public void take(Item i) { if ((!inventory.contains(i)) && (i.isPortableFlag() == true)) { inventory.add(i); currentRoom.items.remove(i); say(i.getName() + " wurde deiner Tasche hinzugefuegt"); } else if (i.isPortableFlag() == false) { say("Das Item kann nicht mitgenommen werden"); } else { say("Das Item befindet sich bereits in deiner Tasche!"); } } public ArrayList getRooms() { return rooms; } public ArrayList getInventory() { return inventory; } public ArrayList getStory() { return story; } }