Class hundirFlota

java.lang.Object
HundirFlota.hundirFlota

public class hundirFlota extends Object
Juego de hundir la flota por consola. El programa genera un tablero para la CPU, coloca los barcos de forma aleatoria y permite al usuario disparar indicando fila (letra) y columna (número) hasta agotar intentos o hundir todos los barcos.
Author:
Ivan Ribes Moliner
  • Field Summary

    Fields
    Modifier and Type
    Field
    Description
    static final String
     
    static final String
     
    static final String
     
    static final String
     
    static final String
     
    static final String
     
    static final String
     
    static final String
     
  • Constructor Summary

    Constructors
    Constructor
    Description
     
  • Method Summary

    Modifier and Type
    Method
    Description
    static void
    cantBarcos(int dificultad, int[] cantBarcos, String[] nombreBarco, char[][] tablero, int[] longBarcos)
    Establece la cantidad de barcos por tipo según la dificultad elegida.
    static int
    cantBarcosPosible(char[][] tablero, int i, int[] longBarcos)
    Calcula el número máximo aproximado de barcos que podrían colocarse para un tipo de barco concreto en un tablero dado, teniendo en cuenta su longitud y las casillas actualmente libres ('_').
    static int
    cantIntentos(int dificultad, char[][] tablero, int minIntentos)
    Devuelve el número de intentos según la dificultad.
    static int
    colocarBarco(char[][] tableroCPU, int[] cantBarcos, int i, char[] letraBarco, int[] longBarco, int[][] numeroBarco, String[] barcos, int numBarco)
    Coloca en el tablero todos los barcos de un tipo concreto (según el índice i), intentando posiciones aleatorias hasta encontrar una ubicación válida.
    static int
    colocarBarcosPersonalizado(char[][] tableroCPU, int[] longBarcos, char[] letraBarco, int[][] numeroBarco, String[] barcos, int[] cantBarcos)
    Permite al usuario definir cuántos barcos de cada tipo quiere colocar (modo PERSONALIZADO).
    static void
    comprobarJugada(char[][] tableroCPU, char[][] tableroUser, int fila, int columna, int[][] tableroAux, int[] estadoBarco)
    Procesa la jugada del usuario en una coordenada (fila, columna)
    static boolean
    comprobarVictoria(int[] estados)
    Comprueba si el jugador ha ganado.
    static int
    contarMinIntentos(char[][] tableroCPU)
    Cuenta cuántas casillas del tablero de la CPU están ocupadas por barcos.
    static void
    crearTablero(char[][] tablero)
    Rellena un tablero de caracteres con '_' para inicializarlo como tablero vacío.
    static void
    crearTablero(int[][] tablero)
    Rellena un tablero auxiliar numérico con -1.
    static int
    direccionBarco(int longBarco, int fila, int columna, char[][] tableroCPU)
    Calcula una dirección válida para colocar un barco desde una posición inicial.
    static void
    estadoBarcos(int[][] tablero, int[] estado, int fila, int columna, int numBarco, int longBarco)
    Actualiza y muestra el estado de un barco (TOCADO/HUNDIDO) tras un impacto.
    static void
    main(String[] args)
    Punto de entrada del programa.
    static void
    mostrarRondas(int ronda, int intentos)
    Muestra por consola el número de rondas restantes con un color que varía según el porcentaje de intentos restantes (verde, amarillo, naranja o rojo).
    static void
    mostrarTablero(char[][] tableroUser)
    Muestra por consola el tablero del usuario con formato de filas (letras) y columnas (números), aplicando colores ANSI según el contenido: '_' y 'A' en cian, 'X' en rojo.
    static void
    mostrarTablero(int[][] tablero)
    Muestra por consola un tablero auxiliar de enteros.
    static void
    mostrarTableroDerrota(char[][] tableroUser, char[][] tableroCPU)
    Muestra el tablero final en caso de derrota.
    static int
    posRandom(char[][] tableroCPU)
    Genera un índice aleatorio válido dentro de los límites del tablero.
    static int
    recorrerBarcos(char[][] tableroCPU, int[] cantBarcos, char[] letraBarco, int[] longBarco, int[][] numeroBarco, String[] barcos)
    Coloca los barcos de la CPU en el tablero, según la cantidad y longitud de cada tipo de barco.
    static int
    Muestra un menú de dificultad y solicita una opción válida al usuario.
    static int
    seleccionarColumna(char[][] tablero)
    Solicita al usuario una columna en formato numérico y la valida según el tamaño del tablero.
    static int
    seleccionarFila(char[][] tablero)
    Solicita al usuario una fila en formato letra (A, B, C...) y la convierte a índice numérico.

    Methods inherited from class Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • Field Details

  • Constructor Details

    • hundirFlota

      public hundirFlota()
  • Method Details

    • main

      public static void main(String[] args)
      Punto de entrada del programa. Prepara la partida (dificultad, tamaño de tablero, barcos e intentos), inicializa los tableros y ejecuta el bucle principal de juego hasta victoria o derrota.
      Parameters:
      args -
    • crearTablero

      public static void crearTablero(char[][] tablero)
      Rellena un tablero de caracteres con '_' para inicializarlo como tablero vacío.
      Parameters:
      tablero - matriz que representa el tablero a inicializar
    • crearTablero

      public static void crearTablero(int[][] tablero)
      Rellena un tablero auxiliar numérico con -1. Se usa para almacenar información auxiliar (identificación de barcos por casilla).
      Parameters:
      tablero - matriz auxiliar a inicializar
    • posRandom

      public static int posRandom(char[][] tableroCPU)
      Genera un índice aleatorio válido dentro de los límites del tablero. Se utiliza para obtener valores de fila o columna al colocar barcos.
      Parameters:
      tableroCPU - tablero de referencia para obtener el tamaño
      Returns:
      índice aleatorio entre 0 y (tableroCPU.length - 1)
    • recorrerBarcos

      public static int recorrerBarcos(char[][] tableroCPU, int[] cantBarcos, char[] letraBarco, int[] longBarco, int[][] numeroBarco, String[] barcos)
      Coloca los barcos de la CPU en el tablero, según la cantidad y longitud de cada tipo de barco. Para cada barco se selecciona una posición inicial aleatoria y una dirección válida (horizontal o vertical según el tipo), asegurando que las posiciones estén libres. Además, se rellena la matriz auxiliar numeroBarco con el identificador numérico del barco en cada casilla ocupada.
      Parameters:
      tableroCPU - tablero de la CPU donde se colocan los barcos
      cantBarcos - cantidad de barcos por tipo
      letraBarco - letra que representa cada tipo de barco en el tablero
      longBarco - longitud (tamaño) de cada tipo de barco
      numeroBarco - matriz auxiliar que guarda el número/ID de barco por casilla ocupada
      Returns:
      identificador del último barco colocado
    • direccionBarco

      public static int direccionBarco(int longBarco, int fila, int columna, char[][] tableroCPU)
      Calcula una dirección válida para colocar un barco desde una posición inicial. Devuelve 1 si es posible colocar el barco en dirección positiva (derecha o abajo), -1 si es posible colocarlo en dirección negativa (izquierda o arriba), o 0 si no es posible en ninguna dirección desde esa posición.
      Parameters:
      longBarco - longitud del barco a colocar
      fila - posición inicial (fila)
      columna - posición inicial (columna)
      tableroCPU - tablero donde se comprueba la disponibilidad de casillas
      Returns:
      1 si dirección positiva es válida, -1 si dirección negativa es válida, 0 si ninguna es válida
    • cantBarcosPosible

      public static int cantBarcosPosible(char[][] tablero, int i, int[] longBarcos)
      Calcula el número máximo aproximado de barcos que podrían colocarse para un tipo de barco concreto en un tablero dado, teniendo en cuenta su longitud y las casillas actualmente libres ('_').

      Se utiliza como apoyo en el modo PERSONALIZADO para limitar el valor máximo que puede introducir el usuario.

      Parameters:
      tablero - tablero en el que se quiere estimar cuántos barcos caben
      i - índice del tipo de barco (relacionado con los arrays longBarcos, barcos, etc.)
      longBarcos - array con las longitudes de cada tipo de barco
      Returns:
      número máximo estimado de barcos posibles para ese tipo
    • colocarBarcosPersonalizado

      public static int colocarBarcosPersonalizado(char[][] tableroCPU, int[] longBarcos, char[] letraBarco, int[][] numeroBarco, String[] barcos, int[] cantBarcos)
      Permite al usuario definir cuántos barcos de cada tipo quiere colocar (modo PERSONALIZADO).

      Para cada tipo de barco calcula el máximo posible en función del tablero y la longitud del barco, solicita al usuario un valor válido, y finalmente coloca los barcos de forma aleatoria en el tablero.

      Parameters:
      tableroCPU - tablero real de la CPU donde se colocan los barcos
      longBarcos - array con la longitud de cada tipo de barco
      letraBarco - array con la letra que representa cada tipo de barco en el tablero
      numeroBarco - matriz auxiliar donde se guarda el ID numérico de barco en cada casilla ocupada
      barcos - array con los nombres de los barcos (para mostrar mensajes al usuario)
      cantBarcos - array donde se guardará la cantidad elegida por el usuario para cada tipo de barco
      Returns:
      ID del último barco colocado (sirve para dimensionar estructuras como estadoBarcos)
    • colocarBarco

      public static int colocarBarco(char[][] tableroCPU, int[] cantBarcos, int i, char[] letraBarco, int[] longBarco, int[][] numeroBarco, String[] barcos, int numBarco)
      Coloca en el tablero todos los barcos de un tipo concreto (según el índice i), intentando posiciones aleatorias hasta encontrar una ubicación válida.

      Cuando consigue colocar un barco, marca sus casillas con la letra correspondiente y rellena numeroBarco con el identificador del barco para poder controlar tocado/hundido.

      Si tras muchos intentos no se puede colocar un barco, se contabiliza como "imposible" y se informa al final.

      Parameters:
      tableroCPU - tablero real de la CPU donde se colocan los barcos
      cantBarcos - array con la cantidad de barcos por tipo
      i - índice del tipo de barco que se está colocando
      letraBarco - array con la letra que representa cada tipo de barco
      longBarco - array con las longitudes de cada tipo de barco
      numeroBarco - matriz auxiliar donde se guarda el ID numérico de barco en cada casilla ocupada
      barcos - array con los nombres de barcos (para mensajes)
      numBarco - contador/ID actual del siguiente barco a colocar
      Returns:
      nuevo valor de numBarco tras colocar todos los barcos de ese tipo
    • seleccionarFila

      public static int seleccionarFila(char[][] tablero)
      Solicita al usuario una fila en formato letra (A, B, C...) y la convierte a índice numérico. Repite la petición hasta que la fila sea válida para el tamaño del tablero.
      Parameters:
      tablero - tablero de referencia para validar el rango
      Returns:
      índice de fila (0 a tablero.length - 1)
    • seleccionarColumna

      public static int seleccionarColumna(char[][] tablero)
      Solicita al usuario una columna en formato numérico y la valida según el tamaño del tablero. Repite la petición hasta que la columna sea válida.
      Parameters:
      tablero - tablero de referencia para validar el rango
      Returns:
      índice de columna (0 a tablero.length - 1)
    • comprobarJugada

      public static void comprobarJugada(char[][] tableroCPU, char[][] tableroUser, int fila, int columna, int[][] tableroAux, int[] estadoBarco)
      Procesa la jugada del usuario en una coordenada (fila, columna). - Si ya se ha disparado en esa casilla del tablero del usuario, vuelve a pedir coordenadas. - Si en el tablero de la CPU hay agua ('_'), marca 'A' en el tablero del usuario. - Si hay barco, marca 'X', actualiza la matriz auxiliar y calcula el estado del barco (tocado/hundido).
      Parameters:
      tableroCPU - tablero real de la CPU (con barcos)
      tableroUser - tablero visible para el usuario (con disparos)
      fila - fila seleccionada por el usuario
      columna - columna seleccionada por el usuario
      tableroAux - matriz auxiliar con el ID de barco por casilla
      estadoBarco - array que guarda el estado de cada barco (por ID)
    • estadoBarcos

      public static void estadoBarcos(int[][] tablero, int[] estado, int fila, int columna, int numBarco, int longBarco)
      Actualiza y muestra el estado de un barco (TOCADO/HUNDIDO) tras un impacto. Calcula cuántas partes del barco siguen presentes en tablero. Si no quedan partes, marca el barco como hundido (2); si quedan, lo marca como tocado (1).
      Parameters:
      tablero - matriz auxiliar donde se identifican las partes restantes del barco
      estado - array de estados de barcos por ID (0: nada, 1: tocado, 2: hundido)
      fila - fila del último disparo (para comprobar horizontal)
      columna - columna del último disparo (para comprobar vertical)
      numBarco - identificador del barco impactado
      longBarco - longitud del barco impactado
    • comprobarVictoria

      public static boolean comprobarVictoria(int[] estados)
      Comprueba si el jugador ha ganado. Se considera victoria cuando todos los barcos están en estado hundido (2).
      Parameters:
      estados - array con el estado de cada barco
      Returns:
      true si todos los barcos están hundidos, false en caso contrario
    • contarMinIntentos

      public static int contarMinIntentos(char[][] tableroCPU)
      Cuenta cuántas casillas del tablero de la CPU están ocupadas por barcos.

      Este valor se utiliza como mínimo teórico de intentos: si el usuario elige menos intentos que casillas ocupadas, sería imposible hundirlo todo aunque no fallase nunca.

      Parameters:
      tableroCPU - tablero real de la CPU (contiene '_' en agua y letras en barcos)
      Returns:
      número de casillas ocupadas por barcos
    • mostrarTablero

      public static void mostrarTablero(char[][] tableroUser)
      Muestra por consola el tablero del usuario con formato de filas (letras) y columnas (números), aplicando colores ANSI según el contenido: '_' y 'A' en cian, 'X' en rojo.
      Parameters:
      tableroUser - tablero del usuario a mostrar
    • mostrarTableroDerrota

      public static void mostrarTableroDerrota(char[][] tableroUser, char[][] tableroCPU)
      Muestra el tablero final en caso de derrota. Sustituye en el tablero del usuario todas las casillas no acertadas por el contenido real del tablero de la CPU, para revelar la posición de los barcos. Luego imprime el tablero con formato y colores ANSI.
      Parameters:
      tableroUser - tablero del usuario (se completa con información del tableroCPU)
      tableroCPU - tablero real de la CPU con la ubicación de los barcos
    • mostrarTablero

      public static void mostrarTablero(int[][] tablero)
      Muestra por consola un tablero auxiliar de enteros. Se utiliza principalmente para depuración o pruebas.
      Parameters:
      tablero - matriz numérica a mostrar
    • mostrarRondas

      public static void mostrarRondas(int ronda, int intentos)
      Muestra por consola el número de rondas restantes con un color que varía según el porcentaje de intentos restantes (verde, amarillo, naranja o rojo).

      Si queda una única ronda, muestra el aviso de "ULTIMA RONDA".

      Parameters:
      ronda - rondas restantes en ese momento
      intentos - número total de intentos iniciales
    • seleccionaDificultad

      public static int seleccionaDificultad()
      Muestra un menú de dificultad y solicita una opción válida al usuario. Las opciones disponibles son: FACIL, MEDIO, DIFICIL y PERSONALIZADO.
      Returns:
      dificultad elegida (1..4)
    • cantBarcos

      public static void cantBarcos(int dificultad, int[] cantBarcos, String[] nombreBarco, char[][] tablero, int[] longBarcos)
      Establece la cantidad de barcos por tipo según la dificultad elegida.
      Parameters:
      dificultad - dificultad seleccionada
      cantBarcos - array donde se guarda la cantidad de barcos por tipo
      nombreBarco - nombres de cada tipo de barco (no se usa aquí)
    • cantIntentos

      public static int cantIntentos(int dificultad, char[][] tablero, int minIntentos)
      Devuelve el número de intentos según la dificultad.

      En modo PERSONALIZADO (dificultad 4), el usuario introduce los intentos y se valida que:

      • No supere el máximo posible (tablero.length * tablero.length).
      • No sea inferior al mínimo necesario (minIntentos) para poder acertar todas las casillas ocupadas.
      Parameters:
      dificultad - dificultad seleccionada (1: fácil, 2: medio, 3: difícil, 4: personalizado)
      tablero - tablero de referencia para calcular el máximo de intentos posible
      minIntentos - mínimo de intentos recomendado/obligatorio para que sea posible tocar todas las casillas con barco
      Returns:
      número de intentos para la partida