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 intro; Room keller; Puzzle durchgang; 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 intro = new Room("Intro"); intro.setDescription("Hier ist das Intro von Kidnappd"); intro.puzzles.add(durchgang); durchgang.setNextRoom(keller); durchgang.setSolvedText("Hurra, du hast das Intro Level beendet"); keller = new Room("Keller"); 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"); //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(intro); 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"); currentRoom = intro; stoppFlag = false; inventory = new ArrayList(); } 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/IO"; 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(); BufferedReader in = new BufferedReader( new InputStreamReader(httpConn.getInputStream())); String inputLine; StringBuffer response = new StringBuffer(); while ((inputLine = in.readLine()) != null) { response.append(inputLine); } in.close(); } 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() { if (getInventory().isEmpty()) { say("Deine Taschen sind leer"); } else if (inventory.size() >= 1) { say("In deinen Taschen befindet sich: "); } inventory.forEach((bag) -> { say(bag.getName()); }); } public void open(Puzzle currentPuzzle) { if (currentPuzzle.isSolved()) // bereits gelöst { say("ist bereits geöffnet"); if (currentPuzzle.getNextRoom() != null) // wenn es eine Tür ist die in den nächsten Raum führt { setRoom(currentPuzzle.getNextRoom()); // wechselt in den nächsten Raum } return; } if (!currentPuzzle.hasDependency() || currentPuzzle.getDependency().isSolved()) // ist keine Abhängigkeit vorhanden oder aber die Abhängigkeit ist gelöst { if (currentPuzzle.getItems().isEmpty() || getInventory().containsAll(currentPuzzle.getItems())) // keine Items zum lösen notwendig oder alle Items zum lösen befinden sich im Inventar { currentPuzzle.setSolved(true); // auf gelöst setzen say(currentPuzzle.getSolvedText()); // Lösungstext if (currentRoom.getGameoverFlag() || currentPuzzle.getGameOverFlag()) // Wenn es das letzte Rätsel im Spiel war oder man vom Angreifer erwischt wurde { stoppFlag = true; // Spiel wird nun beendet } if (currentPuzzle.getNextRoom() != null) // wenn es eine Tür ist die in den nächsten Raum führt { setRoom(currentPuzzle.getNextRoom()); // wechselt in den nächsten Raum } } else // Item zum lösen fehlt { say("das geht leider nicht, da fehlt noch etwas"); } } if (!currentPuzzle.getDependency().isSolved()) // Abhängigkeit nicht gelöst { say(currentPuzzle.getDependencyText()); } } public void take(Item currentItem) { if ((!inventory.contains(currentItem)) && (currentItem.isPortableFlag() == true)) { inventory.add(currentItem); currentRoom.items.remove(currentItem); say(currentItem.getName() + " wurde deiner Tasche hinzugefuegt"); } else if (currentItem.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; } }