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

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

Java Collections
10 уровень , 15 лекция
Открыта

— Привет, боец!

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

— Поздравляю. Сегодня у нас выходной.

— И мы можем заниматься любыми своими делами?

— Да Амиго, хоть целый день в игрушки шпилить. Например, в Sokoban. Моя самая любимая игра с детства. Вот не могу пройти 435 уровень. Поможешь?

— Конечно помогу, показывайте, товарищ Капитан.

— Капитан Бобров достает из кармана старенький Game boy, запускает Sokoban в монохромном режиме, и тут досада. Батарея разряжена, Game boy выключается.

— Капитан молча смотрит на Game boy, потом на Амиго, потом снова на Game boy, разворачивается и медленно идет в свою комнату.

— Товарищ Капитан, а давайте сами напишем игру Sokoban и придумаем 1000 дополнительных уровней, и крутой графический интерфейс.

— Амиго, ты не перестаешь меня удивлять. Обратись к агенту Intellij IDEA. Если у него нет других заданий, и он захочет тебе помочь в свой выходной, тогда приступайте.

Большая задача: Пишем игру Sokoban - 1
20
Задача
Java Collections, 10 уровень, 15 лекция
Недоступна
Sokoban (1)
Сегодня мы напишем свою реализацию игры Сокобан. Это логическая игра-головоломка, более подробно про нее можешь прочитать в Википедии. Игра будет состоять из 3х основных компонентов (как ты догадался, тут не обошлось без паттерна MVC). Графический интерфейс будет реализован с использованием Swing. 1
10
Задача
Java Collections, 10 уровень, 15 лекция
Недоступна
Sokoban (2)
Основа заложена, теперь перейдем к ее наполнению. Игровой процесс можно представить как взаимодействие игровых объектов GameObject. У нас их будет несколько видов: ящик Box, дом Home (место куда нужно поместить ящик), стена Wall и игрок Player. 2.1. Добавь абстрактный класс GameObject в пакет model.
10
Задача
Java Collections, 10 уровень, 15 лекция
Недоступна
Sokoban (3)
Скоро мы займемся созданием различных игровых объектов. Было бы удобно иметь возможность сразу их где-то нарисовать и посмотреть, как они выглядят. Объекты будут рисоваться на игровом поле Field. Тебе пришел измененный код класса View, который создает объект поля Field и настраивает правильным образ
20
Задача
Java Collections, 10 уровень, 15 лекция
Недоступна
Sokoban (4)
Общий класс игровых объектов GameObject уже есть. Пришло время создать классы конкретных типов игровых объектов. 4.1. Часть игровых объектов могут двигаться (игрок и ящики), а часть нет, например, стены и дома. 4.1.1. Добавь интерфейс Movable в пакет model. 4.1.2. Интерфейс Movable должен иметь мето
20
Задача
Java Collections, 10 уровень, 15 лекция
Недоступна
Sokoban (5)
Игровые объекты “Ящик” и “Игрок” с одной стороны являются объектами, которые могут сталкиваться, а с другой они могут перемещаться по полю. 5.1. Создай класс игрока Player и класс ящика Box в пакете model. Каждый из них унаследуй от максимально подходящего класса. 5.2. Созданные классы должны поддер
10
Задача
Java Collections, 10 уровень, 15 лекция
Недоступна
Sokoban (6)
Пришло время создать класс Home. Этот класс будет отвечать за места на игровом поле (дома) в которые нужно сдвинуть все ящики. Объекты этого типа не должны передвигаться по полю или сталкиваться с другими игровыми объектами. 6.1. Добавь в пакет model класс Home. 6.2. Класс должен быть унаследован от
10
Задача
Java Collections, 10 уровень, 15 лекция
Недоступна
Sokoban (7)
Давай сделаем класс стены Wall. Стена может сталкиваться с другими объектами, но не может двигаться. 7.1. Добавь класс Wall в пакет model. 7.2. Унаследуй класс от подходящего родителя. 7.3. Реализуй конструктор с параметрами int x и int y. 7.4. Реализуй метод отрисовки.
10
Задача
Java Collections, 10 уровень, 15 лекция
Недоступна
Sokoban (8)
Ты создал полную коллекцию типов игровых объектов. Давай создадим класс, который будет хранить эти объекты. 8.1. Создай класс GameObjects в пакте model. 8.2. Добавь в него: 8.2.1. Поля Set<Wall> walls, Set<Box> boxes, Set<Home> homes и Player player. 8.2.2. Геттеры для этих полей. 8.2.3. Конструктор
10
Задача
Java Collections, 10 уровень, 15 лекция
Недоступна
Sokoban (9)
В процессе работы игры, будут возникать различные события. Давай создадим интерфейс слушателя событий EventListener. Его должен реализовывать каждый класс, который хочет обрабатывать события. А классы, которые будут генерировать события, будут вызывать методы этого интерфейса. 9.1. Добавь интерфейс
20
Задача
Java Collections, 10 уровень, 15 лекция
Недоступна
Sokoban (10)
В игре будет несколько уровней, все уровни будут храниться в текстовом файле. Сейчас мы напишем тестовую реализацию загрузчика уровней LevelLoader. Почему тестовую? Полный функционал нам пока не нужен, он довольно сложный, оставим его на потом. А пока: 10.1. Создай класс LevelLoader в пакете model.
20
Задача
Java Collections, 10 уровень, 15 лекция
Недоступна
Sokoban (11)
Начнем наполнять функционалом класс модели Model. Добавь в него: 11.1. Поле GameObjects gameObjects. Оно будет хранить наши игровые объекты. 11.2. Поле отвечающее за текущий уровень int currentLevel. Проинициализируй его значением 1. 11.3. Поле отвечающие за загрузчик уровней LevelLoader levelLoader
20
Задача
Java Collections, 10 уровень, 15 лекция
Недоступна
Sokoban (12)
Попробуем организовать взаимодействие представления и модели. 12.1. Добавь в класс View метод update(), он должен вызывать у игрового поля field метод repaint(). Другими словами, метод update() будет обновлять представление (перерисовывать поле). 12.2. Добавь в класс контроллера метод GameObjects ge
20
Задача
Java Collections, 10 уровень, 15 лекция
Недоступна
Sokoban (13)
Наполним контроллер функционалом. 13.1. Добавь в конструктор класса Controller к тому, что уже есть еще и установку слушателя событий у модели и представления. Слушателем должен быть сам контроллер. 13.2. Реализуй методы контроллера: 13.2.1. move(Direction direction) – должен вызывать move(Direction
20
Задача
Java Collections, 10 уровень, 15 лекция
Недоступна
Sokoban (14)
Добавим немного интерактивности в нашу игру (перемещение игрока с помощью клавиатуры). Начнем с обработки нажатия клавиш клавиатуры. 14.1. Добавь в класс Field вложенный класс KeyHandler унаследованный от KeyAdapter. 14.2. Перегрузи у него метод keyPressed(). Если была нажата клавиша с кодом VK_LEFT
40
Задача
Java Collections, 10 уровень, 15 лекция
Недоступна
Sokoban (15)
Пришло время реализовать метод модели, отвечающий за движение move(), но для начала реализуем вспомогательные методы. Добавь в класс модели методы: 15.1. boolean checkWallCollision(CollisionObject gameObject, Direction direction). Этот метод проверяет столкновение со стеной. Он должен вернуть true,
20
Задача
Java Collections, 10 уровень, 15 лекция
Недоступна
Sokoban (16)
Осталось дописать реализацию загрузчика уровней. 16.1. Открой файл levels.txt и внимательно изучи структуру файла. Символ ‘X’ – означает стену, ‘*’ - ящик, ‘.’ – дом, ‘&’ – ящик который стоит в доме, а ‘@’ - игрока. Всего в файле 60 уровней. 16.2. Реализуй метод GameObjects getLevel(int level). Он д
10
Задача
Java Collections, 10 уровень, 15 лекция
Недоступна
Sokoban (17)
Ты супергерой! Ты сделал отличную игру, можешь немного отдохнуть и поиграть в нее. Если она тебе когда-либо надоест, что практически невозможно, можешь заняться ее улучшениями: 17.1. Использовать картинки для отображения объектов. 17.2. Сделать редактор уровней. 17.3. Добавить рейтинги, можешь даже
Комментарии (86)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
18 апреля 2025
я наверное самый молодой ученик javarush который дошел сюда. мне сейчас 12.
Ioanna Polyak Уровень 31
21 июля 2025
Нет, мне 10
И. Ж. Уровень 41
16 апреля 2024
С 16 й задачей пришлось повозиться куда больше, чем с 15 й, эта куда более на HARD походит нежели та, несколько часов ушло чтоб всю логику обуздать с парсингом файла. В целом проект задача шик!
StrangeAngel Уровень 46
3 июня 2023
Игрушка класс!!!!
kalkulator¹ Уровень 51
22 марта 2023
йшла 9 година і нарешті майже закінчив
JavaCoder Уровень 51
7 ноября 2022
Отличная задача. Радует, что практически весь код написан самим, а не как в некоторых больших задачах часть кода дается уже готовым, а то и перетирает уже существующий.
Svetlana Vydrina Уровень 41
15 июля 2022
Файл читала с помощью Files.readAllLines() Удобнее ведь, чем BufferedReader
Уровень 51
22 декабря 2021
Ну вот поздравляю , ты прошел курс , решай эту задачку и иди во взрослую жизнь 😄
Igor Petrashevsky Уровень 47
30 августа 2022
эту задачу решили в технике молодежи в 80х в паре страниц текста
Уровень 51
31 августа 2022
и что?
Ars Уровень 41
6 декабря 2021
Инфа по последней задаче: Среднее количество попыток для этой задачи 1.01. Всего эту задачу решили 1501 учеников. Валидатор хочет, чтобы логика загрузки 1 уровня для 61 была в LoadLevel,getLevel() Если обнулять уровень в Model, то не пропустит.
Уровень 51
22 декабря 2021
Среднее количество попыток для этой задачи 1.01. Всего эту задачу решили 1523 учеников.
aDuVaN4Ik Уровень 42
31 декабря 2022
Получается есть 1% гениев которые прошли это задание со 2 попытки?!
Konstantin Уровень 51
22 ноября 2021
Это я на последней задаче. Сейчас я дома уже.
Flexo Уровень 41
26 июня 2021
Неплохая задача, хотя бы уже тем, что код не подменяется/дописывается сервером. Немного допилю проект и сделаю сборку, чтобы играть на постоянке) Нужен хотя бы произвольный выбор уровня
Макс Дудин Уровень 41
22 марта 2023
и возможность сохранения, а для этого нужно авторизация разными игроками