Contenido
En el universo de The Expanse, la tensión entre la Tierra, Marte y el Cinturón ha acabado en guerra abierta. Tú vas a programar el sistema de gestión de una flota de naves que participan en esa guerra.
El objetivo del ejercicio es trabajar:
- Clases y objetos.
- Uso de
ArrayListcon objetos. - Encapsulamiento y métodos.
- Uso de
Scannerpara leer datos. - Un controlador con menú en consola.
Deberás crear al menos tres clases:
NaveFlota- Una clase con
main(por ejemploControlFlota)
Crea una clase Nave que represente una nave espacial.
Atributos mínimos:
String nombreString faccion
(valores recomendados:"Tierra","Marte","Cinturon")int misiles→ número de misiles que tiene esa nave.boolean necesitaReparacion→ indica si la nave necesita pasar por dique seco.
Requisitos:
- Al menos un constructor con todos los parámetros:
Nave(String nombre, String faccion, int misiles, boolean necesitaReparacion)
- Puedes añadir más constructores si quieres (por ejemplo, uno con menos parámetros).
- Métodos
getysetpara los atributos que consideres necesarios. - Método
toString()para mostrar la información de la nave de forma legible.
2. Clase Flota
La clase Flota representa un conjunto de naves en guerra.
Atributo:
- Un atributo privado:
ArrayList<Nave> naves;
Requisitos de la clase Flota:
- Constructor sin parámetros
Inicializa la lista:- Crea un
ArrayList<Nave>vacío.
- Crea un
- Método para añadir una nave ya creada
void agregarNave(Nave nave)
Añade la nave recibida como parámetro alArrayList.
- Método para crear una nave usando Scanner y añadirla a la flota
void crearNaveDesdeTeclado(Scanner sc)
Este método debe:- Pedir por teclado:
- Nombre de la nave.
- Facción (
Tierra,MarteoCinturon). - Número de misiles.
- Si necesita reparación (por ejemplo,
S/N).
- Crear un objeto
Navecon esos datos. - Añadir la nave creada a la lista de la flota.
- Método que devuelve el número de naves
int getNumeroNaves()
Devuelve cuántas naves hay en la flota (tamaño delArrayList).
- Método para listar todas las naves
void listarTodas()
Muestra por pantalla todas las naves de la flota.
- Método para listar solo las naves que necesitan reparación
void listarNavesParaReparar()
Recorre la lista y muestra solo las naves cuyo atributonecesitaReparacionseatrue.
- Método para calcular el número total de misiles de la flota
int getTotalMisiles()
Suma el número de misiles de todas las naves y devuelve el total.
- Método para listar naves por facción
void listarPorFaccion(String faccion)
Muestra solo las naves cuya facción coincida con la indicada (por ejemplo"Tierra").
- Método para contar naves por facción
int contarPorFaccion(String faccion)
Devuelve cuántas naves pertenecen a la facción indicada.
Puedes añadir métodos auxiliares si lo necesitas (por ejemplo para validaciones).
3. Clase ControlFlota (o similar) con main
Crea una clase que contenga el método main y actúe como controlador.
Requisitos:
- Crear un objeto
Scannery un objetoFlota. - Opcionalmente, crear algunas naves iniciales por código (por ejemplo naves típicas de The Expanse) y añadirlas a la flota con
agregarNave. - Implementar un menú por consola que se repita hasta que el usuario elija salir (puedes usar
whileodo-while).
El menú deberá tener, como mínimo, estas opciones:
- Añadir nave pidiendo datos por teclado
- Llamar a
crearNaveDesdeTeclado(sc).
- Llamar a
- Añadir nave creada en el
main- Crear un objeto
Navedirectamente en elmain(con valores que tú pongas) y añadirlo a la flota conagregarNave.
- Crear un objeto
- Listar todas las naves
- Llamar a
listarTodas().
- Llamar a
- Listar naves que necesitan reparación
- Llamar a
listarNavesParaReparar().
- Llamar a
- Mostrar número total de naves
- Llamar a
getNumeroNaves()y mostrar el resultado.
- Llamar a
- Mostrar número total de misiles de la flota
- Llamar a
getTotalMisiles()y mostrar el resultado.
- Llamar a
- Listar naves por facción
- Pedir al usuario una facción (
Tierra,MarteoCinturon) y llamar alistarPorFaccion(faccion).
- Pedir al usuario una facción (
- Mostrar cuántas naves hay de una facción
- Pedir al usuario una facción y llamar a
contarPorFaccion(faccion). - Mostrar el resultado.
- Pedir al usuario una facción y llamar a
- Salir del programa.
Cada opción debe ejecutarse según el número introducido por el usuario, y después de ejecutar la acción, el menú se volverá a mostrar hasta que el usuario elija la opción 0.
4. Información extra The Expanse
- La facción
Tierrarepresenta a la ONU y su flota clásica. - La facción
Marterepresenta a la MCRN, con naves militares muy avanzadas. - La facción
Cinturonrepresenta a la OPA y a los belters, normalmente con naves reutilizadas o modificadas.
Puedes usar nombres de naves inspirados en la serie (por ejemplo, “Rocinante”, “Donnager”, “Agatha King”, “Nauvoo”, etc.) o inventarte los tuyos, siempre dentro del contexto de la guerra entre Tierra, Marte y el Cinturón.
Ejemplo Controlador MAIN
Código del ControlFlota (main)
import java.util.Scanner;
public class ControlFlota {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Flota flota = new Flota();
// Naves iniciales opcionales (The Expanse vibes)
flota.agregarNave(new Nave("Rocinante", "Cinturon", 24, false));
flota.agregarNave(new Nave("Donnager", "Marte", 60, true));
flota.agregarNave(new Nave("Agatha King", "Tierra", 40, true));
int opcion;
do {
mostrarMenu();
opcion = leerEnteroSeguro(sc);
switch (opcion) {
case 1:
// Crear nave con Scanner
flota.crearNaveDesdeTeclado(sc);
break;
case 2:
// Crear nave desde el propio main
Nave n = new Nave("Nauvoo", "Cinturon", 80, false);
flota.agregarNave(n);
System.out.println("Nave creada desde main y añadida: " + n);
break;
case 3:
flota.listarTodas();
break;
case 4:
flota.listarNavesParaReparar();
break;
case 5:
System.out.println("Número total de naves: " + flota.getNumeroNaves());
break;
case 6:
System.out.println("Misiles totales en la flota: " + flota.getTotalMisiles());
break;
case 7:
System.out.print("Introduce la facción (Tierra/Marte/Cinturon): ");
String fac = sc.nextLine();
flota.listarPorFaccion(fac);
break;
case 8:
System.out.print("Introduce la facción (Tierra/Marte/Cinturon): ");
String fac2 = sc.nextLine();
int num = flota.contarPorFaccion(fac2);
System.out.println("Número de naves de la facción " + fac2 + ": " + num);
break;
case 0:
System.out.println("Saliendo del sistema de control de flota...");
break;
default:
System.out.println("Opción no válida.");
}
System.out.println();
} while (opcion != 0);
sc.close();
}
// -------------------------
// Métodos auxiliares
// -------------------------
private static void mostrarMenu() {
System.out.println("=== CONTROL DE FLOTA - GUERRA DEL SISTEMA SOLAR ===");
System.out.println("1. Añadir nave (datos por teclado)");
System.out.println("2. Añadir nave (creada en el main)");
System.out.println("3. Listar todas las naves");
System.out.println("4. Listar naves que necesitan reparación");
System.out.println("5. Mostrar número total de naves");
System.out.println("6. Mostrar número total de misiles");
System.out.println("7. Listar naves por facción");
System.out.println("8. Contar naves por facción");
System.out.println("0. Salir");
System.out.print("Elige una opción: ");
}
private static int leerEnteroSeguro(Scanner sc) {
while (true) {
try {
int valor = Integer.parseInt(sc.nextLine());
return valor;
} catch (NumberFormatException e) {
System.out.print("Introduce un número válido: ");
}
}
}
}


![R7 [Solución] - Guerra por el Sistema Solar: Tierra, Marte y el Cinturón” (The Expanse) Captura de pantalla 2025-12-22 a las 20.54.03](https://laaventuradeaprender.com/wp-content/uploads/2025/12/Captura-de-pantalla-2025-12-22-a-las-20.54.03-1.png)





![R3.1 [Solución] - Programación-bucles profe](https://laaventuradeaprender.com/wp-content/uploads/2025/12/profe-2.png)
![R3.2 [Solución] Programación-Bucles profe](https://laaventuradeaprender.com/wp-content/uploads/2025/12/profe.png)