PageRenderTime 43ms CodeModel.GetById 13ms RepoModel.GetById 1ms app.codeStats 0ms

/src/tpalgo1/Juego.java

https://bitbucket.org/JanGames/algo1tp2
Java | 389 lines | 299 code | 90 blank | 0 comment | 48 complexity | cf490e2547a5dbf093ff49045dcc3e86 MD5 | raw file
  1. package tpalgo1;
  2. import java.io.IOException;
  3. import java.io.Writer;
  4. import java.util.ArrayList;
  5. import java.util.HashMap;
  6. import java.util.List;
  7. import java.util.Map;
  8. import java.util.StringTokenizer;
  9. public class Juego
  10. {
  11. private Tablero tablero;
  12. private List<Personaje> personajes;
  13. private Map<String, Posicion> posiciones;
  14. @Override
  15. public String toString() {
  16. return "Tablero: " + tablero + "\n" + "Personajes: " + personajes + "\n" + "Posiciones: " +
  17. posicionesString(this);
  18. };
  19. public Juego(List<Personaje> Personajes, Map<String, Posicion> Posiciones, Tablero NTablero)
  20. {
  21. tablero = NTablero;
  22. personajes = Personajes;
  23. posiciones = Posiciones;
  24. }
  25. public Tablero getTablero()
  26. {
  27. return tablero;
  28. }
  29. public ArrayList<Personaje> getPersonajes()
  30. {
  31. return (ArrayList<Personaje>) personajes;
  32. }
  33. public Posicion posicion(Personaje NPersonaje)
  34. {
  35. return posiciones.get(NPersonaje.getNombre());
  36. }
  37. public boolean jaqueMate(Personaje NPersonaje)
  38. {
  39. boolean jaqueMate = false;
  40. int i = 0;
  41. while(i < personajes.size()) {
  42. Personaje personaje = personajes.get(i);
  43. if(personaje != NPersonaje && personaje.getVidaActual() > 0) {
  44. int j = 0;
  45. while(j < personaje.getHabilidades().size()) {
  46. Habilidad habilidad = personaje.getHabilidades().get(j);
  47. if(distancia(posicion(personaje), posicion(NPersonaje)) <= habilidad.getRango() &&
  48. habilidad.getTipo() != TipoHabilidad.Sanar &&
  49. NPersonaje.getVidaActual() <= habilidad.getPoder()) { jaqueMate = true; }
  50. j++;
  51. }
  52. }
  53. i++;
  54. }
  55. return jaqueMate;
  56. }
  57. public ArrayList<Personaje> victimasPorCercania(Personaje NPersonaje)
  58. {
  59. ArrayList<Personaje> victimas = new ArrayList<Personaje>();
  60. int i = 0;
  61. while(i < personajes.size()) {
  62. Personaje personaje = personajes.get(i);
  63. if(personaje.getVidaActual() > 0) {
  64. int j = 0;
  65. while(j < NPersonaje.getHabilidades().size()) {
  66. Habilidad habilidad = NPersonaje.getHabilidades().get(j);
  67. if(distancia(posicion(NPersonaje), posicion(personaje)) <= habilidad.getRango())
  68. { victimas.add(personaje); break; }
  69. j++;
  70. }
  71. }
  72. i++;
  73. }
  74. ArrayList<Integer> distancias = new ArrayList<Integer>();
  75. i = 0;
  76. while(i < victimas.size()) {
  77. Personaje victima = victimas.get(i);
  78. distancias.add(distancia(posicion(NPersonaje), posicion(victima)));
  79. i++;
  80. }
  81. i = 1;
  82. while(i < victimas.size()) {
  83. int j = i;
  84. while(j > 0 && distancias.get(j - 1) > distancias.get(j)) {
  85. Integer anterior = distancias.get(j - 1);
  86. distancias.set(j - 1, distancias.get(j));
  87. distancias.set(j, anterior);
  88. Personaje pAnterior = victimas.get(j - 1);
  89. victimas.set(j - 1, victimas.get(j));
  90. victimas.set(j, pAnterior);
  91. j--;
  92. }
  93. i++;
  94. }
  95. return victimas;
  96. }
  97. public ArrayList<Posicion> posicionesSeguras(Personaje NPersonaje)
  98. {
  99. ArrayList<Posicion> posiciones = new ArrayList<Posicion>();
  100. int i = 0;
  101. while(i < tablero.getAncho()) {
  102. int j = 0;
  103. while(j < tablero.getAlto()) {
  104. int k = 0;
  105. while(k < personajes.size()) {
  106. Personaje personaje = personajes.get(k);
  107. int h = 0;
  108. if(personaje.getVidaActual() > 0) {
  109. while(h < personaje.getHabilidades().size()) {
  110. Habilidad habilidad = personaje.getHabilidades().get(h);
  111. Posicion posicion = new Posicion(i, j);
  112. if(distancia(posicion(NPersonaje), posicion) > habilidad.getRango() &&
  113. distancia(posicion(NPersonaje), posicion) <= NPersonaje.getVelocidad())
  114. { posiciones.add(posicion); }
  115. h++;
  116. }
  117. }
  118. k++;
  119. }
  120. j++;
  121. }
  122. i++;
  123. }
  124. return posiciones;
  125. }
  126. public ArrayList<Personaje> losMasPoderosos()
  127. {
  128. int maximo = -1;
  129. int i = 0;
  130. while(i < personajes.size()) {
  131. int poder = personajes.get(i).getNivelPoder();
  132. if(poder > maximo) { maximo = poder; }
  133. i++;
  134. }
  135. i = 0;
  136. ArrayList<Personaje> poderosos = new ArrayList<Personaje>();
  137. while(i < personajes.size()) {
  138. Personaje personaje = personajes.get(i);
  139. int poder = personajes.get(i).getNivelPoder();
  140. if(poder == maximo) { poderosos.add(personaje); }
  141. i++;
  142. }
  143. return poderosos;
  144. }
  145. public Personaje elVengador()
  146. {
  147. Personaje vengador = null;
  148. int maximo = -1;
  149. int i = 0;
  150. while(i < personajes.size()) {
  151. Personaje nVengador = personajes.get(i);
  152. int vengados = 0;
  153. int j = 0;
  154. while(j < nVengador.getVictimas().size()) {
  155. Personaje victima = null;
  156. String nombreVictima = nVengador.getVictimas().get(j);
  157. int k = 0;
  158. while(k < personajes.size()) {
  159. if(personajes.get(k).getNombre() == nombreVictima) { victima = personajes.get(k); }
  160. k++;
  161. }
  162. vengados += victima.getVictimas().size();
  163. j++;
  164. }
  165. if(vengados > maximo) { maximo = vengados; vengador = nVengador; }
  166. i++;
  167. }
  168. return vengador;
  169. }
  170. public void teletransportacion()
  171. {
  172. if(personajes.size() > 0) {
  173. Personaje menorVida = null;
  174. Personaje mayorVida = null;
  175. int i = 0;
  176. while(i < personajes.size()) {
  177. Personaje personaje = personajes.get(i);
  178. if(personaje.getVidaActual() > 0) {
  179. if(menorVida == null || personaje.getVidaActual() < menorVida.getVidaActual())
  180. { menorVida = personaje; }
  181. if(mayorVida == null || personaje.getVidaActual() > mayorVida.getVidaActual())
  182. { mayorVida = personaje; }
  183. }
  184. i++;
  185. }
  186. System.out.println(menorVida);
  187. System.out.println(mayorVida);
  188. int vida = menorVida.getVidaActual();
  189. Posicion posicion = new Posicion(posicion(menorVida).getX(), posicion(menorVida).getY());
  190. if(mayorVida.getVidaActual() > menorVida.getVidaMaxima())
  191. { menorVida.setVidaActual(menorVida.getVidaMaxima()); }
  192. else { menorVida.setVidaActual(mayorVida.getVidaActual()); }
  193. posicion(menorVida).setX(posicion(mayorVida).getX());
  194. posicion(menorVida).setY(posicion(mayorVida).getY());
  195. mayorVida.setVidaActual(vida);
  196. posicion(mayorVida).setX(posicion.getX());
  197. posicion(mayorVida).setY(posicion.getY());
  198. }
  199. }
  200. public void atacar(Personaje NPersonaje)
  201. {
  202. ArrayList<Personaje> victimas = victimasPorCercania(NPersonaje);
  203. Personaje victima = null;
  204. if(victimas.size() > 1) { victima = victimas.get(1); }
  205. else { victima = victimas.get(0); }
  206. Habilidad habilidad = NPersonaje.getHabilidades().get(0);
  207. if(distancia(posicion(NPersonaje), posicion(victima)) > habilidad.getRango()
  208. || (habilidad.getTipo() == TipoHabilidad.Sanar &&
  209. NPersonaje.getVidaActual() == NPersonaje.getVidaMaxima()))
  210. { habilidad = NPersonaje.getHabilidades().get(1); }
  211. if(habilidad.getTipo() != TipoHabilidad.Sanar) {
  212. if(victima.getVidaActual() - habilidad.getPoder() <= 0) {
  213. victima.setVidaActual(0);
  214. habilidad.setLevel(habilidad.getLevel() + 1);
  215. NPersonaje.agregarVictima(victima.getNombre());
  216. posiciones.remove(victima.getNombre());
  217. }
  218. else { victima.setVidaActual(victima.getVidaActual() - habilidad.getPoder()); }
  219. }
  220. else {
  221. victima = victimas.get(0);
  222. victima.setVidaActual(victima.getVidaActual() + habilidad.getPoder());
  223. if(victima.getVidaActual() > victima.getVidaMaxima())
  224. { victima.setVidaActual(victima.getVidaMaxima()); }
  225. }
  226. }
  227. public int distancia(Posicion Posicion1, Posicion Posicion2)
  228. {
  229. return Math.abs(Posicion1.getX() - Posicion2.getX()) +
  230. Math.abs(Posicion1.getY() - Posicion2.getY());
  231. }
  232. public static void Escribir(Writer Output, Juego NJuego) throws IOException
  233. {
  234. Tablero.Escribir(Output, NJuego.getTablero());
  235. int i = 0;
  236. ArrayList<Personaje> personajes = NJuego.getPersonajes();
  237. Output.write("[ ");
  238. while(i < personajes.size()) {
  239. Personaje personaje = personajes.get(i);
  240. if(personaje.getVidaActual() > 0) {
  241. Output.write(personaje.getNombre() + " ");
  242. Posicion.Escribir(Output, NJuego.posicion(personaje));
  243. if(i < personajes.size() - 1) { Output.write(", "); }
  244. }
  245. i++;
  246. }
  247. Output.write("] ");
  248. i = 0;
  249. Output.write("[ ");
  250. while(i < personajes.size()) {
  251. Personaje.Escribir(Output, personajes.get(i));
  252. if(i < personajes.size() - 1) { Output.write(", "); }
  253. i++;
  254. }
  255. Output.write("] ");
  256. }
  257. public static Juego Leer(StringTokenizer Input) throws IOException
  258. {
  259. Tablero tablero = Tablero.Leer(Input);
  260. Map<String, Posicion> posiciones = new HashMap<String, Posicion>();
  261. String token = Input.nextToken();
  262. if(token.equals("[")) {
  263. token = Input.nextToken();
  264. while(!token.equals("]")) {
  265. if(token.equals(",")) { token = Input.nextToken(); }
  266. String nombre = token;
  267. Posicion posicion = Posicion.Leer(Input);
  268. posiciones.put(nombre, posicion);
  269. token = Input.nextToken();
  270. }
  271. }
  272. List<Personaje> personajes = new ArrayList<Personaje>();
  273. token = Input.nextToken();
  274. if(token.equals("[")) {
  275. Personaje personaje = Personaje.Leer(Input);
  276. while(personaje != null) {
  277. personajes.add(personaje);
  278. personaje = Personaje.Leer(Input);
  279. }
  280. }
  281. Juego juego = new Juego(personajes, posiciones, tablero);
  282. return juego;
  283. }
  284. private static String posicionesString(Juego juego) {
  285. ArrayList<Personaje> personajes = juego.getPersonajes();
  286. String posiciones = "";
  287. int i = 0;
  288. posiciones += "[";
  289. while(i < personajes.size()) {
  290. if(personajes.get(i).getVidaActual() > 0) {
  291. posiciones += personajes.get(i).getNombre() + " " + juego.posicion(personajes.get(i));
  292. if(i < personajes.size() - 1) { posiciones += ", "; }
  293. }
  294. i++;
  295. }
  296. posiciones += "]";
  297. return posiciones;
  298. }
  299. }