Ejercicio Ejércitos completo

package com.trifulcas.ejercitos;

abstract public class Enemigo {
	private String nombre;
	private int fortaleza;
	private int danyo;

	/**
	 * @param nombre the nombre to set
	 */
	protected void setNombre(String nombre) {
		this.nombre = nombre;
	}

	/**
	 * @param fortaleza the fortaleza to set
	 */
	protected void setFortaleza(int fortaleza) {
		if (fortaleza >= 0) {
			this.fortaleza = fortaleza;
		}
	}

	/**
	 * @param danyo the danyo to set
	 */
	protected void setDanyo(int danyo) {
		if (danyo >= 0) {
			this.danyo = danyo;
		}
	}

	/**
	 * @return the nombre
	 */
	public String getNombre() {
		return nombre;
	}

	/**
	 * @return the fortaleza
	 */
	public int getFortaleza() {
		return fortaleza;
	}

	/**
	 * @return the danyo
	 */
	public int getDanyo() {
		return danyo;
	}

	public Enemigo() {
		// TODO Auto-generated constructor stub
	}

}

package com.trifulcas.ejercitos;

abstract public class Infanteria extends Enemigo {
	private int armadura;
	
	
	
	/**
	 * @param armadura the armadura to set
	 */
	protected void setArmadura(int armadura) {
		this.armadura = armadura;
	}

	public Infanteria() {
		// TODO Auto-generated constructor stub
	}
	
	abstract public void cargar();
	abstract public void retroceder();

}

package com.trifulcas.ejercitos;

public class Soldado extends Infanteria {

	public Soldado() {
		setNombre("Soldado");
		setFortaleza(50);
		setDanyo(5);
		setArmadura(20);
	}

	@Override
	public void cargar() {
		
		System.out.println("Ataque de soldados "+getDanyo());
	}
	@Override
	public void retroceder() {
		System.out.println("¡¡Retirada!!!!");
		setFortaleza(getFortaleza()-5);
		setDanyo(getDanyo()-1);
	}

}

package com.trifulcas.ejercitos;

public class Lancero extends Infanteria {

	public Lancero() {
		setNombre("Lancero");
		setFortaleza(60);
		setDanyo(15);
		setArmadura(10);
	}

	@Override
	public void cargar() {
		System.out.println("Ataque de lanceros "+getDanyo());
	}
	public void ataqueLanza() {
		System.out.println("Ataque con lanza "+getDanyo());
	}

	@Override
	public void retroceder() {
		System.out.println("¡¡Retirada!!!!");
		// Si usamos el setter para modificar el valor centralizamos
		// la modificación y es más fácil controlar las restricciones
		setFortaleza(getFortaleza()-4);
		setDanyo(getDanyo()-2);
	}

}

package com.trifulcas.ejercitos;

public class Capitan extends Infanteria {

	public Capitan() {
		setNombre("Capitán");
		setFortaleza(70);
		setDanyo(10);
		setArmadura(40);
	}

	@Override
	public void cargar() {
		System.out.println("Ataque de capitán "+getDanyo());
	}

	@Override
	public void retroceder() {
		System.out.println("¡¡Retirada!!!!");
		setFortaleza(getFortaleza()-5);
		setDanyo(getDanyo()-2);
	}

}

package com.trifulcas.ejercitos;

public class Ejercito {

	private Infanteria[] infanteria;

	public Ejercito() {
		// Me aprovecho del mismo constructor: palabra clave this
		// La usamos para llamar a los constructores de la clase
		this(10,4,1);
	}

	public Ejercito(int soldados, int lanceros, int capitanes) {
		int total = soldados + lanceros + capitanes;
		infanteria = new Infanteria[total];
		for (int i = 0; i < soldados; i++) {
			infanteria[i] = new Soldado();
		}
		for (int i = soldados; i < soldados+lanceros; i++) {
			infanteria[i] = new Lancero();
		}
		for (int i = soldados+lanceros; i < total; i++) {
			infanteria[i] = new Capitan();
		}
	}

	public int getTotalUnidades() {
		return infanteria.length;
	}
	public int totalDanyo() {
		int total = 0;
		for (Infanteria unidad : infanteria) {
			total += unidad.getDanyo();
		}
		return total;
	}

