Juego "Toros y vacas". Parte 1

¡Hola! La cuarentena fue fructífera y decidió escribir un juguete para matar el tiempo "Toros y vacas". El juego no es tan difícil, pero sí bastante interesante. Por lo general, el juego usa 4 números que deben adivinarse. La computadora adivina el número, el usuario ingresa sus 4 números, si el dígito en el número del usuario coincide en la posición con la posición en el número oculto, entonces esto es un toro, pero si no está en su lugar, entonces es una vaca. Las reglas más detalladas son fáciles de encontrar en Internet. En esta parte nos ocuparemos del BackEnd, en el futuro agregaremos FrontEnd, adivinando el número de usuario, y quizás eso sea todo. Bueno, ¡comencemos!



En primer lugar, creé una clase BackEnd que será responsable de todo el trabajo del programa. Tiene campos:



    private int length;             // 
    private int[] mas;              //  
    private int[] inputArray;       //,  


La idea es la siguiente: la computadora genera un número mas de longitud de longitud, el usuario ingresa el número inputArray y ve cuántos toros y vacas contiene, y luego gana o continúa jugando. Primero, sacaremos la matriz mas para ver el número y depurar el código. luego eliminaremos esta línea. Escribamos la salida de una matriz de longitud arbitraria:



    private void printMas(int[] mas) {
        for (int i = 0; i < length; i++) {
            System.out.print(mas[i] + "   ");
        }
    } 


Pasamos una matriz a este método, que generaremos a través del ciclo for. Podría haberse hecho a través del campo, pero como primero mostraremos mas y luego inputArray, decidí hacer esto.



Ahora necesitamos crear una generación de números. puede hacer esto con funciones estándar, pero no olvide que necesitamos diferentes dígitos en el número. Esto significa que el número 45566 no funcionará, pero el 45367 será el correcto. Escribamos un método para generar tal número con la verificación de los dígitos, pero primero, averigüemos cuánto tiempo quiere el usuario adivinar el número:



private void getMas() {
        Scanner scanner = new Scanner(System.in);
        do {
            System.out.println("    1  10");
            while (!scanner.hasNextInt()) {
                System.out.println(" ");
                scanner.next();
            }
            length = scanner.nextInt();
        } while (length <= 0 || length > 10);
        setMas(createMas());
    }


Creamos un objeto escáner con el que obtendremos el número de la consola. A continuación, usamos un bucle con una condición posterior do while. Explicaré por qué esto es un poco más tarde. En el cuerpo del bucle, vemos un bucle while. se usa para verificar que se ingrese un número en la consola, no una fracción, letras, etc. Después de haber verificado que el número está ingresado en la consola, escribimos su valor en longitud. Y ahora, usando la condición posterior do while, comprobamos que pertenece al intervalo [0,10). Si se ingresa un número que no está incluido en el intervalo, nuevamente le pedimos que ingrese la longitud. Si el número se ingresa correctamente a la vez, generamos el número usando el método createMas y cambiamos el valor del campo mas:



 public void setMas(int[] mas) {
        this.mas = mas;
    }


private int[] createMas() {
        int[] arr = new int[length];
        for (int i = 0; i < this.length; i++) {
            arr[i] = (int) (Math.random() * 10);
        }
        boolean checkMas = false;
        while (!checkMas) {
            for (int i = 0; i < arr.length; i++) {
                for (int j = 0; j < arr.length; j++) {
                    if (i != j) {
                        if (arr[i] == arr[j]) {
                            arr[j] = (int) (Math.random() * 10);
                        }
                    }

                }
            }


            boolean check = false;
            for (int i = 0; i < arr.length && !check; i++) {
                for (int j = 0; j < arr.length && !check; j++) {

                    if (i != j) {
                        if (arr[i] == arr[j]) {
                            check = true;
                            checkMas = false;
                        } else checkMas = true;
                    }
                }
            }

        }
        return arr;
    }


Déjame explicarte cómo funciona createMas. Primero, creamos una matriz de longitud y la llenamos con números aleatorios del intervalo [0,10). Math.random () genera un número aleatorio del intervalo [0,1), y multiplicándolo por 10 obtenemos un número en el intervalo [0,10). Ahora tenemos una matriz arr, que consta de dígitos aleatorios. El siguiente paso es verificar si hay números repetidos. Decidí hacer esto usando variables booleanas. Primero, comparamos cada elemento con cada uno y, si hay una coincidencia, cambiamos el elemento con el que estamos comparando por un número aleatorio. Después de haber comparado todos los elementos, verificamos la unicidad de los dígitos de la matriz. para esto, también creé la variable de verificación. Luego, simplemente comparamos cada elemento con cada uno. Si encontramos 2 elementos idénticos, salga del para comparar (ya que! Check devolverá falso y los bucles terminarán),y vuelva a los bucles for para cambiar los mismos números. Una vez que todos los números de la matriz son diferentes, la variable checkMas se convierte en verdadera y finaliza la verificación de la matriz. Ahora devolvemos el arreglo arr y hacemos el campo mas = arr.



Ahora tenemos un número concebido por computadora. Implementemos la adivinación de este número por parte del usuario. Para hacer esto, escribamos el método checkInput:



