Jugada.java 10.7 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268
import java.util.Arrays;

public class Jugada {
    String posibleJugada = "CARTA ALTA";

    public Jugada() {

    }

    // ----------------------------------------------------------------------------------------------------
    // ---------------------- Metodos Auxiliares ----------------------

    // Metodo para Crear el Array con los objetos Carta
    public String[] crearArray(Carta carta1, Carta carta2, Carta carta3, Carta carta4, Carta carta5) {
        String[] mano = new String[5];
        mano[0] = carta1.valorPalo();
        mano[1] = carta2.valorPalo();
        mano[2] = carta3.valorPalo();
        mano[3] = carta4.valorPalo();
        mano[4] = carta5.valorPalo();
        return mano;
    }

    // Metodo para separar los los valores numericos de los palos
    public int[] valoresNumericosEnArray(String[] mano) {
        int[] valorNumerico = new int[5];

        for (int i = 0; i < mano.length; i++) {
            // Guardo en var tipo String el primer caracter del String, 
            // que seria el valor numerico de la mano
            String valorNumericoString = String.valueOf(mano[i].charAt(0));

            // Reasignamos el valor a entero en caso que encontremos alguna de las letras posibles
            switch (valorNumericoString) {
                case "A":
                    valorNumerico[i] = 1;
                    break;
                case "T":
                    valorNumerico[i] = 10;
                    break;
                case "J":
                    valorNumerico[i] = 11;
                    break;
                case "Q":
                    valorNumerico[i] = 12;
                    break;
                case "K":
                    valorNumerico[i] = 13;
                    break;
                default:
                    // En caso de no encontrar ninguna letra, convertimos el string a entero
                    valorNumerico[i] = Integer.parseInt(valorNumericoString);
                    break;
            }
        }
        // Ordeno el Array Numerico de menor a mayor
        Arrays.sort(valorNumerico);
        return valorNumerico;
    }

    // Metodo para separar los los palos de los valores numericos
    public String[] palosEnUnArray(String[] mano) {
        String[] valorPalo = new String[5];
        for (int i = 0; i < mano.length; i++) {
            String valorPaloString = String.valueOf(mano[i].charAt(1));
            valorPalo[i] = valorPaloString;
        }
        return valorPalo;
    }

    // Metodo para retornar el contador de coincidencias
    // Esta forma de comparar los elementos del array, se realiza de la misma forma en todos los casos excepto en el metodo
    // EscaleraDeColor. Por esta razon, creamos esta funcion para ejecutarse varias veces sin la necesidad de repetir codigo.
    // En realidad, esta es la intencion de todos los metodos auxiliares.
    public int contadorDeCartasCoincidentes(int[] mano) {
        int contador = 0;
        for (int i = 0; i < mano.length - 1; i++) {
        // Si el numero en la posicion [i] es igual al que esta en la sig. posicion, el contador se aumenta.
            if (mano[i] == mano[i + 1]) {
                contador++;
            }
        }
        return contador;
    }

    // Metodo para ejecutar todos los metodos de comprobacion
    public void ejecutarComprobaciones(Carta c1, Carta c2, Carta c3, Carta c4, Carta c5) 
    {
        escaleraColor(c1, c2, c3, c4, c5);
        poker(c1, c2, c3, c4, c5);
        full(c1, c2, c3, c4, c5);
        trio(c1, c2, c3, c4, c5);
        parDoble(c1, c2, c3, c4, c5);
        par(c1, c2, c3, c4, c5);
    }

    // Metodo para imprimir que jugada seria. (Poker, Escalera de color, full, etc.)
    public void imprimirResultado () 
    {
        System.out.println(this.posibleJugada);
    } 

    // ----------------------------------------------------------------------------------------------------
    // ---------------------- Metodos De Comprobacion ----------------------

    //                          Metodo Escalera De Color
    public void escaleraColor(Carta c1, Carta c2, Carta c3, Carta c4, Carta c5) {
        String[] mano = crearArray(c1, c2, c3, c4, c5);

        int[] manoNumerica = valoresNumericosEnArray(mano);
        String[] manoPalos = palosEnUnArray(mano);

        // Impresion de la mano para que se vea en onsola y se compruebe si esta bien la Jugada 
        for ( int i = 0; i  < manoNumerica.length; i++) 
        {
            System.out.println("Linea 110 " + manoNumerica[i]);
        }

        int contador1 = 0;
        for (int i = 0; i < manoNumerica.length - 1; i++) {
            // Si el dado en la posicion [0] es 1 y le sumas 1, el resultado debe ser igual
            // al dado de la posicion siguiente
            if (manoNumerica[i] + 1 == manoNumerica[i + 1]) {
                contador1++;
            }
        }

        int contador2 = 0;
        for (int i = 0; i < manoPalos.length - 1; i++) {
            if (manoPalos[i].equals(manoPalos[i + 1])) {
                contador2++;
            }
        }

        //              ----------- Comprobaciones -----------
        if ((contador1 == 4 && contador2 == 4) || (contador1 == 3 && contador2 == 4 && manoNumerica[0] == 1 && manoNumerica[4] == 13)) 
        {
            this.posibleJugada = "ESCALERA DE COLOR";
        } else if (contador1 == 4 && contador2 < 4)
        {
            this.posibleJugada = "ESCALERA";
        } else if (contador2 == 4 && contador1 < 4) {
            this.posibleJugada = "COLOR";
        }
    }

    // ------------------------------------------------------------------------------------
    //                              Metodo POKER
    public void poker(Carta c1, Carta c2, Carta c3, Carta c4, Carta c5) 
    {
        String[] mano = crearArray(c1, c2, c3, c4, c5);

        int[] manoNumerica = valoresNumericosEnArray(mano);
        int contador = contadorDeCartasCoincidentes(manoNumerica);

        //              ----------- Comprobaciones -----------
        if (contador == 3 && manoNumerica[1] == manoNumerica[2] && manoNumerica[2] == manoNumerica[3]) {
            this.posibleJugada = "POKER";
        }
    }

    // ------------------------------------------------------------------------------------
    //                              Metodo FULL
    public void full(Carta c1, Carta c2, Carta c3, Carta c4, Carta c5) 
    {
        String[] mano = crearArray(c1, c2, c3, c4, c5);

        int[] manoNumerica = valoresNumericosEnArray(mano);
        int contador = contadorDeCartasCoincidentes(manoNumerica);

        //              ----------- Comprobaciones -----------
        if ((contador == 3 && manoNumerica[2] != manoNumerica[3] && manoNumerica[3] == manoNumerica[4])  || (contador == 3 && manoNumerica[2] != manoNumerica[1] && manoNumerica[0] == manoNumerica[1])) {
            this.posibleJugada = "FULL";
        }
    }

    // ------------------------------------------------------------------------------------
    //                              Metodo TRIO
    public void trio(Carta c1, Carta c2, Carta c3, Carta c4, Carta c5)  
    {
        String[] mano = crearArray(c1, c2, c3, c4, c5);

        int[] manoNumerica = valoresNumericosEnArray(mano);
        int contador = contadorDeCartasCoincidentes(manoNumerica);

        // TRIO: tres cartas del mismo valor y dos de un valor diferente
        // Las 3 opciones posibles son:
        // 1,1,1,2,4
        // 1,2,4,4,4
        // 1,2,2,2,4

        //              ----------- Comprobaciones -----------
        if ( (contador == 2 && manoNumerica[0] == manoNumerica[1] && manoNumerica[1] == manoNumerica[2] 
        && manoNumerica[2] != manoNumerica[3] && manoNumerica[3] != manoNumerica[4] ) || 
        
        (contador == 2 && manoNumerica[0] != manoNumerica[1] && manoNumerica[1] != manoNumerica[2]
        && manoNumerica[2] == manoNumerica[3] && manoNumerica[3] == manoNumerica[4]) || 
        
        (contador == 2 && manoNumerica[0] != manoNumerica[1] && manoNumerica[1] == manoNumerica[2] 
        && manoNumerica[2] == manoNumerica[3] && manoNumerica[3] != manoNumerica[4]) ) 
        {
            this.posibleJugada = "TRIO";
        }


    }

    public void parDoble(Carta c1, Carta c2, Carta c3, Carta c4, Carta c5) 
    {
        String[] mano = crearArray(c1, c2, c3, c4, c5);

        int[] manoNumerica = valoresNumericosEnArray(mano);
        int contador = contadorDeCartasCoincidentes(manoNumerica);

        // PAR DOBLE: dos cartas del mismo valor, otras dos cartas del mismo valor diferente al anterior y una carta desemparda
        // Las 3 opciones posibles son:
        // 1,1,2,2,4
        // 1,2,2,4,4
        // 1,1,2,4,4

        //              ----------- Comprobaciones -----------
        if ( (contador == 2 && manoNumerica[0] == manoNumerica[1] && manoNumerica[1] != manoNumerica[2] && 
              manoNumerica[2] == manoNumerica[3] && manoNumerica[3] != manoNumerica[4]) ||

              (contador == 2 && manoNumerica[0] != manoNumerica[1] && manoNumerica[1] == manoNumerica[2] && 
              manoNumerica[2] != manoNumerica[3] && manoNumerica[3] == manoNumerica[4]) ||

              (contador == 2 && manoNumerica[0] == manoNumerica[1] && manoNumerica[1] != manoNumerica[2] && 
              manoNumerica[2] != manoNumerica[3] && manoNumerica[3] == manoNumerica[4]) 
            )     
        {
            this.posibleJugada = "PAR DOBLE";
        }
    }

    public void par(Carta c1, Carta c2, Carta c3, Carta c4, Carta c5) 
    {
        String[] mano = crearArray(c1, c2, c3, c4, c5);
        int[] manoNumerica = valoresNumericosEnArray(mano);
        int contador = contadorDeCartasCoincidentes(manoNumerica);

        // Par (one pair) es una mano formada por dos cartas del mismo valor más tres cartas adicionales de valor distinto de la pareja 
        // y distintas entre sí. 
        // Las 4 opciones disponibles son:        
        // 1,1,2,3,4 
        // 1,2,3,4,4
        // 1,2,2,3,4
        // 1,2,3,3,4

        //              ----------- Comprobaciones -----------
        if ( (contador == 1 && manoNumerica[0] == manoNumerica[1] && manoNumerica[1] != manoNumerica[2] && 
              manoNumerica[2] != manoNumerica[3] && manoNumerica[3] != manoNumerica[4]) ||

              (contador == 1 && manoNumerica[0] != manoNumerica[1] && manoNumerica[1] != manoNumerica[2] && 
              manoNumerica[2] != manoNumerica[3] && manoNumerica[3] == manoNumerica[4]) ||

              (contador == 1 && manoNumerica[0] != manoNumerica[1] && manoNumerica[1] == manoNumerica[2] && 
              manoNumerica[2] != manoNumerica[3] && manoNumerica[3] != manoNumerica[4]) ||

              (contador == 1 && manoNumerica[0] != manoNumerica[1] && manoNumerica[1] != manoNumerica[2] && 
              manoNumerica[2] == manoNumerica[3] && manoNumerica[3] != manoNumerica[4])
            )     
        {
            this.posibleJugada = "PAR";
        }
    }

}