[Java, Разработка игр] Игра «Быки и коровы». Часть 1
Автор
Сообщение
news_bot ®
Стаж: 6 лет 9 месяцев
Сообщений: 27286
Всем привет! Карантин прошел плодотворно и решил написать игрушку тайм-киллер «Быки и коровы». Игра не такая сложная, но довольно таки интересная. Обычно в игре используется 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();
}
}
Запускаем, проверяем, играем.
Спасибо за внимание, скоро будет вторая часть.
===========
Источник:
habr.com
===========
Похожие новости:
- [API, Java, Node.JS] Работаем с NPM реестром из Java (перевод)
- [Монетизация игр, Монетизация мобильных приложений, Продвижение игр, Разработка игр] Как конвертировать праздники в прибыль для разработчика и радость для игроков
- [Разработка игр, Компьютерная анимация, Физика] Стартовал открытый бета-тест Cascadeur
- [Java] Сбор метрик SpringBoot-приложения в AWS CloudWatch
- [JavaScript, Инженерные системы, Транспорт] АСУДД. Разработка всей системы и интерфейса к ней
- [JavaScript, Разработка веб-сайтов] WebStorm 2020.2: возможность использовать Prettier по умолчанию, поддержка Nuxt.js и другие улучшения
- [Unity, Работа с 3D-графикой, Работа с видео, Разработка игр] Создание панорамных видео в Unity (перевод)
- [Java] Lambda-выражения в Java
- [JavaScript, Node.JS, ReactJS, TypeScript] Urban Bot или как писать чат-ботов для Telegram, Slack, Facebook… на React.js
- [JavaScript, TypeScript, Анализ и проектирование систем, ООП, Проектирование и рефакторинг] Нерушимые законы крутого кода: Law of Demeter (с примерами на TypeScript)
Теги для поиска: #_java, #_razrabotka_igr (Разработка игр), #_byki_i_korovy (быки и коровы), #_igry (игры), #_java, #_java, #_razrabotka_igr (
Разработка игр
)
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 23-Ноя 00:07
Часовой пояс: UTC + 5
Автор | Сообщение |
---|---|
news_bot ®
Стаж: 6 лет 9 месяцев |
|
Всем привет! Карантин прошел плодотворно и решил написать игрушку тайм-киллер «Быки и коровы». Игра не такая сложная, но довольно таки интересная. Обычно в игре используется 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(); } } Запускаем, проверяем, играем. Спасибо за внимание, скоро будет вторая часть. =========== Источник: habr.com =========== Похожие новости:
Разработка игр ) |
|
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 23-Ноя 00:07
Часовой пояс: UTC + 5