R7 – Guerra por el Sistema Solar: Tierra, Marte y el Cinturón” (The Expanse)

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 ArrayList con objetos.
  • Encapsulamiento y métodos.
  • Uso de Scanner para leer datos.
  • Un controlador con menú en consola.

Deberás crear al menos tres clases:

  • Nave
  • Flota
  • Una clase con main (por ejemplo ControlFlota)

1. Clase Nave

Crea una clase Nave que represente una nave espacial.

Atributos mínimos:

  • String nombre
  • String 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:

  1. Al menos un constructor con todos los parámetros:
    • Nave(String nombre, String faccion, int misiles, boolean necesitaReparacion)
  2. Puedes añadir más constructores si quieres (por ejemplo, uno con menos parámetros).
  3. Métodos get y set para los atributos que consideres necesarios.
  4. 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:

  1. Constructor sin parámetros
    Inicializa la lista:
    • Crea un ArrayList<Nave> vacío.
  2. Método para añadir una nave ya creada
    • void agregarNave(Nave nave)
      Añade la nave recibida como parámetro al ArrayList.
  3. 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, Marte o Cinturon).
      • Número de misiles.
      • Si necesita reparación (por ejemplo, S/N).
    • Crear un objeto Nave con esos datos.
    • Añadir la nave creada a la lista de la flota.
  4. Método que devuelve el número de naves
    • int getNumeroNaves()
      Devuelve cuántas naves hay en la flota (tamaño del ArrayList).
  5. Método para listar todas las naves
    • void listarTodas()
      Muestra por pantalla todas las naves de la flota.
  6. Método para listar solo las naves que necesitan reparación
    • void listarNavesParaReparar()
      Recorre la lista y muestra solo las naves cuyo atributo necesitaReparacion sea true.
  7. 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.
  8. 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").
  9. 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:

  1. Crear un objeto Scanner y un objeto Flota.
  2. Opcionalmente, crear algunas naves iniciales por código (por ejemplo naves típicas de The Expanse) y añadirlas a la flota con agregarNave.
  3. Implementar un menú por consola que se repita hasta que el usuario elija salir (puedes usar while o do-while).

El menú deberá tener, como mínimo, estas opciones:

  1. Añadir nave pidiendo datos por teclado
    • Llamar a crearNaveDesdeTeclado(sc).
  2. Añadir nave creada en el main
    • Crear un objeto Nave directamente en el main (con valores que tú pongas) y añadirlo a la flota con agregarNave.
  3. Listar todas las naves
    • Llamar a listarTodas().
  4. Listar naves que necesitan reparación
    • Llamar a listarNavesParaReparar().
  5. Mostrar número total de naves
    • Llamar a getNumeroNaves() y mostrar el resultado.
  6. Mostrar número total de misiles de la flota
    • Llamar a getTotalMisiles() y mostrar el resultado.
  7. Listar naves por facción
    • Pedir al usuario una facción (Tierra, Marte o Cinturon) y llamar a listarPorFaccion(faccion).
  8. Mostrar cuántas naves hay de una facción
    • Pedir al usuario una facción y llamar a contarPorFaccion(faccion).
    • Mostrar el resultado.
  9. 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 Tierra representa a la ONU y su flota clásica.
  • La facción Marte representa a la MCRN, con naves militares muy avanzadas.
  • La facción Cinturon representa 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: ");
            }
        }
    }
}