package Proyectos;

import java.util.Random;
import java.util.Scanner;

public class Examen24_25 {

    static Random rd = new Random();
    static Scanner sc = new Scanner(System.in);

    public static void main(String[] args) {
        //-----------INICIO BLOQUE 1.

        //1. Representación de dos tableros de juego.
        char[][] tablero1 = new char[10][10];
        char[][] tablero2 = new char[10][10];

        //2. Jugadores
        char[] jugadores = new char[2];
        jugadores[0] = 'Y';
        jugadores[1] = 'V';

        //3a. Villanos
        char[] villanos = new char[2];
        villanos[0] = 'D';
        villanos[1] = 'R';

        //3b. Asignar cada villano correspondiente a cada tablero.
        rellenarTablero(tablero1, jugadores[0], 1);
        rellenarTablero(tablero2, jugadores[1], 1);
        rellenarTablero(tablero1, villanos[0], 5);
        rellenarTablero(tablero2, villanos[1], 5);

        //5. Rellenar 5 Muros .
        char muro = 'M';
        rellenarTablero(tablero1, muro, 5);
        rellenarTablero(tablero2, muro, 5);

        //4. Rellenar con L los espacios sobrantes.
        char libre = 'L';
        rellenarTableroConLibre(tablero1, libre);
        rellenarTableroConLibre(tablero2, libre);

        //6.
        tablero1[9][9] = 'F';
        tablero2[9][9] = 'F';

        //7
        int[] vidasJugadores = {3, 3}; //
        boolean[] haGanado = {false, false};

        //-----------FIN BLOQUE 1.
        //-----------INICIO BLOQUE 2.
        //Pedir Letra y Número
        //moverFicha(tablero1,obtenerTraslacion(letra,numero));

        int rondas = 0;
        boolean noHayGanador = !hayGanador(tablero1,jugadores[0]) && !hayGanador(tablero2,jugadores[1]);
        boolean noHayPerdedor = true;

        while (noHayGanador && noHayPerdedor) {

            //TO:DO Obtener traslación no se tiene en cuenta el número.

            System.out.println("Indique una letra y número de posiciones");
            //obtenerTraslacion(sc.nextLine().charAt(0), sc.nextInt());
            moverFicha(tablero1, obtenerTraslacion(sc.nextLine().charAt(0), sc.nextInt()), jugadores, vidasJugadores, 0);
            moverFicha(tablero2, obtenerTraslacion(obtenerLetraAleatoria(), rd.nextInt(3)+1), jugadores, vidasJugadores, 1);
            //Mover ficha de la CPU.
            //Mostrar ambos tableros.
            System.out.println("Tablero 1: ");
            imprimirTablero(tablero1);
            System.out.println("\n\n\nTablero 2: ");
            imprimirTablero(tablero2);
            rondas++;
            sc.nextLine();
            noHayPerdedor = vidasJugadores[0]>0&&vidasJugadores[1]>0;
        }

        System.out.println("Enhorabuena el ganador es ...");
        if (hayGanador(tablero1,jugadores[0])){
            System.out.println("El Usuario");
        } else if (hayGanador(tablero2,jugadores[1])) {
            System.out.println("La CPU");
        }else if (vidasJugadores[0]==0){
            System.out.println("La CPU");
        }else {
            System.out.println("El Usuario");
        }
    }

    public static boolean esVacio(char[][] tablero, int x, int y) {
        return tablero[x][y] == '\u0000';
    }

    //FUNCIONES
    public static void rellenarTablero(char[][] tablero, char caracter, int numeroCasillas) {
        for (int i = 0; i < numeroCasillas; i++) {
            int x = rd.nextInt(10);
            int y = rd.nextInt(10);

            if (esVacio(tablero, x, y)) {
                tablero[x][y] = caracter;
            } else {
                i--;
            }
        }
    }

