PageRenderTime 82ms CodeModel.GetById 485ms app.highlight 573ms RepoModel.GetById 101ms 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
  1package tpalgo1;
  2
  3import java.io.IOException;
  4import java.io.Writer;
  5import java.util.ArrayList;
  6import java.util.HashMap;
  7import java.util.List;
  8import java.util.Map;
  9import java.util.StringTokenizer;
 10
 11public class Juego 
 12{
 13	private Tablero tablero;
 14	private List<Personaje> personajes;
 15	private Map<String, Posicion> posiciones;
 16	
 17	@Override
 18	public String toString() {
 19		return "Tablero: " + tablero + "\n" + "Personajes: " + personajes + "\n" + "Posiciones: " +
 20				posicionesString(this);
 21	};
 22	
 23	public Juego(List<Personaje> Personajes, Map<String, Posicion> Posiciones, Tablero NTablero)
 24	{
 25		tablero = NTablero;
 26		personajes = Personajes;
 27		posiciones = Posiciones;
 28	}
 29	
 30	public Tablero getTablero()
 31	{
 32		return tablero;
 33	}
 34
 35	public ArrayList<Personaje> getPersonajes()
 36	{
 37		return (ArrayList<Personaje>) personajes;
 38	}
 39	
 40	public Posicion posicion(Personaje NPersonaje)
 41	{		
 42		return posiciones.get(NPersonaje.getNombre());
 43	}
 44	
 45	public boolean jaqueMate(Personaje NPersonaje)
 46	{
 47		boolean jaqueMate = false;
 48		
 49		int i = 0;
 50		while(i < personajes.size()) {
 51			Personaje personaje = personajes.get(i);
 52			
 53			if(personaje != NPersonaje && personaje.getVidaActual() > 0) {
 54				int j = 0;
 55				while(j < personaje.getHabilidades().size()) {
 56					Habilidad habilidad = personaje.getHabilidades().get(j);
 57					
 58					if(distancia(posicion(personaje), posicion(NPersonaje)) <= habilidad.getRango() &&
 59							habilidad.getTipo() != TipoHabilidad.Sanar && 
 60							NPersonaje.getVidaActual() <= habilidad.getPoder()) { jaqueMate = true; }
 61					
 62					j++;
 63				}
 64			}
 65			
 66			i++;
 67		}
 68		
 69		return jaqueMate;
 70	}
 71	
 72	public ArrayList<Personaje> victimasPorCercania(Personaje NPersonaje)
 73	{
 74		ArrayList<Personaje> victimas = new ArrayList<Personaje>();
 75		
 76		int i = 0;
 77		while(i < personajes.size()) {
 78			Personaje personaje = personajes.get(i);
 79			
 80			if(personaje.getVidaActual() > 0) {
 81				int j = 0;
 82				while(j < NPersonaje.getHabilidades().size()) {
 83					Habilidad habilidad = NPersonaje.getHabilidades().get(j);
 84					
 85					if(distancia(posicion(NPersonaje), posicion(personaje)) <= habilidad.getRango())
 86					{ victimas.add(personaje); break; }
 87					
 88					j++;
 89				}
 90			}
 91			
 92			i++;
 93		}
 94		
 95		ArrayList<Integer> distancias = new ArrayList<Integer>();
 96		i = 0;
 97		while(i < victimas.size()) {
 98			Personaje victima = victimas.get(i);
 99			distancias.add(distancia(posicion(NPersonaje), posicion(victima)));
100			
101			i++;
102		}
103		
104		i = 1;
105		while(i < victimas.size()) {
106			int j = i;
107			
108			while(j > 0 && distancias.get(j - 1) > distancias.get(j)) {
109				Integer anterior = distancias.get(j - 1);
110				distancias.set(j - 1, distancias.get(j));
111				distancias.set(j, anterior);
112				
113				Personaje pAnterior = victimas.get(j - 1);
114				victimas.set(j - 1, victimas.get(j));
115				victimas.set(j, pAnterior);
116				
117				j--;
118			}
119			
120			i++;
121		}
122		
123		return victimas;
124	}
125	
126	public ArrayList<Posicion> posicionesSeguras(Personaje NPersonaje)
127	{
128		ArrayList<Posicion> posiciones = new ArrayList<Posicion>();
129		int i = 0;
130		
131		while(i < tablero.getAncho()) {
132			int j = 0;
133			
134			while(j < tablero.getAlto()) {
135				int k = 0;
136				
137				while(k < personajes.size()) {
138					Personaje personaje = personajes.get(k);
139					int h = 0;
140					
141					if(personaje.getVidaActual() > 0) {
142						while(h < personaje.getHabilidades().size()) {
143							Habilidad habilidad = personaje.getHabilidades().get(h);
144							Posicion posicion = new Posicion(i, j);
145							
146							if(distancia(posicion(NPersonaje), posicion) > habilidad.getRango() &&
147							   distancia(posicion(NPersonaje), posicion) <= NPersonaje.getVelocidad())
148							{ posiciones.add(posicion); }
149							
150							h++;
151						}
152					}
153					
154					k++;
155				}
156				
157				j++;
158			}
159			
160			i++;
161		}
162		
163		return posiciones;
164	}
165	
166	public ArrayList<Personaje> losMasPoderosos()
167	{
168		int maximo = -1;
169		int i = 0;
170		while(i < personajes.size()) {
171			int poder = personajes.get(i).getNivelPoder();
172			if(poder > maximo) { maximo = poder; }
173			
174			i++;
175		}
176	
177		i = 0;
178		ArrayList<Personaje> poderosos = new ArrayList<Personaje>();
179		while(i < personajes.size()) {
180			Personaje personaje = personajes.get(i);
181			
182			int poder = personajes.get(i).getNivelPoder();
183			if(poder == maximo) { poderosos.add(personaje); }
184			
185			i++;
186		}
187		
188		return poderosos;
189	}
190	
191	public Personaje elVengador()
192	{
193		Personaje vengador = null;
194		int maximo = -1;
195		int i = 0;
196		while(i < personajes.size()) {
197			Personaje nVengador = personajes.get(i);
198			
199			int vengados = 0;
200			int j = 0;
201			while(j < nVengador.getVictimas().size()) {
202				Personaje victima = null;
203				String nombreVictima = nVengador.getVictimas().get(j);
204				
205				int k = 0;
206				while(k < personajes.size()) {
207					if(personajes.get(k).getNombre() == nombreVictima) { victima = personajes.get(k); }
208					k++;
209				}
210				
211				vengados += victima.getVictimas().size();
212				
213				j++;
214			}
215			
216			if(vengados > maximo) { maximo = vengados; vengador = nVengador; }
217			
218			i++;
219		}
220		
221		return vengador;
222	}
223	
224	public void teletransportacion()
225	{
226		if(personajes.size() > 0) {
227			Personaje menorVida = null;
228			Personaje mayorVida = null;
229			
230			int i = 0;
231			while(i < personajes.size()) {
232				Personaje personaje = personajes.get(i);
233				
234				if(personaje.getVidaActual() > 0) {
235					if(menorVida == null || personaje.getVidaActual() < menorVida.getVidaActual())
236					{ menorVida = personaje; }
237					if(mayorVida == null || personaje.getVidaActual() > mayorVida.getVidaActual())
238					{ mayorVida = personaje; }
239				}
240				
241				i++;
242			}
243
244			System.out.println(menorVida);
245			System.out.println(mayorVida);
246			
247			int vida = menorVida.getVidaActual();
248			Posicion posicion = new Posicion(posicion(menorVida).getX(), posicion(menorVida).getY());
249			
250			if(mayorVida.getVidaActual() > menorVida.getVidaMaxima())
251			{ menorVida.setVidaActual(menorVida.getVidaMaxima()); }
252			else { menorVida.setVidaActual(mayorVida.getVidaActual()); }
253			posicion(menorVida).setX(posicion(mayorVida).getX());
254			posicion(menorVida).setY(posicion(mayorVida).getY());
255			
256			mayorVida.setVidaActual(vida);
257			posicion(mayorVida).setX(posicion.getX());
258			posicion(mayorVida).setY(posicion.getY());
259		}
260	}
261	
262	public void atacar(Personaje NPersonaje)
263	{
264		ArrayList<Personaje> victimas = victimasPorCercania(NPersonaje);
265		
266		Personaje victima = null;
267		if(victimas.size() > 1) { victima = victimas.get(1); }
268		else { victima = victimas.get(0); }
269		
270		Habilidad habilidad = NPersonaje.getHabilidades().get(0);
271		if(distancia(posicion(NPersonaje), posicion(victima)) > habilidad.getRango()
272				|| (habilidad.getTipo() == TipoHabilidad.Sanar &&
273				NPersonaje.getVidaActual() == NPersonaje.getVidaMaxima()))
274		{ habilidad = NPersonaje.getHabilidades().get(1); }
275		
276		if(habilidad.getTipo() != TipoHabilidad.Sanar) {
277			if(victima.getVidaActual() - habilidad.getPoder() <= 0) {
278				victima.setVidaActual(0);
279				habilidad.setLevel(habilidad.getLevel() + 1);
280				NPersonaje.agregarVictima(victima.getNombre());
281				posiciones.remove(victima.getNombre());
282			}
283			else { victima.setVidaActual(victima.getVidaActual() - habilidad.getPoder()); }
284		}
285		else {
286			victima = victimas.get(0);
287			
288			victima.setVidaActual(victima.getVidaActual() + habilidad.getPoder());
289			if(victima.getVidaActual() > victima.getVidaMaxima())
290			{ victima.setVidaActual(victima.getVidaMaxima()); }
291		}
292	}
293
294	public int distancia(Posicion Posicion1, Posicion Posicion2)
295	{
296		return Math.abs(Posicion1.getX() - Posicion2.getX()) +
297			   Math.abs(Posicion1.getY() - Posicion2.getY());
298	}
299	
300    public static void Escribir(Writer Output, Juego NJuego) throws IOException
301	{
302    	Tablero.Escribir(Output, NJuego.getTablero());
303    	
304    	int i = 0;
305    	ArrayList<Personaje> personajes = NJuego.getPersonajes();
306    	Output.write("[ ");
307    	while(i < personajes.size()) {
308    		Personaje personaje = personajes.get(i);
309	    	if(personaje.getVidaActual() > 0) {	
310    			Output.write(personaje.getNombre() + " ");
311	    		Posicion.Escribir(Output, NJuego.posicion(personaje));
312		    	if(i < personajes.size() - 1) { Output.write(", "); }
313	    	}
314    		
315    		i++;
316    	}
317    	Output.write("] ");
318    	
319    	i = 0;
320    	Output.write("[ ");
321    	while(i < personajes.size()) {
322    		Personaje.Escribir(Output, personajes.get(i));
323    		
324		    if(i < personajes.size() - 1) { Output.write(", "); }
325    		
326    		i++;
327    	}
328    	Output.write("] ");
329	}
330	
331	public static Juego Leer(StringTokenizer Input) throws IOException
332	{
333		Tablero tablero = Tablero.Leer(Input);
334		
335		Map<String, Posicion> posiciones = new HashMap<String, Posicion>();
336		String token = Input.nextToken();
337		if(token.equals("[")) {
338			token = Input.nextToken();
339			
340			while(!token.equals("]")) {
341				if(token.equals(",")) { token = Input.nextToken(); }
342				String nombre = token;
343				
344				Posicion posicion = Posicion.Leer(Input);
345				
346				posiciones.put(nombre, posicion);
347				
348				token = Input.nextToken();
349			}
350		}
351		
352		List<Personaje> personajes = new ArrayList<Personaje>();
353		token = Input.nextToken();
354		if(token.equals("[")) {
355			Personaje personaje = Personaje.Leer(Input);
356			
357			while(personaje != null) {
358				personajes.add(personaje);
359				
360				personaje = Personaje.Leer(Input);
361			}
362		}
363		
364		Juego juego = new Juego(personajes, posiciones, tablero);
365		
366		return juego;
367    }
368	
369	private static String posicionesString(Juego juego) {
370		ArrayList<Personaje> personajes = juego.getPersonajes();
371		
372		String posiciones = "";
373		
374		int i = 0;
375		posiciones += "[";
376		while(i < personajes.size()) {
377			if(personajes.get(i).getVidaActual() > 0) {
378				posiciones += personajes.get(i).getNombre() + " " + juego.posicion(personajes.get(i));
379			    if(i < personajes.size() - 1) { posiciones += ", "; }
380			}
381			
382			i++;
383		}
384		posiciones += "]";
385		
386		return posiciones;
387	}
388	
389}