Русский
Русский
English
Статистика
Реклама

Быки и коровы

Из песочницы Игра Быки и коровы. Часть 1

29.07.2020 12:21:28 | Автор: admin
Всем привет! Карантин прошел плодотворно и решил написать игрушку тайм-киллер Быки и коровы. Игра не такая сложная, но довольно таки интересная. Обычно в игре используется 4 числа, которые нужно отгадать. Компьютер загадывает число, пользователь вводит свои 4 числа, если цифра в числе пользователя совпадает по позиции с позицией, в загаданном числе, то это бык, ну а если стоит не на своем месте, то это корова. Более подробные правила легко найти в интернете. В этой части разберемся с BackEnd'ом, в дальнейшем добавим FrontEnd, отгадывание числа пользователя и пожалуй все. Что ж, начнем!

Первым делом я создал класс BackEnd, который будет отвечать за всю работу программы. В нем есть поля:

    private int length;             //длина массива    private int[] mas;              //задуманное компьютером число    private int[] inputArray;       //число, введенное пользователем

Задумка в следующем: компьютер генерирует число mas длины length, пользователь вводит число inputArray и видит сколько в нем быков и коров, после чего побеждает или продолжает играть. Для начала мы будем выводить массив mas, что бы видеть число и дебажить код. потом уберем эту строку. Напишем вывод массива произвольной длинны:

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

В данный метод мы передаем массив, который будем выводить и через цикл for. Можно было сделать через поле, но так как мы будем выводить сначала mas, а потом inputArray, то я решил сделать так.

Теперь нам нужно создать генерацию числа. можно сделать это стандартными функциями, но не стоит забывать, что нам нужны разные цифры в числе. Это значит, что число 45566 не подойдет, а 45367 будет в самый раз. Напишем метод генерации такого числа с проверкой цифр, но сначала выясним, какой длинны число хочет отгадать пользователь:

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());    }

Мы создаем объект scanner, с помощью которого будем получать число из консоли. Дальше используем цикл с постусловием do while. Чуть позже объясню, почему так. В теле цикла мы видим цикл while. он используется для проверки того, что в консоль введено число, а не дробь, буквы и тд. После того, как мы убедились, что в консоль введено число, мы записываем его значение в length. И теперь постусловием do while проверяем, что оно принадлежит интервалу [0,10). Если введено число, не входящее в интервал, то мы снова просим ввести длину. Если число сразу введено правильно, то генерируем число методом createMas и меняем значение поля 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;    }

Поясню принцип работы createMas. Сначала мы создаем массив длины length и заполняем его случайными числами из интервала [0,10). Math.random() генерирует случайное число из интервала [0,1), а умножая его на 10 мы получаем число в интервале [0,10). Теперь у нас есть массив arr, который состоит из случайных цифр. Следующим шагом нужно проверить его на повтор цифр. Делать это я решил с помощью булевских переменных. Сначала мы сравниваем каждый элемент с каждым и случае совпадения меняем элемент, с которым сравниваем, на случайное число. После того, как мы сравнили все элементы, мы проверяем массив на уникальность цифр. для этого завел еще переменную check. Дальше мы просто сравниваем каждый элемент с каждым. Если нашли 2 одинаковых элемента, то выходим из for сравнения( так как !check выдаст false и циклы завершатся), и возвращаемся в циклы for для изменения одинаковых чисел. После того, как в массиве все цифры будут разными, переменная checkMas становится true и проверка массива заканчивается. Теперь мы возвращаем массив arr и делаем поле mas = arr.

Сейчас у нас есть задуманное компьютером число. Реализуем отгадывание этого числа пользователем. Для этого напишем метод 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);    }

Аналогично создаем scanner и вспомогательный массив arr длины length. Дальше идет пачка if'ов, которые отвечают не больше, чем за соответствие числа и фразы. После них идет непосредственно ввод и проверка числа пользователя. Дабы не было разногласия в логике с пользователем, я решил сделать так, что бы пользователь вводил каждое число отдельно.

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);            }

Именно в этом участке кода вводится и проверяется число. Работа аналогична вводу длины массива, поэтому объяснять смысла не вижу. Дальше идет проверка массива пользователя на наличие одинаковых чисел. Для этого напишем метод 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;    }

Проверка аналогична проверке загаданного массива, поэтому не буду задерживаться на ней. Если число пользователя содержит повторяющиеся цифры, то мы просим ввести все число заново. И так до тех пор, пока оно не будет введено правильно. После чего меняем значение поля inputArray на наш вспомогательный массив arr. На всякий случай приведу код:

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

На этом моменте у нас есть два массива: массив загаданный и массив введенный. Пришло время узнать сколько же быков и сколько коров нашел пользователь.

Узнавать это мы будем с помощью метода 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;    }

Мы создаем вспомогательный массив на 2 элемента. Первый количество коров, второй количество быков. Дальше перебираем оба массива, сравнивая элементы. Если элементы равны и их индексы равны, то увеличиваем количество быков, иначе увеличиваем количество коров. После этого записываем значения в массив и возвращаем его.

Пришло время разобраться, что же все это время было в конструкторе класса BackEnd.

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("Повторите ввод числа");            }        }    }

Сначала мы генерируем задуманный массив. Для отладки я его выводил, но для игры эта функция не нужна. Так как мы не знаем, с какой попытки пользователь угадает число, то запускаем цикл while до соответствующего момента. Дальше просим пользователя ввести его число, выводим введенный массив, проверяем количество быков и коров. Если количество быков совпадает с длинной массива, то число отгадано и игра завершается. В противном случае выводится число быков и коров и игра продолжается.

Остается лишь добавить в man создание экземпляра класса:

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

Запускаем, проверяем, играем.

Спасибо за внимание, скоро будет вторая часть.
Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru