elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Java
| | | |-+  Juego MasterMind Java necesito ayuda
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Juego MasterMind Java necesito ayuda  (Leído 6,360 veces)
Rasgaroth

Desconectado Desconectado

Mensajes: 1


Ver Perfil
Juego MasterMind Java necesito ayuda
« en: 1 Febrero 2015, 17:24 pm »

Tengo que hacer el juego del MasterMind en java, por el momento he conseguido que me genere una clave aleatoria de 4 colores entre 6 colores existentes dentro del juego que seria lo que habria que adivinar, introduciendo por teclado una secuencia de 4 colores.

El juego trata de introducir una secuencia de colores en un orden concreto y si coincide con la que el programa habia generado en un principio ganas, pero si fallas pueden ocurrir dos cosas, que no aciertes ninguna posicion pero si el color y te apareceria un mensaje que te diria "Hay X fichas descolocadas" y " 0 fichas acertadas" o podria ser que acertases alguna y hubiese alguna descolocada. El problema lo tengo al intentar sacar el metodo de fichasAcertadas y fichasDescolocadas

pongo el codigo que tengo y a ver si algun alma caritativa me pudiese resolver estos dos metodos. Perdon por lo del code, no lo sabia.

Código
  1. import java.util.Random;
  2. import java.util.Scanner;
  3.  
  4. public class MasterMind {
  5.  
  6. public static void main(String[] args) {
  7. //char [] clave = GenerarClave();
  8.  
  9. System.out.println("Bienvenido al juego del MasterMind");
  10. System.out.println("");
  11. System.out.println("Escribe una secuencia de 4 colores introduciendo la letras del color elegido y pulsando intro hasta completar la secuencia.");
  12. System.out.println("M=Marron, R=Rojo, A=Azul, Z=Amarillo, N=Naranja y V=Verde");
  13. System.out.println("");
  14. MostrarSolucion(pedirSolucion());
  15. }
  16.  
  17. public static String [] pedirSolucion()  {
  18. String [] solucion = new String [4];
  19. Scanner input = new Scanner(System.in);
  20. System.out.println("Escriba la soluccion que crea que es correcta: ");
  21. for (int i = 0; i < solucion.length; i = i + 1) {
  22. String color = input.next();
  23. solucion[i] = color;
  24. }
  25. return solucion;
  26. }
  27.  
  28. public static void MostrarSolucion(String [] solucion){
  29. for (int i = 0; i < solucion.length; i = i + 1) {
  30. System.out.print(solucion[i] + " ");
  31. }
  32. System.out.println();
  33. }
  34.  
  35. static boolean estaRepetido(char color,char [] clave){
  36. boolean repetido = false;
  37. int i=0;
  38. while ( (i < clave.length)&&(repetido == false) ){
  39. if (color == clave[i]){
  40. repetido=true;
  41. }
  42. i++;
  43. }
  44. return repetido;
  45. }
  46.  
  47. public static char[] GenerarClave(){
  48. Random rnd = new Random();
  49. char [] clave = new char[4];
  50. int i=0;
  51. char posibleColor = 'Q';
  52. char posibleColor2 = 'Q';
  53. while(i < clave.length){
  54. if(i==0){
  55. double x = rnd.nextDouble();
  56. int color =(int) ((x*5)+1);
  57. switch (color) {
  58. case 1: clave[i] = 'M';break;
  59. case 2: clave[i] = 'R';break;
  60. case 3: clave[i] = 'N';break;
  61. case 4: clave[i] = 'A';break;
  62. case 5: clave[i] = 'Z';break;
  63. case 6: clave[i] = 'V';break;
  64. }
  65. i++;
  66. }else{
  67. double j = rnd.nextDouble();
  68. int color3 =(int) ((j*5)+1);
  69. switch (color3) {
  70. case 1: posibleColor = 'M';break;
  71. case 2: posibleColor = 'R';break;
  72. case 3: posibleColor = 'N';break;
  73. case 4: posibleColor = 'A';break;
  74. case 5: posibleColor = 'Z';break;
  75. case 6: posibleColor = 'V';break;
  76. }
  77. posibleColor2 = posibleColor;
  78. while (estaRepetido(posibleColor2,clave)){
  79. double y = rnd.nextDouble();
  80. int color2 =(int) ((y*5)+1);
  81. switch (color2) {
  82. case 1: posibleColor2 = 'M';break;
  83. case 2: posibleColor2 = 'R';break;
  84. case 3: posibleColor2 = 'N';break;
  85. case 4: posibleColor2 = 'A';break;
  86. case 5: posibleColor2 = 'Z';break;
  87. case 6: posibleColor2 = 'V';break;
  88. }
  89. }
  90. clave[i] = posibleColor2;
  91. i++;
  92. }
  93. }
  94. return clave;
  95. }
  96. }
  97.  


