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