561
C, C++, C#, Java, Visual Basic, HTML, PHP, CSS, Javascript, Ajax, Joomla, MySql y más / Re: MasterMind con JavaSwing
« en: 07 de Diciembre 2020, 13:13 »
Hay algunas cosas que no veo claras.
Ahí parece dar a entender que hay relación entre el valor del Boton y su posición en el vector, pero no es así.
Yo quitaría la parte marcada en negrita.
Esto tampoco queda claro, dicho así parece que sea cambiarColor quien resetea el valor.
Yo lo cambiaría por:
Esto no está mal, pero creo que se podría mejorar:
La explicación es mejorable:
Esto que viene a continuación, es quizás lo más difícil de explicar, y lo has explicado muy bien.
Pero hay una cosita que llama la atención:
Yo en mi código use Integer para poder poner valores null y "marcar" elementos que ya no deben ser consultados.
Tu en cambio, pusiste valores -1.
Ambas formas funcionan, eso no es problema.
Pero al explicarlo en la documentación, quizás mejor no mencionar lo de poner valores null, puesto que en realidad no lo estás haciendo en tu código.
Por eso en realidad, en tu código no necesitas usar vectores Integer, puedes usar todos como vectores int.
La diferencia entre int e Integer, es que int es un "dato primitivo", es decir, una variable a la "antigua usanza" que Java hereda del lenguaje C (Java es un derivado de C) y básicamente es un apuntador a una dirección de memoria.
Integer es una clase "moderna", ya pensada para la Programación Orientada a Objetos.
Es mucho más que un puntero de memoria, permite tener métodos, constructores, herencias, polimorfismo, valor null, etc...
En mi caso, me interesó usarlo únicamente por poder darles valor null.
Pero perfectamente podría haber usado el tipo primitivo int y haberles dado valor -1
Bueno, valor -1 , o cualquier otro valor que no estuviera entre 1 y 6.
Los elementos de los vectores que son "válidos", únicamente pueden tener valores entre 1 y 6.
Si quiero marcarlos como "no válidos", o "no consultables" mejor dicho, me basta con darle un valor cualquiera que este fuera del rango entre 1 y 6.
Le podría dar valor 0, -34, 7, 1000,....
La cuestión era idear una fórmula simple para "marcar" elementos de los vectores que ya no quiero seguir consultando, porque ya me habían dado un "muerto" o un "herido".
En clase PanelColores:
Está bien, quizás yo añadiría una pequeña aclaración:
Citar
Clase Botón
Atributos
Int valor: Este atributo nos servirá para identificar el color que tiene como valor
ese momento el botón. Este valor esta codificado entre 1 y 6, que se corresponderá
con su posición en el Vector botones, y según ese valor, se decidirá su color.
Ahí parece dar a entender que hay relación entre el valor del Boton y su posición en el vector, pero no es así.
Yo quitaría la parte marcada en negrita.
Citar
Public void rotarValor(): Este método nos permite darle un ciclo al valor, es
decir al llegar al máximo , comenzamos de nuevo desde el principio, en este caso sería
llegar al valor 6 , reseteamos al valor 1. Y le metemos el método cambiarColor para
que se resetee el valor al llegar a 6.
Esto tampoco queda claro, dicho así parece que sea cambiarColor quien resetea el valor.
Yo lo cambiaría por:
Citar
Public void rotarValor(): Este método nos permite darle un ciclo al valor, es
decir al llegar al máximo , comenzamos de nuevo desde el principio, en este caso sería
llegar al valor 6 , reseteamos al valor 1.
Cada vez que se altera el valor, se invoca al método cambiarColor para que actualice el color mostrado en pantalla y se corresponda con el nuevo valor.
Citar
Public void actionPerformed (Actionevent e): Para que todo esto ocurra le
metemos el método actionPerformed para que el usuario cuando clickee , dentro
escribimos el método rotarValor().
Esto no está mal, pero creo que se podría mejorar:
Citar
Public void actionPerformed (Actionevent e): Para que todo esto ocurra le
metemos el método actionPerformed para que el usuario cuando clickee , se llama al método rotarValor() para pasar al siguiente valor y color.
Citar
Clase combinación
Atributos
Public int [] combinacion: Es el vector generado aleatoriamente
Public int intentos: El número de veces que se puede jugar
Public int muertos: Contabiliza cuando el color y la posición en combinación[]
es la misma que la que el usuario elige y se guarda en vector botones [4].
Public int heridos: Contabiliza cuando el color es acertado, pero la posición en
botones [4] no es la misma que en combinación[4]
La explicación es mejorable:
Citar
Clase combinación
Atributos
Public int [] combinacion: Es el vector generado aleatoriamente
Public int intentos: El número de veces que se puede jugar
Public int muertos: Contabiliza los "muertos". Un "muerto" se produce cuando un elemento de botones[] coincide en valor y posición con un elemento de combinacion[].
Public int heridos: Contabiliza los "heridos". Un "herido" se produce cuando un elemento de botones[] coincide en valor, pero no en posición, con un elemento de combinacion[].
Citar
Public Combinacion(): Es el constructor, donde inicializo el vector, meto elNo es el boolean quien controla los intentos:
método generaCombinacion(), inicializo también los intentos a 0 y con el boolean
resuelto = false, controlo los intentos.
Citar
Public Combinacion(): Es el constructor, donde inicializo el vector, meto el
método generaCombinacion(), inicializo también los intentos a 0 y con el boolean
resuelto = false, controlo si la combinación secreta ha sido resuelta o no.
Esto que viene a continuación, es quizás lo más difícil de explicar, y lo has explicado muy bien.
Pero hay una cosita que llama la atención:
Citar
Public String evaluar (Integer [] colores): Con esto evaluamos si ha habido
muertos y/o heridos según las reglas del Mastermind. He usado un array de clase
Integer en lugar del tipo primitivo int, por que con Integer puedo dar valores null o -1 a
los elementos del array, porque cuando vaya a comparar los colores, si al comparar
dos posiciones de dos arrays ( combinación y el de selección de usuario) se producen
muertos o heridos, ya no se consultarán más esas posiciones mientras se sigue
evaluando, por eso las marco con valor null o -1. El problema que tiene esto es que no
puedo trabajar directamente con el array de combinación del usuario, puesto que
destruiría su combinación, para resolver este problema hago una copia de
combinación y trabajo sobre esa copia.
Así este método se encarga de evaluar recibiendo como parámetro un array con la
selección que ha hecho el usuario, comparo con la copia de la combinación generada
aleatoriamente, contabilizo si hay muertos y heridos y devuelvo un String con el
resultado.
Primero contabilizo muertos recorriendo ambos arrays a ver si en la misma posición,
coinciden los colores.
Segundo busco herido en las posiciones que no hagan sido puestas a null o -1 (las que
no hayan generado muertos), ya que los heridos son colores escogidos que sí constan
en la combinación, pero no en la misma posiciones.
Yo en mi código use Integer para poder poner valores null y "marcar" elementos que ya no deben ser consultados.
Tu en cambio, pusiste valores -1.
Ambas formas funcionan, eso no es problema.
Pero al explicarlo en la documentación, quizás mejor no mencionar lo de poner valores null, puesto que en realidad no lo estás haciendo en tu código.
Por eso en realidad, en tu código no necesitas usar vectores Integer, puedes usar todos como vectores int.
La diferencia entre int e Integer, es que int es un "dato primitivo", es decir, una variable a la "antigua usanza" que Java hereda del lenguaje C (Java es un derivado de C) y básicamente es un apuntador a una dirección de memoria.
Integer es una clase "moderna", ya pensada para la Programación Orientada a Objetos.
Es mucho más que un puntero de memoria, permite tener métodos, constructores, herencias, polimorfismo, valor null, etc...
En mi caso, me interesó usarlo únicamente por poder darles valor null.
Pero perfectamente podría haber usado el tipo primitivo int y haberles dado valor -1
Bueno, valor -1 , o cualquier otro valor que no estuviera entre 1 y 6.
Los elementos de los vectores que son "válidos", únicamente pueden tener valores entre 1 y 6.
Si quiero marcarlos como "no válidos", o "no consultables" mejor dicho, me basta con darle un valor cualquiera que este fuera del rango entre 1 y 6.
Le podría dar valor 0, -34, 7, 1000,....
La cuestión era idear una fórmula simple para "marcar" elementos de los vectores que ya no quiero seguir consultando, porque ya me habían dado un "muerto" o un "herido".
En clase PanelColores:
Citar
Public PanelColores (Combinacion c): Es el constructor de la clase, donde añado
como atributo una referencia al objeto combinación que será instanciado en la clase
principal JFrame Mastermind.
Añado la creación de los 3 paneles dentro del propio constructor y añado como
atributo una referencia al objeto combinación
Está bien, quizás yo añadiría una pequeña aclaración:
Citar
Public PanelColores (Combinacion c): Es el constructor de la clase, donde añado
como atributo una referencia al objeto combinación que será instanciado en la clase
principal JFrame Mastermind.
Teniendo una referencia al objeto combinacion, cada PanelColor es capaz por sí solo de evaluar la jugada del usuario con la combinación secreta.
Añado la creación de los 3 paneles dentro del propio constructor y añado como
atributo una referencia al objeto combinación