package Proyectos;

import java.util.Random;
import java.util.Scanner;

public class HundirLaFlota {
    //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
        */
        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++;
        }
        //QUIEN HA GANADO
        System.out.println();
        if (finalJuego(tablero1)){
            System.out.println("Ha ganado " + nombreJugadores[1]);
        }else {
            System.out.println("Ha ganado " + nombreJugadores[0]);
        }

        //NÚM RONDAS.
        System.out.println("Número de Rondas: "+numRonda);

        //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] = sc.nextInt();
            System.out.println("Introduce la coordenada Y: ");
            coordenadas[1] = 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;
    }


}


