This commit is contained in:
Edi
2019-06-05 22:18:59 +02:00
commit a2f9f3404f
13 changed files with 2546 additions and 0 deletions
+2
View File
@@ -0,0 +1,2 @@
Manifest-Version: 1.0
+330
View File
@@ -0,0 +1,330 @@
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;
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<Item> 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<Room> getRooms() {
return rooms;
}
public ArrayList<Item> getInventory() {
return inventory;
}
public ArrayList<String> getStory() {
return story;
}
}
+55
View File
@@ -0,0 +1,55 @@
public class Item
{
private int id;
private String name;
private boolean portableFlag;
private boolean hiddenFlag;
private String description;
public Item(String name)
{
this.name = name;
}
public String getDescription()
{
return description;
}
public void setDescription(String description)
{
this.description = description;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public boolean isPortableFlag() {
return portableFlag;
}
public void setPortableFlag(boolean portableFlag) {
this.portableFlag = portableFlag;
}
public boolean isHiddenFlag() {
return hiddenFlag;
}
public void setHiddenFlag(boolean hiddenFlag) {
this.hiddenFlag = hiddenFlag;
}
}
+119
View File
@@ -0,0 +1,119 @@
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
import java.io.IOException;
import java.io.PrintWriter;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
*
* @author Edi
*/
@WebServlet(urlPatterns = {"/Logic"})
public class Logic extends HttpServlet {
/**
* Processes requests for both HTTP <code>GET</code> and <code>POST</code>
* methods.
*
* @param request servlet request
* @param response servlet response
* @throws ServletException if a servlet-specific error occurs
* @throws IOException if an I/O error occurs
*/
Game g = new Game();
String context = "";
public void init() {
g.setVariables();
}
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException, Exception {
response.setContentType("text/html;charset=UTF-8");
try (PrintWriter out = response.getWriter()) {
/* TODO output your page here. You may use following sample code. */
out.println("<html><body><p>" + context + "</p></body></html>");
if (request.getParameter("alexaText") != null) {
context = context + "<br><br>" + request.getParameter("alexaText");
}
String input = request.getParameter("intent");
if (request.getParameter("slot") != null) {
input = input + " " + request.getParameter("slot");
}
if(input != null)
{
g.setInput(input);
g.play();
}
}
}
// <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
/**
* Handles the HTTP <code>GET</code> method.
*
* @param request servlet request
* @param response servlet response
* @throws ServletException if a servlet-specific error occurs
* @throws IOException if an I/O error occurs
*/
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setIntHeader("Refresh", 5);
try {
processRequest(request, response);
} catch (Exception ex) {
Logger.getLogger(Logic.class.getName()).log(Level.SEVERE, null, ex);
}
}
/**
* Handles the HTTP <code>POST</code> method.
*
* @param request servlet request
* @param response servlet response
* @throws ServletException if a servlet-specific error occurs
* @throws IOException if an I/O error occurs
*/
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setIntHeader("Refresh", 5);
try {
processRequest(request, response);
} catch (Exception ex) {
Logger.getLogger(Logic.class.getName()).log(Level.SEVERE, null, ex);
}
}
/**
* Returns a short description of the servlet.
*
* @return a String containing servlet description
*/
@Override
public String getServletInfo() {
return "Short description";
}// </editor-fold>
}
+120
View File
@@ -0,0 +1,120 @@
import java.util.ArrayList;
public class Puzzle
{
private int id;
private String name;
private ArrayList<Item> items = new ArrayList<Item>();
private String description="";
private boolean solved = false;
private String solvedText = "";
private boolean gameOverFlag=false;
private Room nextRoom = null;
private String dependencyText = null;
private Puzzle dependency=null;
public Puzzle(String name)
{
this.name = name;
}
public boolean hasDependency()
{
return dependency != null;
}
public void setDependency(Puzzle p)
{
dependency = p;
}
public void setDependencyText(String s)
{
dependencyText = s;
}
public Puzzle getDependency()
{
return dependency;
}
public String getDependencyText()
{
return dependencyText;
}
public int getId() {
return id;
}
public Room getNextRoom()
{
return nextRoom;
}
public void setId(int id) {
this.id = id;
}
public void addItem(Item i)
{
items.add(i);
}
public ArrayList<Item> getItems() {
return items;
}
public void setItems(ArrayList<Item> items) {
this.items = items;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getSolvedText() {
return solvedText;
}
public void setSolvedText(String solvedText) {
this.solvedText = solvedText;
}
public boolean isSolved() {
return solved;
}
public void setSolved(boolean solved) {
this.solved = solved;
}
public void setGameOverFlag(boolean b) {
// TODO Auto-generated method stub
gameOverFlag = b;
}
public boolean getGameOverFlag() {
// TODO Auto-generated method stub
return gameOverFlag;
}
public void setNextRoom(Room r)
{
nextRoom = r;
}
}
+69
View File
@@ -0,0 +1,69 @@
import java.util.ArrayList;
public class Room
{
private int id;
private String name;
private String description;
private boolean gameoverFlag;
ArrayList<Item> items = new ArrayList<>();
ArrayList<Puzzle> puzzles = new ArrayList<>();
public Room(String name)
{
this.name = name;
}
public Item getItem(String s)
{
for(Item i: items)
{
if(i.getName().equals(s))
return i;
}
return null;
}
public Puzzle getPuzzle(String s)
{
for(Puzzle p: puzzles)
{
if(p.getName().equals(s))
return p;
}
return null;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public boolean getGameoverFlag() {
return gameoverFlag;
}
public void setGameoverFlag(boolean gameOverFlag) {
gameoverFlag = gameOverFlag;
}
public ArrayList<Item> getItems() {
return items;
}
public ArrayList<Puzzle> getPuzzles() {
return puzzles;
}
}