package Proyectos;

import java.util.Random;
import java.util.Scanner;

public class HundirLaFlota2 {
    //OBJETOS
    static Random rd = new Random();
    static Scanner sc = new Scanner(System.in);

    public static void main(String[] args) {
        //VARIABLES

        String[] nombreJugadores = new String[2];
        /*
        nombreJugadores[0] → Usuario.
        nombreJugadores[1] → CPU
        */

        boolean decisionContinuarPartida = true;
        int[] numeroVictorias = new int[2];
        while(decisionContinuarPartida) {


            char[][] tablero1 = new char[10][10];
            char[][] tablero2 = new char[10][10];

            int numRonda = 0;

            //CONSTANTES


            //Código ------

            System.out.println("Introduce el nombre del Jugador 1: ");
            nombreJugadores[0] = "PEPE";//sc.nextLine();
            //Se establece el nombre del J2.
            nombreJugadores[1] = "CPU";


            generarTablero(tablero1, 4);
            generarTablero(tablero2, 4);

            imprimirTablero(tablero1, nombreJugadores[0]);
            imprimirTablero(tablero2, nombreJugadores[1]);

            while (!finalJuego(tablero1) && !finalJuego(tablero2)) {

                resultadoJugada(nombreJugadores[0], decisionJugada(nombreJugadores[0]), tablero2);
                imprimirTablero(tablero2, nombreJugadores[1]);

                System.out.println("\n\n---------------\n\n");
                resultadoJugada(nombreJugadores[0], decisionJugadaCPU(nombreJugadores[1]), tablero1);
                imprimirTablero(tablero1, nombreJugadores[0]);
                numRonda++;
            }
            //NÚM RONDAS.
            System.out.println("Número de Rondas: " + numRonda);
            //QUIEN HA GANADO
            System.out.println();
            if (finalJuego(tablero1)) {
                System.out.println("Ha ganado " + nombreJugadores[1]);
                numeroVictorias[1]++;
            } else {
                System.out.println("Ha ganado " + nombreJugadores[0]);
                numeroVictorias[0]++;
            }
            System.out.println("¿Desea continuar la partida? [S=Si, N=No]");
            String seguirPartida = sc.nextLine();
            if (!seguirPartida.equalsIgnoreCase("S")){
                decisionContinuarPartida=false;
            }
        }
        System.out.println("FIN DE LAS PARTIDAS");
        System.out.println("Victorias " + nombreJugadores[0] + ": "+numeroVictorias[0]);
        System.out.println("Victorias " + nombreJugadores[1] + ": "+numeroVictorias[1]);
        //MULTIPARTIDA


    }

    public static void generarTablero(char[][] tablero, int posicionesPorBarco) {
        final int LIMITE_Y = 9 + 1;
        final int LIMITE_X = 9 + 1 - posicionesPorBarco + 1;
        //Se realiza la suma de 1 unidad, debido a que, cuando se genera el número random no incluye el número dado.

        for (int j = 0; j < 3; j++) {

            int y = rd.nextInt(LIMITE_Y);
            int x = rd.nextInt(LIMITE_X);

            // VALIDACIÓN
            if (validarSiguienteBarco(tablero, posicionesPorBarco, x, y)) {

                for (int i = x; i < x + posicionesPorBarco; i++) {
                    tablero[y][i] = 'B';
                }
            } else {
                j--;
            }
        }

    }

    public static boolean validarSiguienteBarco(char[][] tablero, int posicionesPorBarco, int x, int y) {
        for (int i = x; i < x + posicionesPorBarco; i++) {
            if (tablero[y][i] != '\u0000') { //'\u0000' es == NULL en char
                return false;
            }
        }
        return true;
    }

    public static void imprimirTablero(char[][] tablero, String nombreJugador) {
        System.out.println("Tablero de " + nombreJugador);
        //CABECERA (J) [Eje Y]
        System.out.print("  ");
        for (int i = 0; i < tablero[0].length; i++) {
            System.out.print(i + " ");
        }
        System.out.println("");
        for (int i = 0; i < tablero.length; i++) {
            System.out.print(i + " ");
            for (int j = 0; j < tablero[0].length; j++) {
                //System.out.print(j);
                System.out.print(tablero[i][j] + " ");
            }
            System.out.println();
        }
    }

    public static int[] decisionJugada(String nombreJugador) {
        int[] coordenadas = new int[2];
        boolean dentroLimites = false;

        System.out.println("Turno de: " + nombreJugador);
        while (!dentroLimites) {


            System.out.println("Introduce la coordenada X: ");
            coordenadas[0] = 0; //sc.nextInt();
            System.out.println("Introduce la coordenada Y: ");
            coordenadas[1] = 0; //sc.nextInt();

            final int LIMITE_Y = 9 + 1;
            final int LIMITE_X = 9 + 1;

            if (coordenadas[0] <= LIMITE_X && coordenadas[1] <= LIMITE_Y) {
                dentroLimites = true;
            } else {
                System.out.println("Las coordenadas introducidas no están dentro de los límites");
            }


        }
        return coordenadas;
    }

    public static int[] decisionJugadaCPU(String nombreJugador) {
        int[] coordenadas = new int[2];
        boolean dentroLimites = false;

        System.out.println("Turno de: " + nombreJugador);
        while (!dentroLimites) {
            final int LIMITE_Y = 9 + 1;
            final int LIMITE_X = 9 + 1;

            //System.out.println("Introduce la coordenada X: ");
            coordenadas[0] = rd.nextInt(LIMITE_X) ;
            //System.out.println("Introduce la coordenada Y: ");
            coordenadas[1] = rd.nextInt(LIMITE_Y);


            if (coordenadas[0] <= LIMITE_X && coordenadas[1] <= LIMITE_Y) {
                dentroLimites = true;
            } else {
                System.out.println("Las coordenadas introducidas no están dentro de los límites");
            }


        }
        //System.out.println("Coordenadas CPU "+coordenadas[0]+" "+coordenadas[1]);
        return coordenadas;
    }

    public static void resultadoJugada(String nombreJugador, int[] coordenadas, char[][] tableroOponente) {
        //Coordenada X = coordenadas[0]
        //Coordenada Y = coordenadas[1]
        int coordenadaX = coordenadas[0];
        int coordenadaY = coordenadas[1];
        System.out.println("Valor antes de disparar: "+tableroOponente[coordenadaX][coordenadaY]);
        switch (tableroOponente[coordenadaX][coordenadaY]) {
            case 'B':
                System.out.println(nombreJugador + " le ha dado a un Barco");
                tableroOponente[coordenadaX][coordenadaY] = 'X';
                break;
            case '\u0000':
                System.out.println(nombreJugador + " ha dado en el agua");
                tableroOponente[coordenadaX][coordenadaY] = 'X';
                break;
            case 'X':
                System.out.println(nombreJugador + " le ha dado a una zona del ya disparada");
                break;
        }

    }

    public static boolean finalJuego(char[][] tablero) {
        //¿Cuándo he terminado?
        for (int i = 0; i < tablero.length; i++) {
            for (int j = 0; j < tablero[0].length; j++) {
                if (tablero[i][j] == 'B') {
                    return false;
                }
            }
        }
        return true;
    }


}


