Antes que nada, el método pedirSolución debería ser así:
public static char[] pedirSolucion() {
char[] solucion = new char[4];
Scanner input
= new Scanner
(System.
in); System.
out.
println("Escriba la soluccion que crea que es correcta: "); for (int i = 0; i < solucion.length; i++) {
solucion[i] = input.next().charAt(0);
}
return solucion;
}
Pedimos que se ingrese una línea de texto y se aplica el método
charAt(0) que extrae y devuelve el primer carácter del texto ingresado. Así trabajas todo con arreglos char en lugar de que la solución sea un array String.
Bien, una vez explicado ésto, creamos un método que obtenga los aciertos completos (posición y color):
public Map<Integer, Character> getFullMatches(char[] key, char[] solution) {
// aciertos completos: posicion y color
Map<Integer, Character> fullMatches = new HashMap<>();
for(byte i=0; i<key.length; i++) {
if(key[i] == solution[i])
fullMatches.put(i,solution[i]);
}
return fullMatches;
}
Map<Key, Value> es un tipo de dato que guarda valores asociados, es decir, a posición de la ficha vendría a ser la llave, y su valor el color:
Un Map, List o en su defecto Collection, trabaja con Objetos. Debes saber que cada tipo de dato primitivo (char, int, byte, double, float) tiene su
Wrapper, que es una clase que engloba éstos datos, permitiéndote extender su funcionalidad al ser objetos. La JVM hace lo que se llama
upcasting que es convertir un primitivo a su Wrapper. Es por ésto, que aunque el objeto Map recibe un Character, le podemos pasar un char, porque la JVM lo convertirá a Character automáticamente. Sucede lo inverso con el
downcasting.
Ahora, un método para los aciertos de color, que vendrían a ser fichas descolocadas. Como no nos interesa la posición del color porque es obvio, solo guardamos el color de la ficha. Por eso en lugar de un Map, utilizamos un List, que como su nombre lo indica viene a ser una lista.
public List<Character> getColorMatches(char[] key, char[] solution) {
// aciertos solo de color
List<Character> colorMatches = new ArrayList<>();
for(byte i=0; i<key.length; i++) {
for(byte k=0; k<solution.length; k++) {
if(key[i] == solution[k])
colorMatches.add(solution[k]);
}
}
return colorMatches;
}
Ahora sólo comprobamos si hay aciertos completos y de colores solamente. Para ésto, primero verificamos que el objeto Map devuelto por los métodos anteriores no esté vacío. Si lo está quiere decir que no se han encontrado aciertos.
// comprobamos si hay aciertos completos
if(!getFullMatches().isEmpty()) {
System.
out.
println("Se han encontrado aciertos completos: \n"); for (Map.
Entry<String, String
> entry
: getFullMatches
().
entrySet()) { System.
out.
println("Posición: "+entry.
getKey() + " | Color: " + entry.
getValue()); }
}
// comprobamos fichas descolocadas (aciertos de color)
if(!getColorMatches().isEmpty()) {
System.
out.
println("Se han encontrado fichas descolocadas: \n"); System.
out.
println("Color de la ficha: " + c
); }
}
Quizás te resulte un poco complejo pero no lo es. Si tienes dudas de algún método, nada mejor como ver la documentación del mismo en la API de Java (la encuentras en Google
). Salu2!