Mod: Tema movido a Java, procura usar los Sub-foros correctos


« Última modificación: 1 Febrero 2015, 20:14 pm por engel lex » En línea

3n31ch


Desconectado Desconectado

Mensajes: 445


Grandes conocimientos engendran grandes dudas


Ver Perfil
Re: Juego MasterMind Java necesito ayuda
« Respuesta #1 en: 1 Febrero 2015, 17:44 pm »

Amigo, si no pones las etiquetas code no se entiende mucho por favor. Es una regla del foro y tiene sus razones. Modifica tu mensaje y selecciona el código y fíjate que hay un combobox que dice GeShi seleccionas Java y ya esta. Todos felices.

Cuando hagas eso intentare ver tu código porque la verdad es que así como esta me da pereza.



Modifico. Gracias por agregar las etiquetas code, leí las reglas así que ahora voy a intentar ayudarte (intentare hacerlo sin código por ahora, pero si realmente te ves superado puedo intentar ayudarte un poco mas. Pero recuerda que estos tipos de ejercicios necesitan que tu emplees la lógica y así aprendes.

Primero que todo esos System.out.println("") para hacer una linea en blanco no gustan nada, mejor pon un \n:
System.out.println("Bienvenido al juego del MasterMind\n"); // El \n es un salto de linea

Existen mas secuencias de escape como estas: \b, \t, \r, \n, \', \", \\. Puedes ver que hace cada una aquí

Tambien en el ciclo for de pedir solucion, te recomiendo remplazar el i = i + 1 por un i++ (que quiere decir que le sumas uno) en caso de sumar de dos en dos puedes utilizar i+=2 que es lo mismo que i = i + 2. Si quieres mas info de esto busca en google por operadores aritmeticos y operadores de asignacion.

Ten cuidado, ya que nunca guardaste lo ingresado por el usuario, ya que lo pásate como parámetro directamente a mostrar solución, supongo que estabas haciendo pruebas, recuerda cambiarlo.

Valida en pedirSolucion lo ingresado por el usuario, ya que yo podría ingresarte cualquier letra, y te recomiendo guardar los valores en un char[], te sera mas fácil trabajar con ellos.

me puedes explicar en que usaras el metodo "estaRepetido"? Respecto a este método te recomendaría cambiar el ciclo while por algo así:
Código
  1. for(i = 0; i < clave.length; i++){
  2.        if(color == clave[i]) {
  3.                 repetido = true;
  4.                 break;
  5.         }
  6. }
  7.  

De esta manera es mas fácil de entender. ^^

En generar clave solo tienes que crear un char[4] de las letras M, R, N, A, Z, V no?

Código
  1. public static char[] generarClave(){
  2.            char[] posiblesClaves = new char[]{'M','R','N','A','Z','V'};
  3.            Random rnd = new Random();
  4.            char [] clave = new char[4];
  5.            int numeroRandom;
  6.            for(int i = 0;i<clave.length;i++){
  7.                numeroRandom = (int)rnd.nextDouble()*posiblesClaves.length;
  8.                clave[i] = posiblesClaves[numeroRandom];
  9.            }
  10.            return clave;
  11.        }

Así sera mas facil de entender creo yo. (verifica lo del numeroRandom que no recuerdo muy buen lo de generar números random, pero creo que entrega un numero de entre 0 5 (que es la cantidad de letras posibles))

Bien, ahora si para verificar cuantos coinciden no te entregare el código completo solo te explicare una posible manera.

Crea dos ciclos for anidados, el exterior sera el indice de colores generados por el programa y el interior sera el de colores ingresados por el usuario

Código
  1. for(int a = 0;a<generados.lengt;a++){
  2.    for(int b = 0; b<ingresdos.lengt; b++){
  3.           //Con esos dos indices acá podrás efectuar una comparación de cada elemento.
  4.    }
  5. }

Crea dos contadores, utiliza uno para cuando esta la posición y color correcto y otro para cuando el color esta correcto. Espero que te sea de ayuda, y suerte. (cualquier duda dime)


« Última modificación: 1 Febrero 2015, 18:43 pm por Nac-ho » En línea

Usuario Invitado


Desconectado Desconectado

Mensajes: 625



Ver Perfil
Re: Juego MasterMind Java necesito ayuda
« Respuesta #2 en: 1 Febrero 2015, 18:59 pm »

Antes que nada, el método pedirSolución debería ser así:

Código
  1. public static char[] pedirSolucion()  {
  2. char[] solucion = new char[4];
  3. Scanner input = new Scanner(System.in);
  4. System.out.println("Escriba la soluccion que crea que es correcta: ");
  5. for (int i = 0; i < solucion.length; i++) {
  6. solucion[i] = input.next().charAt(0);
  7. }
  8. return solucion;
  9. }

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):

