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 20KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595
  1. import com.fasterxml.jackson.core.JsonParseException;
  2. import com.fasterxml.jackson.core.JsonParser;
  3. import com.fasterxml.jackson.core.type.TypeReference;
  4. import com.fasterxml.jackson.databind.JsonMappingException;
  5. import com.fasterxml.jackson.databind.ObjectMapper;
  6. import java.io.BufferedReader;
  7. import java.io.DataOutputStream;
  8. import java.io.File;
  9. import java.io.FileNotFoundException;
  10. import java.io.FileReader;
  11. import java.io.IOException;
  12. import java.io.InputStreamReader;
  13. import java.net.URL;
  14. import java.util.ArrayList;
  15. import java.util.logging.Level;
  16. import java.util.logging.Logger;
  17. import java.net.HttpURLConnection;
  18. import java.util.Arrays;
  19. import java.util.Map;
  20. import java.util.Objects;
  21. public class Game {
  22. private ArrayList<Room> rooms = new ArrayList<>();
  23. private ArrayList<Item> inventory = new ArrayList<>();
  24. private ArrayList<String> story = new ArrayList<>();
  25. private ArrayList<Item> items = new ArrayList<>();
  26. private ArrayList<Puzzle> puzzles = new ArrayList<>();
  27. private boolean stoppFlag = false;
  28. private Map<String, Object> jsonMap = null;
  29. private String[] inputArray = null;
  30. private Integer id = 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. public Game() {
  37. try {
  38. setVariables();
  39. } catch (Exception ex) {
  40. Logger.getLogger(Game.class.getName()).log(Level.SEVERE, null, ex);
  41. }
  42. }
  43. public Game(Integer i) {
  44. try {
  45. id = i;
  46. setVariables();
  47. } catch (Exception ex) {
  48. Logger.getLogger(Game.class.getName()).log(Level.SEVERE, null, ex);
  49. }
  50. }
  51. public Map<String, Object> readJSON() throws IOException, Exception {
  52. //TODO: Define path!
  53. File file = new File("game.JSON");
  54. try {
  55. FileReader fr = new FileReader(file);
  56. BufferedReader br = new BufferedReader(fr);
  57. String jsonObject = br.readLine();
  58. log(jsonObject);
  59. ObjectMapper objectMapper = new ObjectMapper();
  60. try {
  61. jsonMap = objectMapper.readValue(jsonObject, new TypeReference<Map<String, Object>>() {
  62. });
  63. } catch (JsonParseException e) {
  64. // TODO Auto-generated catch block
  65. } catch (JsonMappingException e) {
  66. // TODO Auto-generated catch block
  67. } catch (IOException e) {
  68. // TODO Auto-generated catch block
  69. }
  70. objectMapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
  71. String jsonStringItem = objectMapper.writeValueAsString(jsonMap.get("item"));
  72. String jsonStringStory = objectMapper.writeValueAsString(jsonMap.get("story"));
  73. String jsonStringPuzzle = objectMapper.writeValueAsString(jsonMap.get("puzzle"));
  74. String jsonStringRoom = objectMapper.writeValueAsString(jsonMap.get("room"));
  75. log("Story: " + jsonStringStory);
  76. String[] st = objectMapper.readValue(jsonStringStory, String[].class);
  77. log("Story einlesen fertig");
  78. log("Item: " + jsonStringItem);
  79. Item[] it = objectMapper.readValue(jsonStringItem, Item[].class);
  80. log("Items einlesen fertig");
  81. log("Puzzle: " + jsonStringPuzzle);
  82. Puzzle[] pu = objectMapper.readValue(jsonStringPuzzle, Puzzle[].class);
  83. log("Puzzles einlesen fertig");
  84. log("Room: " + jsonStringRoom);
  85. Room[] ro = objectMapper.readValue(jsonStringRoom, Room[].class);
  86. log("Rooms einlesen fertig");
  87. story.addAll(Arrays.asList(st));
  88. items.addAll(Arrays.asList(it));
  89. rooms.addAll(Arrays.asList(ro));
  90. puzzles.addAll(Arrays.asList(pu));
  91. return jsonMap;
  92. } catch (FileNotFoundException e1) {
  93. // TODO Auto-generated catch block
  94. }
  95. return null;
  96. }
  97. public void setVariables() throws Exception {
  98. readJSON();
  99. log("JSON einlesen beendet");
  100. currentRoom = rooms.get(0);
  101. stoppFlag = false;
  102. inventory = new ArrayList<>();
  103. }
  104. public String prepareInput(String s) {
  105. //s = s.replace("ä", "ae");
  106. //s = s.replace("ü", "ue");
  107. //s = s.replace("ö", "oe");
  108. s = s.replace("ß", "ss");
  109. s = s.toLowerCase();
  110. return s;
  111. }
  112. public void play() throws Exception {
  113. log("play()");
  114. log("Input: " + input);
  115. log("Aktueller Raum " + currentRoom.getName());
  116. for (int i = 0; i < currentRoom.puzzles.size(); i++) {
  117. log("Puzzle: " + getPuzzleById(currentRoom.puzzles.get(i)).getName() + " ID: " + getPuzzleById(currentRoom.puzzles.get(i)).getId());
  118. }
  119. for (int i = 0; i < currentRoom.items.size(); i++) {
  120. log("Item: " + getItemById(currentRoom.items.get(i)).getName() + " ID: " + getItemById(currentRoom.items.get(i)).getId());
  121. }
  122. input = prepareInput(input);
  123. log("vor if");
  124. if (input.contains(" ")) {
  125. log("if");
  126. inputArray = input.split(" ");
  127. for (String s : inputArray) {
  128. if (getItemByName(s) != null) {
  129. itemName = getItemByName(s).getName();
  130. log("itemName: " + itemName);
  131. } else if (getPuzzleByName(s) != null) {
  132. puzzleName = getPuzzleByName(s).getName();
  133. log("PuzzleName: " + puzzleName);
  134. } else {
  135. if (intentName == null) {
  136. intentName = s;
  137. log("intentName: " + intentName);
  138. }
  139. }
  140. }
  141. } else {
  142. intentName = input;
  143. log("intentName: " + intentName);
  144. }
  145. log("vor switch");
  146. switch (intentName) {
  147. //intent
  148. case "lookaroundintent":
  149. log("Switch: LookAroundIntent");
  150. if (itemName == null && puzzleName == null) {
  151. lookaround();
  152. } else {
  153. say("ich kann mich nur in Räumen umschauen. Falls sie Gegenstände untersuchen wollen, sagen dessen Namen und untersuchen");
  154. }
  155. break;
  156. //intent
  157. case "inspectintent":
  158. log("Switch: InspectIntent");
  159. if (itemName != null) {
  160. inspect(getItemByName(itemName));
  161. } else if (puzzleName != null) {
  162. inspect(getPuzzleByName(puzzleName));
  163. }
  164. break;
  165. //intent
  166. case "examineintent":
  167. log("Switch: ExamineIntent");
  168. if (itemName == null && puzzleName == null) {
  169. examine();
  170. } else {
  171. say("Wenn ich meine Taschen durchsuchen soll dann sagen sie Taschen durchsuchen.");
  172. }
  173. break;
  174. //intent
  175. case "takeintent":
  176. log("Switch: TakeIntent");
  177. if (itemName != null) {
  178. take(getItemByName(itemName));
  179. } else {
  180. say("Ich kann diesen Gegenstand nicht finden");
  181. }
  182. break;
  183. //intent
  184. case "openintent":
  185. log("Switch: OpenIntent");
  186. if (puzzleName != null) {
  187. open(getPuzzleByName(puzzleName));
  188. } else {
  189. say("Könnten Sie das wiederholen? Ich habe das leider nicht verstanden.");
  190. }
  191. break;
  192. //intent
  193. case "resetintent":
  194. log("Switch: ResetIntent");
  195. if (itemName == null && puzzleName == null) {
  196. resetGame();
  197. } else {
  198. say("das habe ich leider nicht verstanden, wiederholen sie das bitte?");
  199. }
  200. break;
  201. //intent
  202. case "skipintent":
  203. log("Switch: SkipIntent");
  204. if (itemName == null && puzzleName == null) {
  205. resetGame();
  206. for (int i = 0; i < currentRoom.puzzles.size(); i++) {
  207. if (getPuzzleById(currentRoom.puzzles.get(i)).getNextRoom() != null) {
  208. setRoom(getRoomById(getPuzzleById(currentRoom.puzzles.get(i)).getNextRoom()));
  209. }
  210. }
  211. } else {
  212. say("leider habe ich das nicht verstanden.können sie das wiederholen?");
  213. }
  214. break;
  215. case "resumeintent":
  216. log("Switch: ResumeIntent");
  217. break;
  218. case "startintent":
  219. log("Switch: StartIntent");
  220. startGame();
  221. break;
  222. default:
  223. log("Switch: Intent nicht vorhanden");
  224. say("Das habe ich leider nicht verstanden, könnten Sie das wiederholen?");
  225. break;
  226. }
  227. itemName = null;
  228. intentName = null;
  229. puzzleName = null;
  230. if (stoppFlag == true) {
  231. endGame();
  232. }
  233. }
  234. public Item getItemByName(String s) throws Exception {
  235. for (int i = 0; i < currentRoom.items.size(); i++) {
  236. String n = getItemById(currentRoom.items.get(i)).getName().toLowerCase();
  237. if (n.equals(s.toLowerCase())) {
  238. return getItemById(currentRoom.items.get(i));
  239. }
  240. }
  241. return null;
  242. }
  243. public Puzzle getPuzzleByName(String s) throws Exception {
  244. for (int i = 0; i < currentRoom.puzzles.size(); i++) {
  245. String n = getPuzzleById(currentRoom.puzzles.get(i)).getName().toLowerCase();
  246. if (n.equals(s.toLowerCase())) {
  247. return getPuzzleById(currentRoom.puzzles.get(i));
  248. }
  249. }
  250. return null;
  251. }
  252. public Room getRoomById(Integer i) throws Exception {
  253. for (int j = 0; j < rooms.size(); j++) {
  254. if (Objects.equals(i, rooms.get(j).getId())) {
  255. return rooms.get(j);
  256. }
  257. }
  258. return null;
  259. }
  260. public Item getItemById(Integer i) throws Exception {
  261. for (int j = 0; j < items.size(); j++) {
  262. if (Objects.equals(items.get(j).getId(), i)) {
  263. return items.get(j);
  264. }
  265. }
  266. return null;
  267. }
  268. public Puzzle getPuzzleById(Integer i) throws Exception {
  269. for (int j = 0; j < puzzles.size(); j++) {
  270. if (Objects.equals(puzzles.get(j).getId(), i)) {
  271. return puzzles.get(j);
  272. }
  273. }
  274. return null;
  275. }
  276. public void log(String s) throws Exception {
  277. String url = "https://medinf.efi.th-nuernberg.de/tomcat/WebAdventure/Log";
  278. URL obj = new URL(url);
  279. HttpURLConnection httpConn = (HttpURLConnection) obj.openConnection();
  280. //add reuqest header
  281. httpConn.setRequestMethod("POST");
  282. httpConn.setRequestProperty("User-Agent", "Mozilla/5.0");
  283. httpConn.setRequestProperty("Accept-Language", "de-DE,de;q=0.5");
  284. // Send post request
  285. httpConn.setDoOutput(true);
  286. try (DataOutputStream wr = new DataOutputStream(httpConn.getOutputStream())) {
  287. String urlParameters = "log=" + s;
  288. wr.writeBytes(urlParameters);
  289. wr.flush();
  290. }
  291. BufferedReader in = new BufferedReader(
  292. new InputStreamReader(httpConn.getInputStream()));
  293. String inputLine;
  294. StringBuffer response = new StringBuffer();
  295. while ((inputLine = in.readLine()) != null) {
  296. response.append(inputLine);
  297. }
  298. in.close();
  299. }
  300. public void lookaround() throws Exception {
  301. log("lookaround()");
  302. say(currentRoom.getDescription() + ".");
  303. }
  304. public Integer getId() {
  305. return id;
  306. }
  307. public void setId(Integer i) {
  308. id = i;
  309. }
  310. public void startGame() throws Exception {
  311. log("startGame()");
  312. say(story.get(0));
  313. }
  314. public void resetGame() throws Exception {
  315. log("resetGame()");
  316. setVariables();
  317. startGame();
  318. }
  319. public void inspect(Puzzle currentPuzzle) throws Exception {
  320. log("inspect(" + currentPuzzle.getName() + ")");
  321. for (int i = 0; i < currentRoom.getItems().size(); i++) {
  322. if (Objects.equals(currentRoom.getPuzzles().get(i), currentPuzzle.getId())) {
  323. say(currentPuzzle.getDescription() + ".");
  324. return;
  325. } else {
  326. log("Else Reset");
  327. };
  328. }
  329. }
  330. public void inspect(Item currentItem) throws Exception {
  331. log("inspect(" + currentItem.getName() + ")");
  332. for (int i = 0; i < currentRoom.getItems().size(); i++) {
  333. if (Objects.equals(currentRoom.getItems().get(i), currentItem.getId())) {
  334. say(currentItem.getDescription());
  335. return;
  336. } else {
  337. log("Else Inspect");
  338. };
  339. }
  340. }
  341. public void endGame() throws Exception {
  342. log("endGame()");
  343. say("Glückwunsch der Durchlauf ist beendet! Das Spiel starte nun von vorne.");
  344. setVariables();
  345. }
  346. public void sendPost(String s) throws Exception {
  347. s = s.replace(" ", "%20");
  348. String url = "https://medinf.efi.th-nuernberg.de/tomcat/WebAdventure/IO";
  349. URL obj = new URL(url);
  350. HttpURLConnection httpConn = (HttpURLConnection) obj.openConnection();
  351. //add reuqest header
  352. httpConn.setRequestMethod("POST");
  353. httpConn.setRequestProperty("User-Agent", "Mozilla/5.0");
  354. httpConn.setRequestProperty("Accept-Language", "de-DE,de;q=0.5");
  355. // Send post request
  356. httpConn.setDoOutput(true);
  357. DataOutputStream wr = new DataOutputStream(httpConn.getOutputStream());
  358. String urlParameters = "alexaText=" + s;
  359. wr.writeBytes(urlParameters);
  360. wr.flush();
  361. wr.close();
  362. BufferedReader in = new BufferedReader(
  363. new InputStreamReader(httpConn.getInputStream()));
  364. String inputLine;
  365. StringBuffer response = new StringBuffer();
  366. while ((inputLine = in.readLine()) != null) {
  367. response.append(inputLine);
  368. }
  369. in.close();
  370. }
  371. public void say(String s) throws Exception {
  372. log("say(" + s + ")");
  373. try {
  374. sendPost(s);
  375. } catch (Exception ex) {
  376. Logger.getLogger(Game.class.getName()).log(Level.SEVERE, null, ex);
  377. }
  378. }
  379. public void setInput(String s) throws Exception {
  380. log("setInput(" + s + ")");
  381. input = s;
  382. }
  383. public void setRoom(Room nextRoom) throws Exception {
  384. log("setRoom(" + nextRoom.getName() + ")");
  385. log(nextRoom.getDescription());
  386. currentRoom = null;
  387. currentRoom = nextRoom;
  388. }
  389. public void examine() throws Exception {
  390. log("examine() : " + getInventory());
  391. String s = "In deinen Taschen befindet sich: ";
  392. if (getInventory().isEmpty()) {
  393. say("Deine Taschen sind leer.");
  394. } else {
  395. for (int i = 0; i < inventory.size(); i++) {
  396. s = s + " " + inventory.get(i).getName();
  397. }
  398. say(s);
  399. }
  400. }
  401. public void open(Puzzle currentPuzzle) throws Exception {
  402. log("open(" + currentPuzzle.getName() + ") ");
  403. log("Puzzle gelöst?: " + currentPuzzle.isSolved());
  404. if (currentPuzzle.isSolved()) // bereits gelöst
  405. {
  406. log("Bereits gelöst: " + currentPuzzle.isSolved());
  407. if (currentPuzzle.getNextRoom() != null) // wenn es eine Tür ist die in den nächsten Raum führt
  408. {
  409. say("das Räsel ist bereits gelöst. Sie betreten den nächsten Raum.");
  410. log("nächster Raum: " + currentPuzzle.getNextRoom());
  411. setRoom(getRoomById(currentPuzzle.getNextRoom())); // wechselt in den nächsten Raum
  412. }
  413. }
  414. log(" " + checkDependency(currentPuzzle));
  415. if (!checkDependency(currentPuzzle)) // ist keine Abhängigkeit vorhanden oder aber die Abhängigkeit ist gelöst
  416. {
  417. log("Abhängigkeit: " + currentPuzzle.hasDependency());
  418. log("" + checkPuzzleItemsInInventory(currentPuzzle) + "");
  419. if (checkPuzzleItemsInInventory(currentPuzzle)) // keine Items zum lösen notwendig oder alle Items zum lösen befinden sich im Inventar
  420. {
  421. say(currentPuzzle.getSolvedText()); // Lösungstext
  422. currentPuzzle.setSolved(true); // auf gelöst setzen
  423. if (checkGameOver(currentPuzzle)) // Wenn es das letzte Rätsel im Spiel war oder man vom Angreifer erwischt wurde
  424. {
  425. stoppFlag = true; // Spiel wird nun beendet
  426. log("Gameover");
  427. }
  428. if (currentPuzzle.getNextRoom() != null) // wenn es eine Tür ist die in den nächsten Raum führt
  429. {
  430. log("Nächster Raum: " + getRoomById(currentPuzzle.getNextRoom()).getName());
  431. log(currentPuzzle.getNextRoom() + "");
  432. setRoom(getRoomById(currentPuzzle.getNextRoom())); // wechselt in den nächsten Raum
  433. }
  434. } else // Item zum lösen fehlt
  435. {
  436. say("das geht leider nicht, hier fehlt noch etwas.");
  437. }
  438. }
  439. if (getPuzzleById(currentPuzzle.getDependency()) != null) {
  440. if (!getPuzzleById(currentPuzzle.getDependency()).isSolved()) // Abhängigkeit nicht gelöst
  441. {
  442. say(currentPuzzle.getDependencyText() + ".");
  443. }
  444. }
  445. }
  446. public boolean checkDependency(Puzzle currentPuzzle) {
  447. if (currentPuzzle.hasDependency()) {
  448. return true;
  449. }
  450. try {
  451. if (getPuzzleById(currentPuzzle.getDependency()) != null) {
  452. if (getPuzzleById(currentPuzzle.getDependency()).isSolved()) {
  453. return true;
  454. }
  455. }
  456. } catch (Exception ex) {
  457. Logger.getLogger(Game.class.getName()).log(Level.SEVERE, null, ex);
  458. }
  459. return false;
  460. }
  461. public boolean checkGameOver(Puzzle currentPuzzle) {
  462. if (currentRoom.getGameoverFlag() == true) {
  463. return true;
  464. }
  465. if (currentPuzzle.getGameOverFlag() == true) {
  466. return true;
  467. }
  468. return false;
  469. }
  470. public void take(Item currentItem) throws Exception {
  471. log("take(" + currentItem.getName() + ") ");
  472. if ((!inventory.contains(currentItem)) && (currentItem.isPortableFlag() == true)) {
  473. inventory.add(currentItem);
  474. currentRoom.items.remove(currentItem.getId());
  475. say(currentItem.getName() + " wurde deiner Tasche hinzugefuegt.");
  476. } else if (currentItem.isPortableFlag() == false) {
  477. say("Das Item kann nicht mitgenommen werden.");
  478. } else if (inventory.contains(currentItem)) {
  479. say("Das Item befindet sich bereits in deiner Tasche!");
  480. }
  481. }
  482. public boolean checkPuzzleItemsInInventory(Puzzle currentPuzzle) throws Exception { // checkt ob ob alle Items benötigten Items im Inventar sind oder ob Items gebraucht werden
  483. if (currentPuzzle.getItems().isEmpty()) { // keine Items zum lösen notwendig
  484. return true;
  485. } else { // durchsucht ob alle nötigen Items im Inventar sind
  486. for (int i = 0; i < currentPuzzle.getItems().size(); i++) {
  487. if (inventory.contains(getItemById(currentPuzzle.getItems().get(i)))) {
  488. } else {
  489. return false;
  490. }
  491. }
  492. return true;
  493. }
  494. }
  495. public ArrayList<Item> getInventory() {
  496. return inventory;
  497. }
  498. }