    public static void rellenarTableroConLibre(char[][] tablero, char caracter) {
        for (int i = 0; i < tablero.length; i++) {
            for (int j = 0; j < tablero[0].length; j++) {
                if (esVacio(tablero, i, j)) {
                    tablero[i][j] = caracter;
                }
            }
        }
    }

    //Aportas una letra y un número y te devuelve el vector de traslación.
    public static int[] obtenerTraslacion2(char letra, int numero) {
        //Falta asignar número

        int[] derecha = {0,1};
        int[] izquierda = {0,-1};
        int[] arriba = {-1,0};
        int[] abajo = {1,0};
        int[] diagonalIAr = {-1,-1};
        int[] diagonalDAr = {-1, 1};
        int[] diagonalIAb = {1,-1};
        int[] diagonalDAb = {1, 1};
        int[][] almacenTraslacion = {derecha,izquierda,arriba,abajo,diagonalIAr,diagonalDAr,diagonalIAb,diagonalDAb};
        char[] letras = {'D', 'A', 'W', 'S', 'Q', 'R', 'E', 'B'};
        String[] almacenDeMensajes = {"Se desplaza " + numero + " movimientos hacia la derecha", "Se desplaza " + numero + " movimientos hacia la izquierda",
                "Se desplaza " + numero + " movimientos hacia arriba", "Se desplaza " + numero + " movimientos hacia abajo",
                "Se desplaza " + numero + " movimientos hacia diagonal izquierda arriba" , "Se desplaza " + numero + " movimientos hacia diagonal derecha arriba",
                "Se desplaza " + numero + " movimientos hacia diagonal izquieda abajo", "Se desplaza " + numero + " movimientos hacia diagonal derecha abajo"};

        for (int i = 0; i < letras.length; i++) {
            if (letra == letras[i]){
                System.out.println(almacenDeMensajes[i]);
                return almacenTraslacion[i];

            }
        }
    return null;
    }
    public static int[] obtenerTraslacion(char letra, int numero) {
        //Falta asignar número


        switch (letra) {
            /*
            ‘D’ → Derecha. [1][0]
            ‘A’ → Izquierda.[-1][0]
            ’W’ → Arriba,[0][-1]
            ‘S’ → Abajo,[0][1]
            ‘Q’ → Diagonal Izq Arriba.[-1][-1]
            ‘R’ → Diagonal Der Arriba.[1][-1]
            ‘E’ → Diagonal Izq Abajo.[-1][1]
            ‘B’ → Diagonal Der Abajo [1][1]*/
            case 'D':
                System.out.println("Se desplaza " + numero + " movimientos hacia la derecha");
                return new int[]{0*numero, 1*numero};
            case 'A':
                System.out.println("Se desplaza " + numero + " movimientos hacia la izquierda");
                return new int[]{0*numero, -1*numero};
            case 'W':
                System.out.println("Se desplaza " + numero + " movimientos hacia arriba");
                return new int[]{-1*numero, 0*numero};
            case 'S':
                System.out.println("Se desplaza " + numero + " movimientos hacia abajo");
                return new int[]{1*numero, 0*numero};
            case 'Q':
                System.out.println("Se desplaza " + numero + " movimientos hacia la diagonal izquierda arriba");
                return new int[]{-1*numero, -1*numero};
            case 'R':
                System.out.println("Se desplaza " + numero + " movimientos hacia la diagonal derecha arriba");
                return new int[]{-1*numero, 1*numero};
            case 'E':
                System.out.println("Se desplaza " + numero + " movimientos hacia la diagonal izquierda abajo");
                return new int[]{1*numero, -1*numero};
            case 'B':
                System.out.println("Se desplaza " + numero + " movimientos hacia la diagonal derecha abajo");
                return new int[]{1*numero, 1*numero};
            default:
                return new int[]{0*numero, 0*numero};
        }
    }
    //Devuelves un TABLERO
    public static void moverFicha(char[][] tablero,int[] coordenadasMovimiento,char[] jugadores,int[] vidasJugador,int id){
        int[] coordenadaInicio = new int[0]; //Serán la posición que ocupe jugador en el tablero.

        for (int i = 0; i < tablero.length; i++) {
            for (int j = 0; j < tablero[0].length; j++) {
                if (tablero[i][j]==jugadores[id]){
                    coordenadaInicio=new int[]{i,j};
                }
            }
        }
        //YA TENGO COORDENADAS INICIO.
        int[] nuevaCoordenada = new int[]{coordenadaInicio[0]+coordenadasMovimiento[0], coordenadaInicio[1]+coordenadasMovimiento[1]};

        if (nuevaCoordenada[0]>9){
            nuevaCoordenada[0]-=10;
        }
        if (nuevaCoordenada[1]>9){
            nuevaCoordenada[1]-=10;
        }
        if (nuevaCoordenada[0]<0){
            nuevaCoordenada[0]+=10;
        }
        if (nuevaCoordenada[1]<0){
            nuevaCoordenada[1]+=10;
        }




        char caracterNuevaCoordenada = tablero[nuevaCoordenada[0]][nuevaCoordenada[1]];

        if (caracterNuevaCoordenada == 'M'){
            System.out.println("Has encontrado un MURO, no te puedes mover");
        } else if (caracterNuevaCoordenada == 'D') {
            System.out.println("Has encontrado un DARTHMAUL");
            tablero[coordenadaInicio[0]][coordenadaInicio[1]]='L';
            tablero[nuevaCoordenada[0]][nuevaCoordenada[1]]=jugadores[id];
            vidasJugador[id]=vidasJugador[id]-1;
            System.out.println("Has perdido una vida. Te quedan " + vidasJugador[id] + " vidas");
        } else if (caracterNuevaCoordenada == 'R') {
            System.out.println("Has encontrado un R2D2");
            tablero[coordenadaInicio[0]][coordenadaInicio[1]]='L';
            tablero[nuevaCoordenada[0]][nuevaCoordenada[1]]=jugadores[id];
            vidasJugador[id]=vidasJugador[id]-1;
            System.out.println("Has perdido una vida. Te quedan " + vidasJugador[id] + " vidas");
        } else if (caracterNuevaCoordenada == 'F') {
            System.out.println("Has ganado!!");
        } else {
            tablero[coordenadaInicio[0]][coordenadaInicio[1]]='L';
            tablero[nuevaCoordenada[0]][nuevaCoordenada[1]] = jugadores[id];
        }

        //... Conversión tablero.


    }

