Skip to content

Instantly share code, notes, and snippets.

@parzibyte

parzibyte/mastermind.java Secret

Created Jan 7, 2020
Embed
What would you like to do?
/*
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