/mastermind.java Secret
Created
January 7, 2020 04:59
Star
You must be signed in to star a gist
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
Programado por Luis Cabrera Benito | |
____ _____ _ _ _ | |
| _ \ | __ \ (_) | | | | |
| |_) |_ _ | |__) |_ _ _ __ _____| |__ _ _| |_ ___ | |
| _ <| | | | | ___/ _` | '__|_ / | '_ \| | | | __/ _ \ | |
| |_) | |_| | | | | (_| | | / /| | |_) | |_| | || __/ | |
|____/ \__, | |_| \__,_|_| /___|_|_.__/ \__, |\__\___| | |
__/ | __/ | | |
|___/ |___/ | |
Blog: https://parzibyte.me/blog | |
Ayuda: https://parzibyte.me/blog/contrataciones-ayuda/ | |
Contacto: https://parzibyte.me/blog/contacto/ | |
*/ | |
import java.util.InputMismatchException; | |
import java.util.Random; | |
import java.util.Scanner; | |
public class Main { | |
public static void main(String[] args) { | |
String menu = "¡Bienvenido! el programa va a pensar una contraseña de 5 dígitos y tú vas a intentar adivinarla\n" | |
+ "Si no aciertas: \nel programa te va a indicar con un * (asterisco) que el número que pusiste está en la posición correcta\n" | |
+ "Si es un _ (guión bajo) significa que el número está presente en la contraseña, pero va en una distinta posición\n" | |
+ "Si es un ' ' (espacio en blanco) significa que el número no está presente en la contraseña\n"; | |
// Imprimir menú | |
System.out.println(menu); | |
int longitud = 5; // Longitud de la contraseña | |
// Saber si usuario quiere repetidos | |
boolean conRepetidos = obtenerConRepetidos(); | |
String passwordCorrecto = obtenerPasswordAleatoria(conRepetidos, longitud); | |
int intentos = 1; | |
while (true) {// Ciclo infinito; se rompe cuando el usuario acierta con "break" | |
String suposicionUsuario = obtenerSuposicionDeUsuario(longitud); | |
if (suposicionUsuario.equals(passwordCorrecto)) { | |
System.out.printf("Ganaste en %d intentos\n", intentos); | |
break; | |
} | |
String pistas = obtenerPistas(suposicionUsuario, passwordCorrecto); | |
System.out.printf("Incorrecto. Pistas:\n%s\n", pistas); | |
intentos++; | |
} | |
} | |
private static String obtenerSuposicionDeUsuario(int longitud) { | |
String eleccion = ""; | |
while (eleccion.length() != longitud) { | |
System.out.println("¿Cuál crees que es la contraseña?: "); | |
Scanner sc = new Scanner(System.in); | |
eleccion = sc.nextLine(); | |
} | |
return eleccion; | |
} | |
private static boolean obtenerConRepetidos() { | |
System.out.println("¿Puede incluir repetidos? 1 = sí. 0 = no "); | |
return new Scanner(System.in).nextInt() == 1; | |
} | |
private static String obtenerPistas(String suposicionPassword, String passwordCorrecto) { | |
String pistas = ""; | |
for (int x = 0; x < suposicionPassword.length(); x++) { | |
// Si está en el lugar correcto se indica con un * | |
if (suposicionPassword.charAt(x) == passwordCorrecto.charAt(x)) { | |
pistas += "*"; | |
continue; | |
} | |
// Si está en la cadena pero no en el lugar correcto, se indica con un _ | |
int indiceCaracter = passwordCorrecto.indexOf(suposicionPassword.charAt(x)); | |
if (indiceCaracter != -1) { | |
pistas += "_"; | |
continue; | |
} | |
// Finalmente, si ninguna de las condiciones de arriba se cumple, el carácter no | |
// está | |
pistas += " "; | |
} | |
return pistas; | |
} | |
private static String obtenerPasswordAleatoria(boolean conRepetidos, int longitud) { | |
String muestra = "0123456789"; | |
Random random = new Random(System.currentTimeMillis()); | |
String pass = ""; | |
for (int x = 0; x < longitud; x++) { | |
// Tomamos un dígito aleatorio | |
int indiceAleatorio = random.nextInt(muestra.length()); | |
char digitoAleatorio = muestra.charAt(indiceAleatorio); | |
// Si no quieren repetidos... | |
if (!conRepetidos) { | |
// Mientras que en la cadena ya exista el carácter que acabamos de generar | |
while (pass.indexOf(digitoAleatorio) != -1) { | |
// Generamos otro | |
indiceAleatorio = random.nextInt(muestra.length()); | |
digitoAleatorio = muestra.charAt(indiceAleatorio); | |
} | |
} | |
// De cualquier forma, agregamos el dígito a la cadena | |
pass += digitoAleatorio; | |
} | |
return pass; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment