Combinaciones.java 4.81 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
/*
 * En esta clase se generan todas las manos de cartas posibles.
 * Obtiene un conjunto de 7 cartas (llamado "cartas en la mesa"), y genera combinaciones de 5 cartas
 * El conjunto de cartas tambien se carga manualmente (cargar cartas en la mesa manual)
 * */

package mejorCombinacion;

import java.util.ArrayList;

import com.roshka.bootcamp004.mano.*;

public class Combinaciones {
	Carta [][] combinaciones;
	Carta[] cartasEnlaMesa;
	
	public Combinaciones() {
		this.combinaciones = new Carta[2520][5];//Variable donde carga todas las combinaciones de carta
		Mano mano = new Mano();
		this.cartasEnlaMesa = (new ClasificadorMano()).ordenarCartasValor(mano.aArrayTipoCarta());
		//Imprime las cartas
		System.out.println("Las cartas de la mesa son:");
		System.out.println(mano.aCadena());
		//Cargamos las combinaciones
		this.cargarManosPosibles();
	}
	
	//Este metodo carga las manos de cartas
	private void cargarManosPosibles() {
		ArrayList<ArrayList<Integer>> pos_combinaciones = this.generarCombinaciones();
		//Ahora vamos a cargar las cartas
		for(int i=0;i<this.combinaciones.length;i++) {
			for(int j=0;j<this.combinaciones[i].length;j++) {
				this.combinaciones[i][j] = this.cartasEnlaMesa[pos_combinaciones.get(i).get(j)];
			}
		}
	}
	
	//Este metodo carga las "cartas en la mesa" de forma manual
	public void cargarCartasEnLaMesaManual(Carta[] cargar) {
		if(cargar.length==7) {
			this.cartasEnlaMesa = cargar;
			this.combinaciones = new Carta[2520][21];
			this.cargarManosPosibles();
		}else {
			System.out.println("Se necesita solo 7 cartas");
		}
	}
	
	//Esto te genera todas las posiciones posibles, basado en la permutacion
	private  ArrayList<ArrayList<Integer>> generarCombinaciones() {
		//Carga la combinacion actual
		ArrayList<Integer> combinacion;
		//Carga las combinaciones posibles
        ArrayList<ArrayList<Integer>> resultado = new ArrayList<>();
        //Numero base para hallar la combinacion por medio de la division
        int numero = 16806;
        //Numero necesario para hallar todas las combinaciones posibles
        int numero_base = numero;
        //Actua mientras exista combinaciones posibles
        while(numero_base>=0) {
            combinacion = new ArrayList<>();//Creamos una carga de combinacion
            while(numero>=7) {//Carga las combinaciones mientras la dividendo sea mayor a 7
                combinacion.add(numero%7);//Carga el resto
                numero = numero/7;//Realiza la division
            }
            combinacion.add(numero);//Carga el numero menor al 7
            while(combinacion.size()<5) {//Comprueba si aun hay lugar en el bloque, y los carga con cero
                combinacion.add(0);
            }
            resultado.add(combinacion);//Carga la combinacion
            numero_base = numero_base -1;//Creamos la base para la siguiente combinacion
            numero = numero_base;
        }
        //Esto sirve para simplificar las combinaciones
        //Se coloca 2521, porque la permutacion de 7 elementos que se desea armar 5 combinaciones sin importar la posicion
        //da como resultado 2520
        while(resultado.size()>2521){
	        for(int k = 0;k<resultado.size();k++){
	            ArrayList<Integer> indice = resultado.get(k);
	            boolean valido = true;
	            for(int i = 0;i<indice.size()-1 && valido;i++){
	                for(int j=i+1;j<indice.size() && valido;j++){
	                    if(indice.get(i)==indice.get(j)){
	                        // System.out.println("Borrado: "+indice.toString());
	                        valido = false;
	                    }
	                }
	            }
	            if(!valido){
	                resultado.remove(k);
	            }
	        }
        }
        //Ahora vamos a ordenar para despues hallar las lista con permutacion
        for(int i = 0;i<resultado.size();i++){
            //Recorre la combinacion
            for(int j = 0;j<resultado.get(i).size()-1;j++){
                int menor = resultado.get(i).get(j);
                int pos_menor = j;
                for(int k = j+1;k<resultado.get(i).size();k++){
                    if(resultado.get(i).get(k)<menor){
                        menor = resultado.get(i).get(k);
                        pos_menor = k;
                    }
                }
                if(pos_menor!=j){
                    int aux = resultado.get(i).get(j);
                    resultado.get(i).set(j,resultado.get(i).get(pos_menor));
                    resultado.get(i).set(pos_menor,aux);
                }
            }
        }
		return resultado;
	}
	
	
	public Carta[][] obtenerCombinaciones(){
//		for(int i=0;i<this.combinaciones.length;i++) {
//			String cartas="";
//			for(int j=0;j<this.combinaciones[i].length;j++) {
//				cartas=cartas+this.combinaciones[i][j].obtenerCarta() + " ";
//			}
//			System.out.println(cartas);
//		}
		return this.combinaciones;
	}
}