After reviewing the latest published responses to the java language, which is my method to deepen my knowledge of that language, I found a code from @el.trasgu, which, with your permission, I would like to try to compress, since I think could be possible and would decrease and optimize the program code a lot
His answer was to solve the hangman game, a game that I love by the way and his solution works perfectly
The code I'm referring to would be:
switch (vidas){
//en el primer fallo
case 7:
//dibujamos el ahoracado totalmente vacío, solo base y poste, para ello llamamos al método dibujo inicial
dibujoAhorcado = dibujoInicial();
System.out.println("");
for (int k = 0; k < dibujoAhorcado.length; k++){
System.out.print(dibujoAhorcado[k] + "\n");
}
System.out.println("");
break;
//segundo fallo
case 6:
//vamos a por el dibujo del ahorcado, enviamos por parámetro el dibujo a elegir y la opción
dibujoAhorcadoF = dibujoFinal(0, 0);
//sustituimos el valor del dibujo inicial por las del ahorcado en función de los fallos, para ello se llama al método dibuja ahorcado y se envía por parámetro el array dibujo ahorcado juego, el string debujo ahorcado F y la opción
dibujoAhorcadoJuego = metodoDibujaAhorcado(dibujoAhorcadoJuego, dibujoAhorcadoF, 0);
System.out.println("");
for (int k = 0; k < dibujoAhorcado.length; k++){
System.out.print(dibujoAhorcadoJuego[k] + "\n");
}
System.out.println("");
break;
case 5:
dibujoAhorcadoF = dibujoFinal(1, 0);
dibujoAhorcadoJuego = metodoDibujaAhorcado(dibujoAhorcadoJuego, dibujoAhorcadoF, 1);
System.out.println("");
for (int k = 0; k < dibujoAhorcado.length; k++){
System.out.print(dibujoAhorcadoJuego[k] + "\n");
}
System.out.println("");
break;
case 4:
dibujoAhorcadoF = dibujoFinal(2, 0);
dibujoAhorcadoJuego = metodoDibujaAhorcado(dibujoAhorcadoJuego, dibujoAhorcadoF, 2);
System.out.println("");
for (int k = 0; k < dibujoAhorcado.length; k++){
System.out.print(dibujoAhorcadoJuego[k] + "\n");
}
System.out.println("");
break;
case 3:
//para los errores tres y cuatro, utilizamos la misma posición del array ahorcado juego, pero distanta posición del array ahoracado f, así que le enviamos la opción 0 ó 1 para cambiar el valor elegido en el array
dibujoAhorcadoF = dibujoFinal(3, 0);
dibujoAhorcadoJuego = metodoDibujaAhorcado(dibujoAhorcadoJuego, dibujoAhorcadoF, 3);
System.out.println("");
for (int k = 0; k < dibujoAhorcado.length; k++){
System.out.print(dibujoAhorcadoJuego[k] + "\n");
}
System.out.println("");
break;
case 2:
dibujoAhorcadoF = dibujoFinal(3, 1);
dibujoAhorcadoJuego = metodoDibujaAhorcado(dibujoAhorcadoJuego, dibujoAhorcadoF, 3);
System.out.println("");
for (int k = 0; k < dibujoAhorcado.length; k++){
System.out.print(dibujoAhorcadoJuego[k] + "\n");
}
System.out.println("");
break;
case 1:
dibujoAhorcadoF = dibujoFinal(4, 0);
dibujoAhorcadoJuego = metodoDibujaAhorcado(dibujoAhorcadoJuego, dibujoAhorcadoF, 4);
System.out.println("");
for (int k = 0; k < dibujoAhorcado.length; k++){
System.out.print(dibujoAhorcadoJuego[k] + "\n");
}
System.out.println("");
break;
}
vidas--;
The code of the entire answer would be in the following link:
The first step that occurred to me was to eliminate the code to print that was repeated in each case of the Swintch
switch (vidas){
//en el primer fallo
case 7:
//dibujamos el ahoracado totalmente vacío, solo base y poste, para ello llamamos al método dibujo inicial
dibujoAhorcadoJuego = dibujoInicial();
metodoImprimeAhorcado(dibujoAhorcadoJuego);
break;
//segundo fallo
case 6:
//vamos a por el dibujo del ahorcado, enviamos por parámetro el dibujo a elegir y la opción
dibujoAhorcadoF = dibujoFinal(0, 0);
//sustituimos el valor del dibujo inicial por las del ahorcado en función de los fallos, para ello se llama al método dibuja ahorcado y se envía por parámetro el array dibujo ahorcado juego, el string debujo ahorcado F y la opción
dibujoAhorcadoJuego = metodoDibujaAhorcado(dibujoAhorcadoJuego, dibujoAhorcadoF, 0);
metodoImprimeAhorcado(dibujoAhorcadoJuego);
break;
case 5:
dibujoAhorcadoF = dibujoFinal(1, 0);
dibujoAhorcadoJuego = metodoDibujaAhorcado(dibujoAhorcadoJuego, dibujoAhorcadoF, 1);
metodoImprimeAhorcado(dibujoAhorcadoJuego);
break;
case 4:
dibujoAhorcadoF = dibujoFinal(2, 0);
dibujoAhorcadoJuego = metodoDibujaAhorcado(dibujoAhorcadoJuego, dibujoAhorcadoF, 2);
metodoImprimeAhorcado(dibujoAhorcadoJuego);
break;
case 3:
//para los errores tres y cuatro, utilizamos la misma posición del array ahorcado juego, pero distanta posición del array ahoracado f, así que le enviamos la opción 0 ó 1 para cambiar el valor elegido en el array
dibujoAhorcadoF = dibujoFinal(3, 0);
dibujoAhorcadoJuego = metodoDibujaAhorcado(dibujoAhorcadoJuego, dibujoAhorcadoF, 3);
metodoImprimeAhorcado(dibujoAhorcadoJuego);
break;
case 2:
dibujoAhorcadoF = dibujoFinal(3, 1);
dibujoAhorcadoJuego = metodoDibujaAhorcado(dibujoAhorcadoJuego, dibujoAhorcadoF, 3);
metodoImprimeAhorcado(dibujoAhorcadoJuego);
break;
case 1:
dibujoAhorcadoF = dibujoFinal(4, 0);
dibujoAhorcadoJuego = metodoDibujaAhorcado(dibujoAhorcadoJuego, dibujoAhorcadoF, 4);
metodoImprimeAhorcado(dibujoAhorcadoJuego);
break;
}
and create the method to print the drawing:
private static void metodoImprimeAhorcado(String[] dibujoAhorcadoJuego){
System.out.println("");
for (int k = 0; k < dibujoAhorcadoJuego.length; k++){
System.out.print(dibujoAhorcadoJuego[k] + "\n");
}
System.out.println("");
}
But now the most complicated issue for me would come. Would it be possible to replace that switch with a loop, taking into account that the cases are decreased and the parameters are increased and also one is repeated?
I have programmed this for, but it gives me several errors, and I get lost trying to solve them
vidas = 7;
int contador = 0;
for (int v = vidas; v > 0; v--){
if (contador == 0){
dibujoAhorcadoJuego = dibujoInicial();
metodoImprimeAhorcado(dibujoAhorcadoJuego);
}
else {
dibujoAhorcadoF = dibujoFinal(contador, 0);
dibujoAhorcadoJuego = metodoDibujaAhorcado(dibujoAhorcadoJuego, dibujoAhorcadoF, 1);
metodoImprimeAhorcado(dibujoAhorcadoJuego);
}
contador++;
}
mistakes:
*Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 6
at variosprogramacion.AhorcadoII.dibujoFinal(AhorcadoII.java:249)
at variosprogramacion.AhorcadoII.iniciarJuego(AhorcadoII.java:149)
at variosprogramacion.AhorcadoII.metodoMenu(AhorcadoII.java:53)
at variosprogramacion.AhorcadoII.metodoMenu(AhorcadoII.java:46)
at variosprogramacion.AhorcadoII.main(AhorcadoII.java:23)
Java Result: 1*
Thank you
In @el.trasgu's code the final drawing method is more or less like this
We see that it
dibujoAhorcadoF
is of length 6 (from zero to five).Tu
contador
starts at zero and is incremented by one for each iteration of the for. It will eventually get to six (when v is 1, I think) and thenvalor
from that drawFinal method it will be six. You will be looking at position 6 ofdibujoAhorcadoF
, which does not exist.Well, after fighting all afternoon with the code and the personal challenge of eliminating the switch and compressing the code as much as I could think of, I have the following:
I'm sure it can be compressed even more and in other ways, but my head can't go any further. Only taking into account the switch block, around 40 lines have been reduced and the process has been automated, because before each case each option was entered by hand and now it is generated iteratively
For the drawing of the hanged man I used the method created by @Vanessa
By the way, the loop would not make sense, I suppose that you would be confused in its usefulness by the iteration in the case options (1, 2, 3, 4, 5 ...) but that would not be iteration, if not the number of errors or failures with each letter and the position number that is requested according to that number of failures to the array of the hangman drawing.
If we put that loop here, what we would get would be to print all the levels of the hangman for each wrong letter
All the best