private void checkInput() {
        Scanner scanner = new Scanner(System.in);
        int[] arr = new int[length];
        if (length == 1) System.out.println(" " + length + "   ");
        else {
            if (length > 1 && length < 5) {
                System.out.println(" " + length + "   ");
            } else {
                if (length > 4 && length < 11) {
                    System.out.println(" " + length + "   ");
                }
            }
        }
        boolean checkMas = false;
        while (!checkMas) {
            for (int i = 0; i < length; i++) {
                do {
                    System.out.println("  ");
                    while (!scanner.hasNextInt()) {
                        System.out.println(" ");
                        scanner.next();
                    }
                    arr[i] = scanner.nextInt();
                    if(arr[i] < 0 || arr[i]>=10) System.out.println("   0  9 ");
                } while (arr[i] < 0 || arr[i] >= 10);
            }
            
            boolean check = checkInputArray(arr);
            if (check) {
                checkMas = true;
            } else {
                System.out.println("    ");
                System.out.println("  ");
            }
        }
        setInputArray(arr);

    }


De manera similar, creamos un escáner y una matriz auxiliar arr de longitud longitud. Luego viene un montón de si, que no son más responsables de hacer coincidir un número y una frase. Después de ellos hay una entrada directa y verificación del número de usuario. Para que no haya desacuerdo en la lógica con el usuario, decidí hacerlo de manera que el usuario ingresara cada número por separado.



for (int i = 0; i < length; i++) {
                do {
                    System.out.println("  ");
                    while (!scanner.hasNextInt()) {
                        System.out.println(" ");
                        scanner.next();
                    }
                    arr[i] = scanner.nextInt();
                    if(arr[i] < 0 || arr[i]>=10) System.out.println("   0  9 ");
                } while (arr[i] < 0 || arr[i] >= 10);
            }


Es en esta sección del código donde se ingresa y se verifica el número. El trabajo es similar a ingresar la longitud de la matriz, por lo que no veo ninguna razón para explicarlo. Luego, se verifica la matriz de usuarios para detectar la presencia de los mismos números. Para hacer esto, escribamos el método checkInputArray:



private boolean checkInputArray(int[] arr) {
        boolean checkMas = false;
        boolean check = false;
        for (int i = 0; i < arr.length && !check; i++) {
            for (int j = 0; j < arr.length && !check; j++) {

                if (i != j) {
                    if (arr[i] == arr[j]) {
                        check = true;
                        checkMas = false;
                    } else checkMas = true;
                }
            }
        }
        return checkMas;
    }


Verificar es similar a verificar una matriz oculta, por lo que no me detendré en eso. Si el número de usuario contiene números duplicados, le pedimos que vuelva a ingresar el número completo. Y así sucesivamente hasta que se ingrese correctamente. Luego cambiamos el valor del campo inputArray a nuestro arreglo auxiliar arr. Por si acaso, daré el código:



public void setInputArray(int[] inputArray) {
        this.inputArray = inputArray;
    }


En este punto, tenemos dos matrices: la matriz oculta y la matriz de entrada. Es hora de averiguar cuántos toros y vacas encontró el usuario.



Descubriremos esto usando el método checkCowAndBull:



private int[] checkCowAndBull() {
        int[] arr = new int[2];
        int cow = 0;
        int bull = 0;
        for (int i = 0; i < length; i++) {
            for (int j = 0; j < length; j++) {

                if (mas[i] == inputArray[j]) {
                    if (i == j) bull++;
                    else cow++;
                }
            }
        }
        arr[0] = cow;
        arr[1] = bull;
        return arr;
    }


Creamos una matriz auxiliar de 2 elementos. El primero es el número de vacas, el segundo es el número de toros. Luego iteramos sobre ambas matrices, comparando los elementos. Si los elementos son iguales y sus índices son iguales, entonces aumentamos el número de toros, de lo contrario aumentamos el número de vacas. Después de eso, escribimos los valores en la matriz y la devolvemos.



Es hora de averiguar qué había en el constructor de la clase BackEnd todo este tiempo.



public BackEnd() {
        getMas();
        //printMas(mas);
        boolean win = false;
        while (!win) {
            checkInput();
            System.out.println(" :");
            printMas(inputArray);
            System.out.println();
            int[] arr = checkCowAndBull();
            if (arr[1] == length) {
                win = true;
                System.out.println("!  !");
            } else {
                System.out.println("   " + arr[0] + " , " + arr[1] + " ");
                System.out.println("  ");
            }
        }
    }


Primero, generamos la matriz deseada. Lo envío para depurarlo, pero esta función no es necesaria para el juego. Como no sabemos desde qué intento adivinará el usuario el número, iniciamos el ciclo while hasta el momento apropiado. Luego le pedimos al usuario que ingrese su número, muestre la matriz ingresada, verifique el número de toros y vacas. Si el número de toros coincide con la longitud de la matriz, se adivina el número y el juego termina. De lo contrario, se muestra el número de toros y vacas y el juego continúa.



Solo queda agregar la creación de una instancia de la clase a man:



public class main {
    public static void main(String[] args) {
        BackEnd bk = new BackEnd();
    }
}


Lanzamos, comprobamos, jugamos.



Gracias por su atención, la segunda parte llegará pronto.



All Articles