Aprende Java Facil. Capítulo 9. Crear un dispositivo de distracción. Con bucles, condicionales y scanner

Crear un dispositivo de distracción. Con bucles, condicionales y scanner

No me había dado cuenta, pero ya llevo casi un mes y medio entre rejas. Puede que no sea mucho tiempo, pero ya he forjado una gran amistad con Bud. Le comenté mi situación y está dispuesto a ayudarme. Hoy, por fin, va a contarme el plan que me permitirá salir de aquí. No me ha dado ninguna pista, así que no tengo ni idea de cómo lo vamos a hacer.

Bud está bastante contento con mi nivel de Java. He sido un buen estudiante y estoy aprendiendo muy rápido. El problema es que, si escapo de la cárcel, ya puedo olvidarme de continuar con mi progreso. Mi futuro es muy incierto en estos momentos. Solo puedo hacer planes diarios; planificar cosas de una semana para otra es un lujo.

Mi destino es incierto. Sin ir más lejos, hoy he recibido un mensaje de uno de los guardias: me han asignado un trabajo en la lavandería. A las tres de la tarde tengo que presentarme allí, y no sé cuál será mi cometido. Sea lo que sea, seguro que es mejor que estar en la celda sin hacer nada.

He estado solo en la celda todo el día. Es agradable tener un poco de privacidad de vez en cuando. La soledad a veces te ayuda a aclarar las ideas. El tiempo se me ha pasado muy rápido y, sin darme cuenta, ya estoy de camino a la lavandería. Me pregunto cuánta gente trabajará allí. Es posible que pueda hacer nuevos amigos.

Nada más llegar, me di cuenta de que mi plan de socializar se iba totalmente al traste. Quienes me estaban esperando eran, en realidad, Bud y Pedro. Fue entonces cuando me dijeron que tenían un plan para fugarse de la cárcel. Necesitaban a una persona más y, gracias a mis conocimientos de programación, yo podría unirme.

Había un pequeño problema. Ellos querían fugarse, pero yo en realidad no. No quería pasarme el resto de la vida huyendo. Necesito salir solo durante un rato para así desenmascarar a Rich. Bud lo sabía, así que me ofreció una solución. Ellos dos se escaparían, pero yo, después de dos horas, volvería a la cárcel. Debería ser suficiente para conseguir una confesión de Rich, regresar a mi celda y que nadie se enterase de mi excursión.

Me costó decidirme algo menos de dos minutos. Por supuesto, acepté. Creo que estos dos tienen todo bien estudiado, así que parece que el riesgo es mínimo. Lo que no sabía es que el plan iba a comenzar al día siguiente. Bud no me había estado enseñando Java por casualidad. Necesitaban a una tercera persona que supiese programar para llevar el plan a cabo.

La primera parte del plan es sencilla. Bueno, al menos mi aportación. En la biblioteca de la cárcel hay varios ordenadores con los que se puede acceder a todo el sistema de seguridad. Desde ahí, Pedro va a acceder a la función de alarma de la cárcel y hacer que se dispare durante algunos minutos. Gracias a esa distracción, Bud podrá acceder al despacho del director, donde conseguirá algo que nos ayudará en el siguiente paso.

Es importante que se acceda desde uno de los ordenadores de la biblioteca, ya que, si se hace desde el ordenador de Pedro o el de Bud, los descubrirían a los pocos minutos. Ambos portátiles están muy controlados  y  cada  acción  queda registrada.

Hay un pequeño problema, y es que Pedro no tendrá mucho tiempo para hackear el sistema. Lo cierto es que hay mucho que programar y apenas unos pocos minutos para hacerlo sin ser descubierto. Ahí es donde entro yo. Debo dejar creados cinco programas en Java, ocultos en el PC de la biblioteca, que Pedro utilizará después para hacer su magia.

Dispongo exactamente de una hora de tiempo en la biblioteca. Pero normalmente los ordenadores están muy solicitados, así que es posible que solo pueda usarlos durante media hora. No importa, me han explicado exactamente lo que tengo que hacer, así que tengo tiempo de sobra.

Mañana es el gran día. Estoy algo nervioso, pero esta noche intentaré descansar. No es fácil dormir en estas circunstancias, pero trataré de pensar en que, si todo sale bien, demostraré mi inocencia y podré salir de aquí por fin.

Programa 1

 

Lo primero será crear un programa que descubra la contraseña del sistema central. La contraseña consta de 6 dígitos, de los cuales creemos que conocemos 5. Por lo tanto, simplemente habrá que comprobar 10 combinaciones.

El problema es que, si se comprueban los datos demasiado rápido, el sistema puede detectarlo. Así que, después del noveno intento, hay que esperar al menos 30 segundos. Para ello, haremos que el programa se detenga después de probar 9 intentos, y para comprobar el último deberemos escribir “seguir” por teclado.

Aquí tienes el código que he utilizado. Revisa línea por línea y verás cómo comprendes su funcionamiento sin problemas:

 

Solución:

 

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {

        // Pass es la contraseña que no sabemos. Está oculta en el programa.
        // De momento generamos una variable para ello y le damos valor 0.
        // Pero en las líneas de código reales de la cárcel es una contraseña real.
        int pass = 0;

        // Sabemos todos los números de la contraseña menos el último.
        int passIncompleto = 58987;

        // Declaramos la variable para los intentos de adivinar la contraseña.
        int passCompleto;

        // Creamos un Scanner ya que necesitaremos introducir texto.
        Scanner scan = new Scanner(System.in);

        // Creamos una variable para continuar
        // En caso de llegar al noveno intento Pedro deberá esperar 30 segundos
        // Después deberá pulsar "seguir"
        String seguir = "seguir";

        // Nuestro programa tendrá 10 intentos.
        // Así que creamos un bucle "for" para ello.
        for (int i = 0; i < 10; i++) {

            // De esta forma generamos el último número que se añade
            // a nuestra contraseña incompleta.
            passCompleto = passIncompleto * 10 + i;

            // Cuando nuestro intento coincida con la contraseña real,
            // se mostrará un texto.
            if (pass == passCompleto) {
                System.out.println("Esta es la contraseña");
                break;
            }

            // Necesitamos avisar a Pedro si el programa ha realizado 8 intentos
            // Después él decide si quiere probar el último
            if (i == 9) {
                System.out.println("Este es el noveno intento, debes esperar 30 segundos");
                System.out.println("Escribe seguir para continuar");
                String pausa = scan.nextLine();

                if (!seguir.equals(pausa)) {
                    System.out.println("Error");
                    System.exit(0);
                }
            }
        }

        System.out.println("Contraseña conseguida con éxito: " + pass);
    }
}

Programa 2

 

Con la contraseña podemos entrar al sistema central; desde allí, se puede acceder a la alarma. Esta se encuentra en un circuito donde generalmente se ahorra energía y está apagada todo el tiempo. Por lo tanto, antes de nada, hay que asegurarse de que la electricidad esté funcionando. Después de que esta condición se cumpla, Pedro deberá marcar como true la opción de alarma de incendios manual. De esta manera, posteriormente podrá hacer que salte. Vamos a dejarle el código bien preparado.

Vamos a crear un programa que busque la variable booleana alarmaActivada y la marque como true. Pero solamente si la variable booleana electricidadOn está activada. Si no, el programa tendrá que activarla.

 

Solución:

 

public class Main {
    public static void main(String[] args) {
        // Declaración de las variables
        boolean electricidadOn = false;
        boolean alarmaActivada = false;

        // Comprobamos el estado de electricidadOn
        if (electricidadOn) {
            // Si electricidadOn está activada, activamos la alarma
            alarmaActivada = true;
            System.out.println("La electricidad está activada. La alarma se ha activado.");
        } else {
            // Si electricidadOn no está activada, la activamos y luego activamos la alarma
            electricidadOn = true;
            alarmaActivada = true;
            System.out.println("La electricidad no estaba activada. Se ha activado la electricidad y la alarma.");
        }

        // Mostrar el estado final de las variables
        System.out.println("Estado final - Electricidad: " + electricidadOn
                + ", Alarma: " + alarmaActivada);
    }
}

 

