Advertisement
Guest User

Untitled

a guest
Jun 20th, 2018
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.92 KB | None | 0 0
  1. package eu.pedu.adv18s._5_1100.mikp03_mikan.logika;
  2.  
  3. import static eu.pedu.adv18s._5_1100.mikp03_mikan.logika.Inventar.KAPACITA;
  4. import eu.pedu.adv18s_fw.game_txt.IPlace;
  5. import java.util.Collection;
  6. import java.util.Collections;
  7. import java.util.Set;
  8. import java.util.HashSet;
  9. import java.util.Map;
  10. import java.util.HashMap;
  11.  
  12. /**
  13. * Trida Prostor - popisuje jednotlivé prostory (místnosti) hry
  14. *
  15. * Tato třída je součástí jednoduché textové hry.
  16. *
  17. * "Prostor" reprezentuje jedno místo (místnost, prostor, ..) ve scénáři hry.
  18. * Prostor může mít sousední prostory připojené přes východy. Pro každý východ
  19. * si prostor ukládá odkaz na sousedící prostor.
  20. *
  21. * @author Michael Kolling, Lubos Pavlicek, Jarmila Pavlickova
  22. * @version pro školní rok 2016/2017
  23. */
  24. public class Prostor implements IPlace{
  25.  
  26. private String nazev;
  27. private String popis;
  28. private boolean jeVidet = true;
  29. private Set<Prostor> vychody;
  30. private Set<Vec> veci = new HashSet<Vec>();
  31. private Map<String, Postava> postavy;
  32. private String nazevObjektu;
  33.  
  34. /**
  35. * Konstruktor třídy
  36. *
  37. * @param nazev Název prostoru.
  38. * @param popis Popis prostoru.
  39. * @param nazvyObjektu Nazvy objektů.
  40. */
  41. public Prostor(String nazev, String popis, String ... nazvyObjektu) {
  42. this.nazev = nazev;
  43. this.popis = popis;
  44. this.nazevObjektu = nazevObjektu;
  45. this.jeVidet = jeVidet;
  46. vychody = new HashSet<>();
  47. postavy = new HashMap<>();
  48. for (String nazevObjektu : nazvyObjektu) {
  49. boolean zvednutelny = true;
  50. if (nazevObjektu.charAt(0) == ' ') {
  51. zvednutelny = false;
  52. nazevObjektu = nazevObjektu.substring(1);
  53. }
  54. veci.add(new Vec(nazevObjektu, zvednutelny));
  55. }
  56. }
  57.  
  58. /**
  59. * Definuje východ z prostoru (sousední/vedlejsi prostor). Vzhledem k tomu,
  60. * že je použit Set pro uložení východů, může být sousední prostor uveden
  61. * pouze jednou (tj. nelze mít dvoje dveře do stejné sousední místnosti).
  62. * Druhé zadání stejného prostoru tiše přepíše předchozí zadání (neobjeví se
  63. * žádné chybové hlášení). Lze zadat též cestu ze do sebe sama.
  64. *
  65. * @param vedlejsi prostor, který sousedi s aktualnim prostorem.
  66. *
  67. */
  68. public void setVychod(Prostor vedlejsi) {
  69. vychody.add(vedlejsi);
  70. }
  71.  
  72. /**
  73. * Metoda equals pro porovnání dvou prostorů. Překrývá se metoda equals ze
  74. * třídy Object. Dva prostory jsou shodné, pokud mají stejný název. Tato
  75. * metoda je důležitá z hlediska správného fungování seznamu východů (Set).
  76. *
  77. * Bližší popis metody equals je u třídy Object.
  78. *
  79. * @param o object, který se má porovnávat s aktuálním
  80. * @return hodnotu true, pokud má zadaný prostor stejný název, jinak false
  81. */
  82. @Override
  83. public boolean equals(Object o) {
  84. // porovnáváme zda se nejedná o dva odkazy na stejnou instanci
  85. if (this == o) {
  86. return true;
  87. }
  88. // porovnáváme jakého typu je parametr
  89. if (!(o instanceof Prostor)) {
  90. return false; // pokud parametr není typu Prostor, vrátíme false
  91. }
  92. // přetypujeme parametr na typ Prostor
  93. Prostor druhy = (Prostor) o;
  94.  
  95. //metoda equals třídy java.util.Objects porovná hodnoty obou názvů.
  96. //Vrátí true pro stejné názvy a i v případě, že jsou oba názvy null,
  97. //jinak vrátí false.
  98.  
  99. return (java.util.Objects.equals(this.nazev, druhy.nazev));
  100. }
  101.  
  102. /**
  103. * metoda hashCode vraci ciselny identifikator instance, ktery se pouziva
  104. * pro optimalizaci ukladani v dynamickych datovych strukturach. Pri
  105. * prekryti metody equals je potreba prekryt i metodu hashCode. Podrobny
  106. * popis pravidel pro vytvareni metody hashCode je u metody hashCode ve
  107. * tride Object
  108. */
  109. @Override
  110. public int hashCode() {
  111. int vysledek = 3;
  112. int hashNazvu = java.util.Objects.hashCode(this.nazev);
  113. vysledek = 37 * vysledek + hashNazvu;
  114. return vysledek;
  115. }
  116.  
  117.  
  118. /**
  119. * Vrací název prostoru (byl zadán při vytváření prostoru jako parametr
  120. * konstruktoru)
  121. *
  122. * @return název prostoru
  123. */
  124. public String getNazev() {
  125. return nazev;
  126. }
  127.  
  128. public String getNazevVeci() {
  129. return nazevObjektu;
  130. }
  131.  
  132. /**
  133. * Vrací "dlouhý" popis prostoru, který může vypadat následovně: Jsi v
  134. * mistnosti/prostoru vstupni hala budovy VSE na Jiznim meste. vychody:
  135. * chodba bufet ucebna
  136. *
  137. * @return Dlouhý popis prostoru
  138. */
  139. public String dlouhyPopis() {
  140. return "Jsi v mistnosti/prostoru " + popis + ".\n"
  141. + popisVychodu() +"\n"
  142. + getVeci() +"\n"
  143. + getPostavy();
  144. }
  145.  
  146. /**
  147. * Vrací textový řetězec, který popisuje sousední východy, například:
  148. * "vychody: hala ".
  149. *
  150. * @return Popis východů - názvů sousedních prostorů
  151. */
  152. private String popisVychodu() {
  153. String vracenyText = "východy: ";
  154. vracenyText = vychody.stream().filter((sousedni) ->
  155. (sousedni.jeVidet())).map((sousedni) ->
  156. " " + sousedni.getNazev()).reduce(vracenyText, String::concat);
  157. return vracenyText;
  158. }
  159.  
  160. /**
  161. * Vrací prostor, který sousedí s aktuálním prostorem a jehož název je zadán
  162. * jako parametr. Pokud prostor s udaným jménem nesousedí s aktuálním
  163. * prostorem, vrací se hodnota null.
  164. *
  165. * @param nazevSouseda Jméno sousedního prostoru (východu)
  166. * @return Prostor, který se nachází za příslušným východem, nebo hodnota
  167. * null, pokud prostor zadaného jména není sousedem.
  168. */
  169. public Prostor vratSousedniProstor(String nazevSouseda) {
  170. if (nazevSouseda == null) {
  171. return null;
  172. }
  173. for (Prostor sousedni : vychody) {
  174. if (sousedni.getNazev().equals(nazevSouseda)) {
  175. return sousedni;
  176. }
  177. }
  178. return null;
  179. }
  180.  
  181. /**
  182. * Metoda vloží věc.
  183. *
  184. * @param vec věc třídy Vec
  185. * @return boolean - true, pokud se to povede.
  186. */
  187. public boolean vlozVec(Vec vec){
  188. boolean zvedam = (veci.size() < KAPACITA) && veci.add(vec);
  189. return zvedam;
  190. }
  191.  
  192. /**
  193. * Metoda najde věc.
  194. *
  195. * @param nazevVeci třídy String
  196. * @return vrátí nalezenou věc v prostoru.
  197. */
  198. public Vec najdiVec(String nazevVeci){
  199. for (Vec vec : veci) {
  200. if (vec.getNazev().toLowerCase().equals(nazevVeci)) {
  201. return vec;
  202. }
  203. }
  204. return null;
  205. }
  206.  
  207. /**
  208. * Odebere věc.
  209. *
  210. * @param jmenoVeci třídy Vec
  211. * @return vrací buď jméno odebrané věci nebo nic
  212. */
  213. public Vec odeberVec(Vec jmenoVeci){
  214. jmenoVeci = jmenoVeci;
  215. for (Vec vec : veci) {
  216. if (vec.getNazev().toLowerCase().equals(jmenoVeci)) {
  217. return vec;
  218. }
  219. }
  220. return null;
  221. }
  222.  
  223. /**
  224. * Vrací seznam věcí z prostoru.
  225. *
  226. * @return vrací názvy věcí.
  227. */
  228.  
  229. public Collection<Vec> getVeci() {
  230. return Collections.unmodifiableCollection(veci);
  231.  
  232. }
  233.  
  234. /**
  235. * Metoda vrací seznam postav z prostoru.
  236. *
  237. * @return vrací názvy postav v prostoru
  238. */
  239.  
  240. public String getPostavy() {
  241. String nazvy = " jsou zde tyto postavy: ";
  242. nazvy = postavy.keySet().stream().map((jmenoPostav) ->
  243. jmenoPostav + " ").reduce(nazvy, String::concat);
  244. return nazvy;
  245. }
  246.  
  247. /**
  248. * Metoda, zda-li se nachází věc v prostoru.
  249. *
  250. * @param jmenoVeci třídy String
  251. * @return boolean - true, pokud ano.
  252. */
  253.  
  254. public boolean obsahujeVec(String jmenoVeci) {
  255. return veci.stream().anyMatch((vec) ->
  256. (vec.getNazev().toLowerCase().equals(jmenoVeci)));
  257. }
  258.  
  259. /**
  260. * Vloží postavu do prostoru.
  261. *
  262. * @param postava třída Postava.
  263. *
  264. * @return boolean - true, pokud se v prostoru nachází.
  265. */
  266.  
  267. public boolean vlozPostavu(Postava postava)
  268. {
  269. if(postavy.containsKey(postava.getJmeno())) {
  270. return false;
  271. }
  272. else{
  273. postavy.put(postava.getJmeno(),postava);
  274. return true;
  275. }
  276. }
  277.  
  278. /**
  279. * Metoda najde postavu.
  280. *
  281. * @param jmeno String jméno postavy
  282. * @return vrací jméno postavy
  283. */
  284.  
  285. public Postava najdiPostavu(String jmeno)
  286. {
  287. return postavy.get(jmeno);
  288. }
  289.  
  290. /**
  291. * Odebere postavu.
  292. *
  293. * @param jmeno String jméno postavy
  294. * @return odebere postavu
  295. */
  296. public Postava odeberPostavu(String jmeno){
  297. return postavy.remove(jmeno);
  298. }
  299.  
  300. /**
  301. * Nastaví viditelnost.
  302. *
  303. * @param viditelna boolean, jestli je mísntost viditelná
  304. */
  305. public void budeVidet(boolean viditelna ) {
  306. jeVidet = viditelna;
  307. }
  308.  
  309. /**
  310. * Zjistí, jestli je místnost viditelná.
  311. *
  312. * @return boolean - true, pokud je viditelná.
  313. */
  314. public boolean jeVidet() {
  315. return jeVidet;
  316. }
  317.  
  318. @Override
  319. public Collection<Prostor> getNeighbors() {
  320. return Collections.unmodifiableCollection(vychody);
  321. }
  322.  
  323. @Override
  324. public Collection<Vec> getItems() {
  325. return Collections.unmodifiableCollection(veci);
  326. }
  327.  
  328. @Override
  329. public String getName() {
  330. return getNazev();
  331. }
  332. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement