JavaRush /Курсы /Java Multithreading /Большая задача: Пишем игру на Java

Большая задача: Пишем игру на Java

Java Multithreading
1 уровень , 16 лекция
Открыта
Большая задача: Пишем игру на Java - 1

— Привет, Амиго!

— Здравия желаю, Капитан Бобров!

— Теперь будем учиться писать большие проекты. В связи с этим, появился новый тип заданий – «большая задача». Это одна большая задача, разбитая на много маленьких. Решая очередную «маленькую задачу» ты будешь дописывать новый код к нынешнему коду, а не писать что-то с нуля. Будущее федерации в твоих руках.

— Есть, сэр!

— Цель первых пяти «больших задач» научиться писать большие и сложные проекты. Сначала описание «маленьких задач» довольно детальное, иногда даже чересчур. Затем оно будет становиться все более общим, а размер задач расти. Сначала будут небольшие кусочки «моего» кода. Потом большие. И наконец – целые фреймворки (библиотеки).

— Я готов, сэр!

— Я постарался сделать описание задач максимально однозначным. Но если что-то не получается:

а) подумай, как еще можно понять условие. Возможно, не все так однозначно, как хотелось бы.

б) попробуй решить несколькими разными способами.

в) попроси помощи/напиши нам — это же новые задачи и мы с радостью их «отполируем».

Вот тебе первое задание:

Сегодня мы напишем небольшую игру под названием «Ипподром».

Когда я говорю мы – я имею в виду тебя. Я же буду работать наставником.

— А где же условие?

— Какое условие, рядовой? Ты что, до сих пор в учебке? Это же секретная военная программа. Запускай Intellij IDEA – там будет первая часть этого задания. Каждое следующее задание будет доступно только после того, как ты успешно выполнишь предыдущее.Приступай немедленно.

— Есть, приступать немедленно!

— И помни, если ты запутался в своих решениях, у тебя есть возможность начать решать большие задачи заново. Нажми правой кнопкой мыши на большой задаче в списке задач плагина, и ты увидишь контекстное меню с разными опциями.

6
Задача
Java Multithreading, 1 уровень, 16 лекция
Недоступна
Ипподром(1)
Сегодня мы напишем небольшую игру под названием "Ипподром". Когда я говорю мы - я имею ввиду тебя. Я же буду работать наставником. Для начала нам понадобятся классы "ипподром" и "лошадь". Создай классы Hippodrome (ипподром), Horse (лошадь).
6
Задача
Java Multithreading, 1 уровень, 16 лекция
Недоступна
Ипподром(2)
Раз это ипподром, то на нем должны быть лошади. Значит наш ипподром должен хранить список всех его лошадей. Добавь поле horses типа List<Horse> в класс Hippodrome. А чтобы лошадей не украли - сделай это поле приватным. Добавь getter для этого поля.
6
Задача
Java Multithreading, 1 уровень, 16 лекция
Недоступна
Ипподром(3)
Несмотря на то что мы объявили переменную horses, сам список еще не создан (если ты конечно не успел опередить нас). Создай конструктор класса Hippodrome с одним параметром типа List. Сохрани в поле horses полученный в качестве параметра список (инициализируй поле horses).
6
Задача
Java Multithreading, 1 уровень, 16 лекция
Недоступна
Ипподром(4)
Теперь вернемся к лошадям. У каждой лошади на скачках должны быть известны имя (name) и скорость (speed). Наши лошади будут бежать просто определенное время (100 секунд/"шагов"). Будем определять победителя, как лошадь, пробежавшую наибольшую дистанцию.
6
Задача
Java Multithreading, 1 уровень, 16 лекция
Недоступна
Ипподром(5)
Закончим написание класса лошадь (Horse). Добавь конструктор с параметрами (name, speed, distance). Добавь getter'ы и setter'ы для всех полей класса Horse. Делай все методы public, если явно не указано обратное.
12
Задача
Java Multithreading, 1 уровень, 16 лекция
Недоступна
Ипподром(6)
Теперь перейдем к классу Hippodrome и методу main. Нам нужно создать объект типа Hippodrome и добавить ему несколько лошадей. Для начала, в классе Hippodrome создай статическое поле game типа Hippodrome. В методе main требуется:
6
Задача
Java Multithreading, 1 уровень, 16 лекция
Недоступна
Ипподром(7)
Но и это еще не все - надо чтобы лошади бежали. Добавь в класс Hippodrome void методы run, move и print. Без параметров. Метод move будет управлять движением всех лошадей. Метод print отрисовывать их на экран. А метод run - управлять всем этим.
6
Задача
Java Multithreading, 1 уровень, 16 лекция
Недоступна
Ипподром(8)
В методе run сделай цикл от 1 до 100. Это и будет наш забег. В теле цикла вызываем сначала move, затем print. Чтобы весь цикл не отработал за долю секунды - добавь в него еще Thread.sleep(200);
6
Задача
Java Multithreading, 1 уровень, 16 лекция
Недоступна
Ипподром(9)
Теперь вернемся к методам move и print. Начнем с move. В методе move класса Hippodrome в цикле у каждой лошади мы вызываем метод move. Да ты прав, его еще нет у класса Horse. Поэтому в класс Horse надо добавить свой метод move :) И метод print, кстати тоже.
6
Задача
Java Multithreading, 1 уровень, 16 лекция
Недоступна
Ипподром(10)
Еще нужно написать метод print класса Hippodrome. В нем тоже все просто: в цикле для каждой лошади вызываем ее метод print. Ну, и еще выведи после цикла 10 пустых строк: System.out.println() - чтобы было красивее.
6
Задача
Java Multithreading, 1 уровень, 16 лекция
Недоступна
Ипподром(11)
С классом Hippodrome почти закончили. Добавь в конец метода main вызов run(). Подсказка: run() - это нестатический метод, поэтому вызвать его можно только у объекта. А где взять объект? Подсказка 2: game.run();
6
Задача
Java Multithreading, 1 уровень, 16 лекция
Недоступна
Ипподром(12)
Осталось совсем немного - дописать класс Horse. Каждый ход у лошади будет вызываться метод move. Когда у лошади вызывают метод move, лошадь должна пробежать некоторую дистанцию. Дистанция зависит от скорости лошади (speed).
6
Задача
Java Multithreading, 1 уровень, 16 лекция
Недоступна
Ипподром(13)
Теперь вернемся к методу print класса Horse. Т.к. мы работаем с консолью, то все лошади на бегах будут выглядеть примерно так: ........Slevin <- лошадь Слевин, ....Lucky <- лошадь Лаки, ..........Homer <- лошадь Гомер.
6
Задача
Java Multithreading, 1 уровень, 16 лекция
Недоступна
Ипподром(14)
Запускаем и любуемся. У нас каждые полсекунды отображается новый кадр с ситуацией на ипподроме. Мышкой уменьши размер консоли так, чтобы был виден только один "кадр" и на том же самом месте. Тогда можно наблюдать забег в живую и даже покомментировать: - Старт. - Гомер неожиданно обходит Лаки.
6
Задача
Java Multithreading, 1 уровень, 16 лекция
Недоступна
Ипподром(15)
Добавим определение победителя. В классе Hippodrome сделаем два метода: public Horse getWinner() и public void printWinner() Метод getWinner должен возвращать лошадь пробежавшую самую большую дистанцию. Метод printWinner выводит на экран имя победителя в виде: Winner is <name>!
6
Задача
Java Multithreading, 1 уровень, 16 лекция
Недоступна
Ипподром(16)
Теперь уже точно все. Добавь вызов метода printWinner в конец метода main. Запускай и любуйся своей первой компьютерной игрой :)
Комментарии (398)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Anonymous #3585174 Уровень 33
30 сентября 2025
Like
Victor Уровень 36
21 августа 2025
Вначале, из-за ошибки в программе, всё время выигрывала Бомба. Но потом всё наладилось.
Victor Уровень 36
21 августа 2025
Кстати моих лошадей звали: "Белка" - переменная whiteHorse, "Пуля" - переменная fastHorse и "Бомба" - переменная fatHorse. А ваших?
Victor Уровень 36
21 августа 2025
Оказывается я умею писать такие крутые компьютерные игры!
I'll kick them all Уровень 5
17 августа 2025
Don't push the horses!
Jahan Уровень 44
14 февраля 2025
Вот теперь начал понимать что куда вставлять
Евгений Уровень 36
13 февраля 2025
Шикарно!!!!! Побольше бы таких задач! Отлично систематизируют знания!!!!! Браво!
Mikhail Tabakaev Уровень 31
26 декабря 2024
йа - пажилой борроу, йа - пажилой павук))) решил убрать весь лишний консольный вывод (очищать после предыдущей итерации консоль), потому что вывод очень большой. вызов принят и это оказалось не так-то просто) по окончании в консоли должны быть итоговые расстояния и вывод на печать победителя...
Иван Глазунов Уровень 28
23 ноября 2024
Конечно же делать простым и понятным способом: for (double i = 0 ; i <= Math.floor(distance) ; i++ ) { System.out.print("."); } System.out.println(name); нельзя!!! Только хардкор, только StringBuilder StringBuilder track = new StringBuilder(); for (int i = 0; i < (int) distance; i++) { track.append("."); } System.out.println(track + name);
30 ноября 2024
На самом деле ты каждый раз выводишь точки на экран не зависимо от того сколько их, а в решении от javarush они собирают строку и только потом выводят ее🙂
Alec Sacreson Уровень 51
6 декабря 2024

System.out.println(".".repeat((int)distance) + name);
Никита Уровень 37
2 октября 2025
на сервере JR метод repeat() не доступен, старая версия java как минимум, у меня код не компилировался на при проверке, а без него всё прошло ок
No Name Уровень 36
21 ноября 2024
+ уровень в копилке