You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

Game.java 21KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573
  1. import com.fasterxml.jackson.core.JsonEncoding;
  2. import com.fasterxml.jackson.core.JsonGenerator;
  3. import com.fasterxml.jackson.core.JsonParseException;
  4. import com.fasterxml.jackson.core.JsonParser;
  5. import com.fasterxml.jackson.core.type.TypeReference;
  6. import com.fasterxml.jackson.databind.JsonMappingException;
  7. import com.fasterxml.jackson.databind.ObjectMapper;
  8. import java.io.BufferedReader;
  9. import java.io.DataOutputStream;
  10. import java.io.File;
  11. import java.io.FileNotFoundException;
  12. import java.io.FileReader;
  13. import java.io.IOException;
  14. import java.io.InputStreamReader;
  15. import java.net.URL;
  16. import java.util.ArrayList;
  17. import java.util.logging.Level;
  18. import java.util.logging.Logger;
  19. import java.net.HttpURLConnection;
  20. import java.util.Map;
  21. import javax.json.stream.JsonGenerationException;
  22. public class Game {
  23. private static ArrayList<Room> rooms = new ArrayList<Room>();
  24. private static ArrayList<Item> inventory = new ArrayList<Item>();
  25. private static ArrayList<String> story = new ArrayList<String>();
  26. private static ArrayList<Item> items = new ArrayList<Item>();
  27. private static ArrayList<Puzzle> puzzles = new ArrayList<Puzzle>();
  28. private boolean stoppFlag = false;
  29. private Map<String, Object> jsonMap = null;
  30. private String[] inputArray = null;
  31. private String itemName = null;
  32. private String intentName = null;
  33. private String puzzleName = null;
  34. private String input = null;
  35. private Room currentRoom = null;
  36. private Room intro;
  37. private Room keller;
  38. private Puzzle durchgang;
  39. private Puzzle schloss;
  40. private Puzzle door;
  41. private Item schluessel;
  42. private Item stahlschluessel;
  43. public Game() {
  44. try {
  45. startGame();
  46. } catch (Exception ex) {
  47. Logger.getLogger(Game.class.getName()).log(Level.SEVERE, null, ex);
  48. }
  49. }
  50. public Map<String, Object> readJSON() throws IOException, Exception {
  51. //TODO: Define path!
  52. File file = new File("game.JSON");
  53. try {
  54. FileReader fr = new FileReader(file);
  55. BufferedReader br = new BufferedReader(fr);
  56. String jsonObject = br.readLine();
  57. ObjectMapper objectMapper = new ObjectMapper();
  58. try {
  59. jsonMap = objectMapper.readValue(jsonObject,
  60. new TypeReference<Map<String, Object>>() {
  61. });
  62. } catch (JsonParseException e) {
  63. // TODO Auto-generated catch block
  64. e.printStackTrace();
  65. } catch (JsonMappingException e) {
  66. // TODO Auto-generated catch block
  67. e.printStackTrace();
  68. } catch (IOException e) {
  69. // TODO Auto-generated catch block
  70. e.printStackTrace();
  71. }
  72. return jsonMap;
  73. } catch (FileNotFoundException e1) {
  74. // TODO Auto-generated catch block
  75. e1.printStackTrace();
  76. }
  77. return null;
  78. }
  79. public static String generateJSON() throws IOException {
  80. ObjectMapper mapper = new ObjectMapper();
  81. String s = "";
  82. try (
  83. JsonGenerator jGenerator
  84. = mapper.getFactory().createGenerator(
  85. new File("game.JSON"),
  86. JsonEncoding.UTF8)) {
  87. jGenerator.writeStartObject();
  88. jGenerator.writeObjectField("room", rooms);
  89. jGenerator.writeObjectField("puzzle", puzzles);
  90. jGenerator.writeObjectField("item", items);
  91. jGenerator.writeObjectField("story", story);
  92. jGenerator.writeEndObject();
  93. jGenerator.close();
  94. } catch (JsonGenerationException e) {
  95. e.printStackTrace();
  96. } catch (JsonMappingException e) {
  97. e.printStackTrace();
  98. } catch (IOException e) {
  99. e.printStackTrace();
  100. }
  101. BufferedReader reader = null;
  102. try {
  103. reader = new BufferedReader(new FileReader("game.JSON"));
  104. } catch (FileNotFoundException ex) {
  105. Logger.getLogger(Game.class.getName()).log(Level.SEVERE, null, ex);
  106. }
  107. StringBuilder sb = new StringBuilder();
  108. String line;
  109. while ((line = reader.readLine()) != null) {
  110. s = s + (line + "\n");
  111. }
  112. return s;
  113. }
  114. public void setVariables() throws Exception {
  115. // Intro Raum
  116. intro = new Room("Intro");
  117. intro.setDescription("Hier ist das Intro von Kidnappd");
  118. durchgang = new Puzzle("Durchgang");
  119. durchgang.setSolvedText("Hurra, du hast das Intro Level beendet");
  120. intro.puzzles.add(durchgang);
  121. //Raum Object
  122. keller = new Room("Keller");
  123. durchgang.setNextRoom(keller);
  124. 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. "
  125. + "überall h�ngen Spinnennetze und Staub sammelt sich am Betonboden. Du erkennst am anderen Ende des Raumes eine T�r");
  126. //Puzzle Object
  127. schloss = new Puzzle("Schloss");
  128. schloss.setDescription("Es ist ein altes Schloss aus Metall, dass eine Einkerbung f�r einen Schl�ssel hat");
  129. schloss.setSolvedText("Ja, es hat funktioniert! Mit einem Knacksen geht das Schloss auf und du kannst dich von deiner Beinfessel befreien. ");
  130. puzzles.add(schloss);
  131. keller.puzzles.add(schloss);
  132. //Ausgang
  133. door = new Puzzle("Tuer");
  134. door.setDescription("Ausgang aus dem Keller");
  135. door.setGameOverFlag(true);
  136. door.setSolvedText("Geschafft! Die Tuer ist offen. Das Intro ist nun beendet");
  137. keller.puzzles.add(door);
  138. puzzles.add(door);
  139. //Item Object
  140. schluessel = new Item("Schluessel");
  141. schluessel.setHiddenFlag(false);
  142. schluessel.setPortableFlag(true);
  143. schluessel.setDescription("Der Schl�ssel ist kalt und klein. Vielleicht hast du Gl�ck und er passt ins Schloss. Versuche es zu �ffnen!");
  144. schloss.addItem(schluessel);
  145. keller.items.add(schluessel);
  146. items.add(schluessel);
  147. door.setDependency(schloss);
  148. door.setDependencyText("Du musst erst das Schloss der Kette knacken um die Tür öffnen zu können");
  149. //Item Object
  150. stahlschluessel = new Item("Stahlschluessel");
  151. stahlschluessel.setHiddenFlag(false);
  152. stahlschluessel.setPortableFlag(false);
  153. stahlschluessel.setDescription("Ein Stahlschlüssel");
  154. intro.items.add(stahlschluessel);
  155. items.add(stahlschluessel);
  156. rooms.add(intro);
  157. rooms.add(keller);
  158. 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, "
  159. + "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... "
  160. + "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! "
  161. + "Was ist passiert, wo bist du und wie bist du hier gelandet?"
  162. + "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."
  163. + "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. "
  164. + "Pl�tzlich st��t du auf einen kleinen Gegenstand, der sich tats�chlich anf�hlt wie ein Schl�ssel. Du solltest ihn aufheben");
  165. currentRoom = intro;
  166. stoppFlag = false;
  167. inventory = new ArrayList<Item>();
  168. log("JSON: " + generateJSON());
  169. readJSON();
  170. log("Readjson fertig");
  171. ObjectMapper objectMapper = new ObjectMapper();
  172. objectMapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
  173. String jsonStringRoom = objectMapper.writeValueAsString(jsonMap.get("room"));
  174. String jsonStringItem = objectMapper.writeValueAsString(jsonMap.get("item"));
  175. String jsonStringPuzzle = objectMapper.writeValueAsString(jsonMap.get("puzzle"));
  176. String jsonStringStory = objectMapper.writeValueAsString(jsonMap.get("story"));
  177. log("Item: " + jsonStringItem);
  178. log("Room: " + jsonStringRoom);
  179. log("Story: " + jsonStringStory);
  180. log("Puzzle: " + jsonStringPuzzle);
  181. String[] st = objectMapper.readValue(jsonStringStory, String[].class);
  182. log("Story Array OK");
  183. Item[] it = objectMapper.readValue(jsonStringItem, Item[].class);
  184. log("Item Array OK");
  185. Puzzle[] pu = objectMapper.readValue(jsonStringPuzzle, Puzzle[].class);
  186. log("Puzzle Array OK");
  187. Room[] ro = objectMapper.readValue(jsonStringRoom, Room[].class);
  188. log("Room Array OK");
  189. for(int i=0; i < ro.length; i++)
  190. {
  191. log("Room: " + ro[i].getName());
  192. log("Description: " + ro[i].getDescription());
  193. }
  194. for(int i=0; i < it.length; i++)
  195. {
  196. log("Item: " + it[i].getName());
  197. log("Description: " + it[i].getDescription());
  198. }
  199. for(int i=0; i < pu.length; i++)
  200. {
  201. log("Puzzle: " + pu[i].getName());
  202. log("Description: " + pu[i].getDescription());
  203. log("DependencyText: " + pu[i].getDependencyText());
  204. }
  205. for(int i=0; i < st.length; i++)
  206. {
  207. log("Story: " + st[i]);
  208. }
  209. }
  210. public void play() throws Exception {
  211. log("play()");
  212. log("Input: " + input);
  213. log("currentRoom: " + currentRoom.getName());
  214. for (int i = 0; i < currentRoom.getPuzzles().size(); i++) {
  215. log("Puzzle im Raum: " + currentRoom.getPuzzles().get(i).getName());
  216. }
  217. for (int i = 0; i < currentRoom.getItems().size(); i++) {
  218. log("Item im Raum: " + currentRoom.getItems().get(i).getName());
  219. }
  220. input = input.replace("ä", "ae");
  221. input = input.replace("ü", "ue");
  222. input = input.replace("ö", "oe");
  223. input = input.replace("ß", "ss");
  224. if (input.contains(" ")) {
  225. inputArray = input.split(" ");
  226. for (String s : inputArray) {
  227. if (currentRoom.getItem(s) != null) {
  228. itemName = currentRoom.getItem(s).getName();
  229. log("itemName: " + itemName);
  230. } else if (currentRoom.getPuzzle(s) != null) {
  231. puzzleName = currentRoom.getPuzzle(s).getName();
  232. log("PuzzleName: " + puzzleName);
  233. } else {
  234. intentName = s;
  235. log("intentName: " + intentName);
  236. }
  237. }
  238. } else {
  239. intentName = input;
  240. log("intentName: " + intentName);
  241. }
  242. switch (intentName.toLowerCase()) {
  243. //intent
  244. case "lookaroundintent":
  245. log("Switch: LookAroundIntent");
  246. if (itemName == null && puzzleName == null) {
  247. lookaround();
  248. }
  249. break;
  250. //intent
  251. case "inspectintent":
  252. log("Switch: InspectIntent");
  253. if (currentRoom.getItem(itemName) != null) {
  254. inspect(currentRoom.getItem(itemName));
  255. } else if (currentRoom.getPuzzle(puzzleName) != null) {
  256. inspect(currentRoom.getPuzzle(puzzleName));
  257. }
  258. break;
  259. //intent
  260. case "examineintent":
  261. log("Switch: ExamineIntent");
  262. if (itemName == null && puzzleName == null) {
  263. examine();
  264. }
  265. break;
  266. //intent
  267. case "takeintent":
  268. log("Switch: TakeIntent");
  269. if (currentRoom.getItem(itemName) != null) {
  270. take(currentRoom.getItem(itemName));
  271. }
  272. break;
  273. //intent
  274. case "openintent":
  275. log("Switch: OpenIntent");
  276. if (currentRoom.getPuzzle(puzzleName) != null) {
  277. open(currentRoom.getPuzzle(puzzleName));
  278. }
  279. break;
  280. //intent
  281. case "resetintent":
  282. log("Switch: ResetIntent");
  283. if (itemName == null && puzzleName == null) {
  284. resetGame();
  285. }
  286. break;
  287. //intent
  288. case "skipintent":
  289. log("Switch: SkipIntent");
  290. if (itemName == null && puzzleName == null) {
  291. resetGame();
  292. for (int i = 0; i < currentRoom.puzzles.size(); i++) {
  293. if (currentRoom.puzzles.get(i).getNextRoom() != null) {
  294. setRoom(currentRoom.puzzles.get(i).getNextRoom());
  295. }
  296. }
  297. }
  298. break;
  299. }
  300. itemName = null;
  301. intentName = null;
  302. puzzleName = null;
  303. log("stoppFlag: " + stoppFlag);
  304. if (stoppFlag == true) {
  305. endGame();
  306. }
  307. }
  308. public void log(String s) throws Exception {
  309. String url = "https://medinf.efi.th-nuernberg.de/tomcat/WebAdventure/Log";
  310. URL obj = new URL(url);
  311. HttpURLConnection httpConn = (HttpURLConnection) obj.openConnection();
  312. //add reuqest header
  313. httpConn.setRequestMethod("POST");
  314. httpConn.setRequestProperty("User-Agent", "Mozilla/5.0");
  315. httpConn.setRequestProperty("Accept-Language", "en-US,en;q=0.5");
  316. // Send post request
  317. httpConn.setDoOutput(true);
  318. DataOutputStream wr = new DataOutputStream(httpConn.getOutputStream());
  319. String urlParameters = "log=" + s;
  320. wr.writeBytes(urlParameters);
  321. wr.flush();
  322. wr.close();
  323. BufferedReader in = new BufferedReader(
  324. new InputStreamReader(httpConn.getInputStream()));
  325. String inputLine;
  326. StringBuffer response = new StringBuffer();
  327. while ((inputLine = in.readLine()) != null) {
  328. response.append(inputLine);
  329. }
  330. in.close();
  331. }
  332. public void lookaround() throws Exception {
  333. log("lookaround()");
  334. say(currentRoom.getDescription());
  335. }
  336. public void startGame() throws Exception {
  337. log("startGame()");
  338. for (int i = 0; i < story.size(); i++) {
  339. say(story.get(i));
  340. }
  341. }
  342. public void resetGame() throws Exception {
  343. log("resetGame()");
  344. startGame();
  345. }
  346. public void inspect(Puzzle currentPuzzle) throws Exception {
  347. log("inspect(" + currentPuzzle.getName() + ")");
  348. for (int i = 0; i < currentRoom.getItems().size(); i++) {
  349. if (currentRoom.getPuzzles().get(i) == currentPuzzle) {
  350. say(currentPuzzle.getDescription());
  351. }
  352. }
  353. }
  354. public void inspect(Item currentItem) throws Exception {
  355. log("inspect(" + currentItem.getName() + ")");
  356. for (int i = 0; i < currentRoom.getItems().size(); i++) {
  357. if (currentRoom.getItems().get(i) == currentItem) {
  358. say(currentItem.getDescription());
  359. }
  360. }
  361. }
  362. public void endGame() throws Exception {
  363. log("endGame()");
  364. say("Glückwunsch das Spiel ist beendet!");
  365. setVariables();
  366. }
  367. public void sendPost(String s) throws Exception {
  368. s = s.replace(" ", "%20");
  369. String url = "https://medinf.efi.th-nuernberg.de/tomcat/WebAdventure/IO";
  370. URL obj = new URL(url);
  371. HttpURLConnection httpConn = (HttpURLConnection) obj.openConnection();
  372. //add reuqest header
  373. httpConn.setRequestMethod("POST");
  374. httpConn.setRequestProperty("User-Agent", "Mozilla/5.0");
  375. httpConn.setRequestProperty("Accept-Language", "en-US,en;q=0.5");
  376. // Send post request
  377. httpConn.setDoOutput(true);
  378. DataOutputStream wr = new DataOutputStream(httpConn.getOutputStream());
  379. String urlParameters = "alexaText=" + s;
  380. wr.writeBytes(urlParameters);
  381. wr.flush();
  382. wr.close();
  383. BufferedReader in = new BufferedReader(
  384. new InputStreamReader(httpConn.getInputStream()));
  385. String inputLine;
  386. StringBuffer response = new StringBuffer();
  387. while ((inputLine = in.readLine()) != null) {
  388. response.append(inputLine);
  389. }
  390. in.close();
  391. }
  392. public void say(String s) throws Exception {
  393. log("say(" + s + ")");
  394. try {
  395. sendPost(s);
  396. } catch (Exception ex) {
  397. Logger.getLogger(Game.class.getName()).log(Level.SEVERE, null, ex);
  398. }
  399. }
  400. public void setInput(String s) throws Exception {
  401. log("setInput(" + s + ")");
  402. input = s;
  403. }
  404. public void setRoom(Room nextRoom) throws Exception {
  405. log("setRoom(" + nextRoom.getName() + ")");
  406. currentRoom = nextRoom;
  407. say(currentRoom.getDescription());
  408. }
  409. public void examine() throws Exception {
  410. log("examine() : " + getInventory());
  411. if (getInventory().isEmpty()) {
  412. say("Deine Taschen sind leer");
  413. } else if (inventory.size() >= 1) {
  414. say("In deinen Taschen befindet sich: ");
  415. }
  416. inventory.forEach((bag) -> {
  417. try {
  418. say(bag.getName());
  419. } catch (Exception ex) {
  420. Logger.getLogger(Game.class.getName()).log(Level.SEVERE, null, ex);
  421. }
  422. });
  423. }
  424. public void open(Puzzle currentPuzzle) throws Exception {
  425. log("open(" + currentPuzzle.getName() + ") ");
  426. if (currentPuzzle.isSolved()) // bereits gelöst
  427. {
  428. say("ist bereits geöffnet");
  429. if (currentPuzzle.getNextRoom() != null) // wenn es eine Tür ist die in den nächsten Raum führt
  430. {
  431. setRoom(currentPuzzle.getNextRoom()); // wechselt in den nächsten Raum
  432. }
  433. return;
  434. }
  435. if (!currentPuzzle.hasDependency() || currentPuzzle.getDependency().isSolved()) // ist keine Abhängigkeit vorhanden oder aber die Abhängigkeit ist gelöst
  436. {
  437. if (currentPuzzle.getItems().isEmpty() || getInventory().containsAll(currentPuzzle.getItems())) // keine Items zum lösen notwendig oder alle Items zum lösen befinden sich im Inventar
  438. {
  439. currentPuzzle.setSolved(true); // auf gelöst setzen
  440. say(currentPuzzle.getSolvedText()); // Lösungstext
  441. if (currentRoom.getGameoverFlag() || currentPuzzle.getGameOverFlag()) // Wenn es das letzte Rätsel im Spiel war oder man vom Angreifer erwischt wurde
  442. {
  443. stoppFlag = true; // Spiel wird nun beendet
  444. }
  445. if (currentPuzzle.getNextRoom() != null) // wenn es eine Tür ist die in den nächsten Raum führt
  446. {
  447. setRoom(currentPuzzle.getNextRoom()); // wechselt in den nächsten Raum
  448. }
  449. } else // Item zum lösen fehlt
  450. {
  451. say("das geht leider nicht, da fehlt noch etwas");
  452. }
  453. }
  454. if (!currentPuzzle.getDependency().isSolved()) // Abhängigkeit nicht gelöst
  455. {
  456. say(currentPuzzle.getDependencyText());
  457. }
  458. }
  459. public void take(Item currentItem) throws Exception {
  460. log("take(" + currentItem.getName() + ") ");
  461. if ((!inventory.contains(currentItem)) && (currentItem.isPortableFlag() == true)) {
  462. inventory.add(currentItem);
  463. currentRoom.items.remove(currentItem);
  464. say(currentItem.getName() + " wurde deiner Tasche hinzugefuegt");
  465. } else if (currentItem.isPortableFlag() == false) {
  466. say("Das Item kann nicht mitgenommen werden");
  467. } else {
  468. say("Das Item befindet sich bereits in deiner Tasche!");
  469. }
  470. }
  471. public ArrayList<Room> getRooms() {
  472. return rooms;
  473. }
  474. public ArrayList<Item> getInventory() {
  475. return inventory;
  476. }
  477. public ArrayList<String> getStory() {
  478. return story;
  479. }
  480. }