Código
  1. public Map<Integer, Character> getFullMatches(char[] key, char[] solution) {
  2. // aciertos completos: posicion y color
  3. Map<Integer, Character> fullMatches = new HashMap<>();
  4. for(byte i=0; i<key.length; i++) {
  5. if(key[i] == solution[i])
  6. fullMatches.put(i,solution[i]);
  7. }
  8.        return fullMatches;
  9. }

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:

Código:
Posicion: 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.

Código
  1. public List<Character> getColorMatches(char[] key, char[] solution) {
  2. // aciertos solo de color
  3. List<Character> colorMatches = new ArrayList<>();
  4. for(byte i=0; i<key.length; i++) {
  5. for(byte k=0; k<solution.length; k++) {
  6. if(key[i] == solution[k])
  7. colorMatches.add(solution[k]);
  8. }
  9. }
  10. return colorMatches;
  11. }

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.
Código
  1. // comprobamos si hay aciertos completos
  2. if(!getFullMatches().isEmpty()) {
  3. System.out.println("Se han encontrado aciertos completos: \n");
  4. for (Map.Entry<String, String> entry : getFullMatches().entrySet()) {
  5. System.out.println("Posición: "+entry.getKey() + " | Color: " + entry.getValue());
  6. }
  7.  
  8.  
  9. }
  10.  
  11. // comprobamos fichas descolocadas (aciertos de color)
  12. if(!getColorMatches().isEmpty()) {
  13. System.out.println("Se han encontrado fichas descolocadas: \n");
  14. for (Character c : getColorMatches()) {
  15. System.out.println("Color de la ficha: " + c);
  16. }
  17. }

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!
« Última modificación: 1 Febrero 2015, 21:14 pm por Gus Garsaky » En línea

"La vida es muy peligrosa. No por las personas que hacen el mal, si no por las que se sientan a ver lo que pasa." Albert Einstein
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Ayuda con juego hechos en java
Java
aNgElUz 1 6,134 Último mensaje 6 Junio 2006, 15:59 pm
por whaky
NECESITO UN JUEGO EN JAVA CON HILOS
Java
bleyarkngel 0 7,649 Último mensaje 9 Julio 2009, 20:52 pm
por bleyarkngel
Juego Mastermind
Programación C/C++
adeur 3 5,133 Último mensaje 5 Julio 2012, 15:08 pm
por maxim_o
Ayuda juego Mastermind en C++
Programación C/C++
TheXiiscoZ 4 5,238 Último mensaje 11 Diciembre 2017, 03:56 am
por Serapis
Juego mastermind
Programación C/C++
Raskera 1 2,093 Último mensaje 26 Abril 2019, 20:05 pm
por Tachikomaia
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines