WebAdventure/src/java/Game.java

324 lines
12 KiB
Java
Raw Normal View History

2019-06-05 22:18:59 +02:00
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<Room> rooms = new ArrayList<Room>();
private static ArrayList<Item> inventory = new ArrayList<Item>();
private static ArrayList<String> story = new ArrayList<String>();
private boolean stoppFlag = false;
String[] inputArray = null;
String itemName = null;
String intentName = null;
String puzzleName = null;
String input = null;
2019-06-21 06:43:29 +02:00
Room currentRoom = null;
2019-06-05 22:18:59 +02:00
2019-06-21 06:43:29 +02:00
Room intro;
2019-06-05 22:18:59 +02:00
Room keller;
2019-06-21 06:43:29 +02:00
Puzzle durchgang;
2019-06-05 22:18:59 +02:00
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() {
2019-06-21 07:07:32 +02:00
// Intro Raum
2019-06-21 06:43:29 +02:00
intro = new Room("Intro");
intro.setDescription("Hier ist das Intro von Kidnappd");
2019-06-21 07:07:32 +02:00
durchgang = new Puzzle("Durchgang");
2019-06-21 06:43:29 +02:00
durchgang.setSolvedText("Hurra, du hast das Intro Level beendet");
2019-06-21 07:07:32 +02:00
intro.puzzles.add(durchgang);
//Raum Object
2019-06-05 22:18:59 +02:00
keller = new Room("Keller");
2019-06-21 07:07:32 +02:00
durchgang.setNextRoom(keller);
2019-06-21 06:43:29 +02:00
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");
2019-06-05 22:18:59 +02:00
//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);
2019-06-21 06:43:29 +02:00
2019-06-05 22:18:59 +02:00
door.setDependency(schloss);
door.setDependencyText("Du musst erst das Schloss der Kette knacken um die Tür öffnen zu können");
2019-06-21 06:43:29 +02:00
2019-06-05 22:18:59 +02:00
//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);
2019-06-21 06:43:29 +02:00
rooms.add(intro);
2019-06-05 22:18:59 +02:00
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");
2019-06-21 06:43:29 +02:00
currentRoom = intro;
stoppFlag = false;
inventory = new ArrayList<Item>();
2019-06-05 22:18:59 +02:00
}
public void play() {
if (input.contains(" ")) {
inputArray = input.split(" ");
2019-06-21 06:43:29 +02:00
2019-06-05 22:18:59 +02:00
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 {
2019-06-21 06:43:29 +02:00
s = s.replace(" ", "%20");
String url = "https://medinf.efi.th-nuernberg.de/tomcat/WebAdventure/IO";
2019-06-05 22:18:59 +02:00
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");
2019-06-21 06:43:29 +02:00
} else if (inventory.size() >= 1) {
say("In deinen Taschen befindet sich: ");
2019-06-05 22:18:59 +02:00
}
2019-06-21 06:43:29 +02:00
inventory.forEach((bag) -> {
say(bag.getName());
});
2019-06-05 22:18:59 +02:00
}
public void open(Puzzle currentPuzzle) {
2019-06-21 06:43:29 +02:00
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
2019-06-05 22:18:59 +02:00
{
2019-06-21 06:43:29 +02:00
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
2019-06-05 22:18:59 +02:00
2019-06-21 06:43:29 +02:00
if (currentRoom.getGameoverFlag() || currentPuzzle.getGameOverFlag()) // Wenn es das letzte Rätsel im Spiel war oder man vom Angreifer erwischt wurde
2019-06-05 22:18:59 +02:00
{
2019-06-21 06:43:29 +02:00
stoppFlag = true; // Spiel wird nun beendet
2019-06-05 22:18:59 +02:00
}
2019-06-21 06:43:29 +02:00
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
2019-06-05 22:18:59 +02:00
}
2019-06-21 06:43:29 +02:00
} else // Item zum lösen fehlt
2019-06-05 22:18:59 +02:00
{
2019-06-21 06:43:29 +02:00
say("das geht leider nicht, da fehlt noch etwas");
2019-06-05 22:18:59 +02:00
}
}
2019-06-21 06:43:29 +02:00
if (!currentPuzzle.getDependency().isSolved()) // Abhängigkeit nicht gelöst
2019-06-05 22:18:59 +02:00
{
say(currentPuzzle.getDependencyText());
}
}
2019-06-21 06:43:29 +02:00
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) {
2019-06-05 22:18:59 +02:00
say("Das Item kann nicht mitgenommen werden");
} else {
say("Das Item befindet sich bereits in deiner Tasche!");
}
}
public ArrayList<Room> getRooms() {
return rooms;
}
public ArrayList<Item> getInventory() {
return inventory;
}
public ArrayList<String> getStory() {
return story;
}
}