Programa 3

 

La alarma no puede dispararse en cualquier momento. Es preciso que lo haga cuando todos los carceleros se encuentren en sus garitas. De este modo, hasta que lleguen a la sala central para desactivar la alarma, pasarán al menos 60 segundos. Ese es el tiempo que necesitamos para que dure la distracción. En el hipotético caso de que solo un guardia se encuentre en la sala central, podría apagar la alarma en pocos segundos y el plan se iría al traste.

El sistema de la cárcel marca cada garita con un 1 si hay alguien dentro y con un 0 si está vacía. Por lo tanto, debemos crear un programa en el que se establezca una matriz 2D que represente las 6 garitas de la cárcel. Después, creamos una variable booleana que sea true si todas las garitas están ocupadas. Si al menos una se encuentra libre, será false.

 

Solución:

 

public class Carcel {

    public static void main(String[] args) {

        // Crear una matriz 2D de 6 filas y 1 columna para representar las 6 garitas
        int[][] garitas = {
            {1}, // Garita 1
            {1}, // Garita 2
            {1}, // Garita 3
            {1}, // Garita 4
            {1}, // Garita 5
            {1}  // Garita 6
        };

        // Variable booleana que indica si todas las garitas están ocupadas
        boolean todasOcupadas = true;

        // Comprobar el estado de las garitas
        for (int i = 0; i < garitas.length; i++) {
            if (garitas[i][0] == 0) {
                todasOcupadas = false;
                break;
            }
        }

        // Imprimir el resultado
        if (todasOcupadas) {
            System.out.println("Todas las garitas están ocupadas.");
        } else {
            System.out.println("Hay garitas libres.");
        }
    }
}

 

 

 

Programa 4

 

Además de los 60 segundos de distracción sonora, necesitaremos que después se apaguen las luces del complejo. Así que el plan es que, una vez que los guardias desactiven la alarma, haya un apagón instantáneamente. Nuestro trabajo es crear un sencillo programa que cambie el estado de una variable booleana llamada apagarLuz de false a true.

 

Solución:

 

public class CambioEstado {
    public static void main(String[] args) {

        boolean apagarLuz = false; // Estado inicial de la variable apagarLuz
        System.out.println("Estado inicial de apagarLuz: " + apagarLuz);

        // Cambiar el estado de apagarLuz de false a true
        apagarLuz = true;
        System.out.println("Nuevo estado de apagarLuz: " + apagarLuz);
    }
}

 

Programa 5

 

Esos son todos los programas que Pedro va a necesitar para ofrecer una buena distracción a Bud. Pero él también necesita cubrirse las espaldas. La alarma no puede sonar mientras él esté sentado frente a un ordenador. Sería muy obvio que él es el responsable. Debemos crear un programa muy simple en el que se introduzca por teclado el número de segundos necesarios para que empiece a sonar la alarma. Así, Pedro podrá salir de la biblioteca sin que nadie sospeche que ha sido él. Dependiendo de la situación, él mismo decidirá cuántos segundos necesita.

La única condición es que el número introducido sea mayor de 600. Eso equivale a 10 minutos, con lo cual Pedro tendrá el tiempo suficiente para llegar a su celda y que nadie sospeche.

 

Solución:

 

import java.util.Scanner;

public class Carcel {
    public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);

        // Pedir al usuario que introduzca un número

        System.out.print("Introduce un número mayor de 600: ");
        int numero = scanner.nextInt();

        // Verificar si el número es mayor de 600

        if (numero > 600) {

            System.out.println("El número " + numero + " es correcto.");

        } else {

            System.out.println("El número no es correcto. Debe ser mayor de 600.");

        }

        // Cerrar el scanner

        scanner.close();
    }
}