	public void aLaCarga() {
		for (Infanteria unidad : infanteria) {
			// Si tiene daño ataca, si no no
			if (unidad.getDanyo() > 0) {
				unidad.cargar();
				// Compruebo si unidad es una instancia de Lancero
				if (unidad instanceof Lancero) {
					// Conversión implícita 'al vuelo'
					((Lancero) unidad).ataqueLanza();

					// Implícita sin hacerlo al vuelo
					// Lancero temp=(Lancero) unidad;
					// temp.ataqueLanza();
				}
			}
		}
		System.out.println("Total daño: " + totalDanyo());
	}

	public void retirada() {
		for (Infanteria unidad : infanteria) {
			unidad.retroceder();
		}
	}
	public Infanteria getUnidad(int i) {
		return infanteria[i];
	}
	public void cargarUnidad(int i) {
		infanteria[i].cargar();
	}
}

package com.trifulcas.testEjercito;

import java.util.Scanner;

import com.trifulcas.ejercitos.Ejercito;

public class Test {
	static Scanner in;

	public static void main(String[] args) {
		in = new Scanner(System.in);
		System.out.println("Bienvenido al simulador. Vamos a crear un ejército");
		System.out.println("¿Cuantos soldados quieres?");
		int soldados = in.nextInt();
		System.out.println("¿Cuantos lanceros quieres?");
		int lanceros = in.nextInt();
		System.out.println("¿Cuantos capitanes quieres?");
		int capitanes = in.nextInt();
		Ejercito miEjercito = new Ejercito(soldados, lanceros, capitanes);
		System.out.println("Ejercito creado con " + soldados + " soldados " + lanceros + " lanceros y " + capitanes
				+ " capitanes");
		System.out.println("El daño total es " + miEjercito.totalDanyo());
		int respuesta;
		do {
			respuesta = menu("¿Qué quieres hacer?\r\n" + "1- Atacar\r\n" + "2.- Retirada\r\n" + "0.- Salir");
			if (respuesta == 1) {
				atacar(miEjercito);
			} else if (respuesta == 2) {
				retroceder(miEjercito);
			} else if (respuesta != 0) {
				System.out.println("Los valores válidos son 1,2 y 0");
			}
		} while (respuesta != 0);
	}

	public static int menu(String texto) {
		System.out.println(texto);
		int respuesta = in.nextInt();
		return respuesta;
	}

	public static void atacar(Ejercito miEjercito) {
		int respuesta;
		do {
			respuesta = menu(
					"Has decido atacar\r\n" + "1- Con todas las unidades\r\n" + "2.- Con una unidad\r\n" + "0.- Salir");

			if (respuesta == 1) {
				miEjercito.aLaCarga();
			} else if (respuesta == 2) {
				System.out.println("¿Con qué unidad quieres atacar (1-" + miEjercito.getTotalUnidades() + ") ?");
				int unidad = in.nextInt();
				if (unidad >= 1 && unidad <= miEjercito.getTotalUnidades()) {
					miEjercito.getUnidad(unidad - 1).cargar();
				} else {
					System.out.println("Unidad fuera de rango");
				}
				// Otra manera: miEjercito.cargarUnidad(unidad);)
			} else if (respuesta != 0) {
				System.out.println("Los valores válidos son 1,2 y 0");
			}
		} while (respuesta != 0);
	}

	public static void retroceder(Ejercito miEjercito) {
		int respuesta;
		do {
			respuesta = menu("Has decido retroceder\r\n" + "1- Con todas las unidades\r\n" + "2.- Con una unidad\r\n"
					+ "0.- Salir");

			if (respuesta == 1) {
				miEjercito.retirada();
				;
			} else if (respuesta == 2) {
				System.out.println("¿Con qué unidad quieres retroceder (1-" + miEjercito.getTotalUnidades() + ") ?");
				int unidad = in.nextInt();
				if (unidad >= 1 && unidad <= miEjercito.getTotalUnidades()) {
					miEjercito.getUnidad(unidad-1).retroceder();
				} else {
					System.out.println("Unidad fuera de rango");
				}
			} else if (respuesta != 0) {
				System.out.println("Los valores válidos son 1,2 y 0");
			}
		} while (respuesta != 0);
	}
}