    public static char obtenerLetraAleatoria () {
        //Falta asignar número
        int numero = rd.nextInt(8);
        switch (numero) {
            /*
            0 → ‘D’ → Derecha. [1][0]
            1 → ‘A’ → Izquierda.[-1][0]
            2 → ’W’ → Arriba,[0][-1]
            3 → ‘S’ → Abajo,[0][1]
            4 → ‘Q’ → Diagonal Izq Arriba.[-1][-1]
            5 → ‘R’ → Diagonal Der Arriba.[1][-1]
            6 → ‘E’ → Diagonal Izq Abajo.[-1][1]
            7 → ‘B’ → Diagonal Der Abajo [1][1]*/
            case 0:
                return 'D';
            case 1:
                return 'A';
            case 2:
                return 'W';
            case 3:
                return 'S';
            case 4:
                return 'Q';
            case 5:
                return 'R';
            case 6:
                return 'E';
            case 7:
                return 'B';
            default:
                return 'D';

        }
    }

    public static void imprimirTablero (char[][] tablero){
        for (int i = 0; i < tablero.length; i++) {
            System.out.println(" ");
            for (int j = 0; j < tablero[0].length; j++) {
                if (tablero[i][j]=='Y'){
                    System.out.print(" \u001B[31m"+tablero[i][j]+"\u001b[0m");

                }else{
                    System.out.print(" "+tablero[i][j]);

                }
            }
        }
        System.out.println("\n");
    }

    public static boolean hayGanador (char[][] tablero,char letra){
        return tablero[9][9]==letra;
    }

}
