undefined

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

Java Multithreading
3 уровень , 13 лекция
Доступна

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

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

— Сегодня у тебя новое, более сложное задание.

Мы напишем игру Арканоид.

Вот как, примерно, это выглядит — https://youtu.be/Th-Z6QQ5AOQ

— И что, будет такая же графика?

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

— Конечно, нет, мы же не гражданские.

— А что, такая?

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

— Все будет консольно-спартанское, как и должно быть у военных.

Приступай.

— Есть, приступить к выполнению задачи.

undefined
7
Задача
Java Multithreading, 3 уровень, 13 лекция
Недоступна
Арканоид(1)
Давай сегодня напишем игру Арканоид. В оригинале это выглядит примерно так https://www.youtube.com/watch?v=Th-Z6QQ5AOQ Для начала мы напишем упрощенную версию этой игры. У нас будут кубики, шарик и летающая "подставка", которая не дает шарику упасть. Поэтому нам понадобятся классы: а) Arkanoid - кл
undefined
7
Задача
Java Multithreading, 3 уровень, 13 лекция
Недоступна
Арканоид(2)
Главному классу (Arkanoid) нужно будет хранить информацию о размерах поля, где будут происходить все действия. Поэтому: а) добавь в класс Arkanoid два приватных поля width(ширина) и height(высота) типа int б) создай для них публичные геттеры и сеттеры
undefined
7
Задача
Java Multithreading, 3 уровень, 13 лекция
Недоступна
Арканоид(3)
Пожалуй, пора добавить конструктор в класс Arkanoid. Конструктор должен принимать два параметра типа int (width и height) и корректно устанавливать значения соответствующих полей класса.
undefined
7
Задача
Java Multithreading, 3 уровень, 13 лекция
Недоступна
Арканоид(4)
Также классу Arkanoid нужно будет хранить ссылку на шарик (Ball), "подставку" Stand и список "кирпичей". Нужно в классе Arkanoid: а) создать приватное поле ball типа Ball б) создать приватное поле stand типа Stand в) создать приватное поле bricks типа List<Brick>
undefined
7
Задача
Java Multithreading, 3 уровень, 13 лекция
Недоступна
Арканоид(5)
Чего еще не хватает классу Arkanoid? Во-первых ему нужен метод run(), в котором будет описана основная логика программы. Еще нужен метод move() - который будет двигать на один шаг все объекты требующие движения. Создай методы run() и move(). Еще нам понадобится НЕ приватная статическая переменная g
undefined
7
Задача
Java Multithreading, 3 уровень, 13 лекция
Недоступна
Арканоид(6)
У нас будут "кирпичи", "шарик" и "подставка" и у них будет много общего. Они будут перемещаться по полю и отрисовываться. Значит у них у всех будут координаты и размер. А еще методы move() - для перемещения и draw() для отрисовки. Есть интересное предложение: давай введем один базовый класс для всех
undefined
7
Задача
Java Multithreading, 3 уровень, 13 лекция
Недоступна
Арканоид(7)
Теперь перейдем к классу BaseObject. Я хочу сделать несколько предложений. Во-первых для простоты считать что все объекты у нас будут круглыми. Нет, отрисовывать их мы будем фигурными, как и раньше. А вот при расчетах из взаимодействия исходить из того, что они круглые. Так - гораздо проще. Во-вто
undefined
13
Задача
Java Multithreading, 3 уровень, 13 лекция
Недоступна
Арканоид(8)
Но и это еще не все. Классу BaseObject нужны еще методы. Пока это будут пустые методы draw(Canvas canvas) и move(). Классы-наследники должны будут переопределить их у себя и реализовать необходимую функциональность (пока можешь оставить их пустыми, просто чтобы код компилировался). Объяви эти методы
undefined
7
Задача
Java Multithreading, 3 уровень, 13 лекция
Недоступна
Арканоид(9)
Теперь займемся классом Canvas. Он у нас будет содержать матрицу(двумерный массив), куда мы будем "рисовать". У матрицы есть ширина и высота. А еще будем в ней хранить не числа (int), а символы (char). Надо: а) Добавить в класс два приватных поля width и height. б) Добавить в класс приватное поле m
undefined
26
Задача
Java Multithreading, 3 уровень, 13 лекция
Недоступна
Арканоид(10)
Что мы будем делать с Canvas? Мы будем рисовать на нем (в его матрице). Поэтому нам понадобятся два метода void setPoint(double x, double y, char c) void drawMatrix(double x, double y, int[][] matrix, char c) Первый метод - setPoint будет "ставить точку в координатах x,y цветом c". В методе надо: а
undefined
7
Задача
Java Multithreading, 3 уровень, 13 лекция
Недоступна
Арканоид(11)
Еще Canvas понадобится два метода, напиши их. а) метод clear() Этот метод будет очищать матрицу, чтобы на ней снова можно было рисовать. Можешь просто заново инициализировать matrix пустым массивом правильной размерности. б) метод print() Этот метод рисует матрицу на экран. Тут уже ты должен сам ра
undefined
7
Задача
Java Multithreading, 3 уровень, 13 лекция
Недоступна
Арканоид(12)
Теперь займемся классом Brick. Во-первых, в конструкторе точно зададим "радиус" всех кирпичей. Путь он выглядит так: public Brick(double x, double y) { super(x, y, 3); } Еще убедись, что в классе Brick есть два переопределенных метода: move() и draw(Canvas canvas). Метод move() не делает ничего (не содержит кода), т.к. кирпич никуда не двигается. Кодом метода draw(Canvas canvas) я займусь сам.
undefined
7
Задача
Java Multithreading, 3 уровень, 13 лекция
Недоступна
Арканоид(13)
Класс Ball уже посложнее - шарик же двигается. Нам понадобятся приватные поля: а) speed (скорость шарика) типа double; б) direction (направление движения в градусах: от 0 до 360) типа double; в) dx (расстояние по x, которое проходит шарик за один шаг. вычисляется на основе speed и direction) типа d
undefined
7
Задача
Java Multithreading, 3 уровень, 13 лекция
Недоступна
Арканоид(14)
Чего-то не хватает в классе Ball: Во-первых надо реализовать метод move(), унаследованный от BaseObject: а) x должен увеличиваться на dx каждый ход б) y должен увеличиваться на dy каждый ход если шарик "заморожен", то x и y меняться не должны Во-вторых надо реализовать метод draw(Canvas canvas): н
undefined
7
Задача
Java Multithreading, 3 уровень, 13 лекция
Недоступна
Арканоид(15)
Не поверишь, но и это еще не все. Во-первых нужен метод setDirection, который не только устанавливает значение переменной direction, но и вычисляет новые значения переменных dx и dy. Код должен выглядеть примерно так: this.direction = direction; double angle = Math.toRadians(direction); dx = Math.
undefined
7
Задача
Java Multithreading, 3 уровень, 13 лекция
Недоступна
Арканоид(16)
И наконец "подставка"! Ей понадобятся такие приватные поля: а) speed (скорость шарика) типа double; б) direction (направление движения по оси x: 1 - вправо, -1 - влево, 0 - начальное значение, стоим на месте) типа double. Также создай для них геттеры. А еще с тебя конструктор, примерно вот такой:
undefined
7
Задача
Java Multithreading, 3 уровень, 13 лекция
Недоступна
Арканоид(17)
Еще подставке нужны методы: а) move - см. move в BaseObject Движение доски осуществляется горизонтально, поэтому мы меняем только координату х. Подумай, как координата х зависит от направления (direction) и скорости (speed). Реализуй зависимость. б) draw - см. draw в BaseObject Его кодом я займусь с
undefined
7
Задача
Java Multithreading, 3 уровень, 13 лекция
Недоступна
Арканоид(18)
Теперь вернемся к классу Arkanoid. Реализуй метод move(): В этом методе нужно двигать все движимые объекты (stand, ball). Создай и реализуй метод void draw(Canvas canvas) В этом методе надо вызвать метод draw всех существующих объектов, которые его имеют.
undefined
13
Задача
Java Multithreading, 3 уровень, 13 лекция
Недоступна
Арканоид(19)
Осталось совсем чуть-чуть. В классе Arkanoid создай поле приватное isGameOver типа boolean. Реализуй метод checkBricksBump. В этом методе надо проверить - не столкнулся ли шарик с каким-нибудь из "кирпичей". Для проверки столкновения используй метод intersects. Если шарик все-таки попал в кирпич,
undefined
7
Задача
Java Multithreading, 3 уровень, 13 лекция
Недоступна
Арканоид(20)
Отличная работа! Я добавил пару методов, а также класс KeyboardObserver. Немного отдохни перед новым уровнем и поиграй. P.S. Только не забудь отрегулировать высоту консоли.
Комментарии (218)
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION
Игорь Уровень 34 Братск Россия
26 июля 2021
Вот такую графику можно сделать из этого проекта. смотреть тут
Семен Константинов Уровень 27 Cheboksary
8 июля 2021
решал в два этапа
Максим Дудин Уровень 26 Калининград
8 июня 2021
Ура товарищи... но что-то я утомился даже под конец...
kefx Уровень 29 Санкт-Петербург
3 июня 2021
По моему, в таких задачах с переписыванием пошагово условий очень мало смысла. Необходимо сперва понять структуру программы, конечную задумку, а уже потом приступать к реализации. А мы создаем методы, которые непонятно и неизвестно, что будут делать в будущем. Мы будто строим дом с крыши, а не с фундамента. Можно было бы конечно попробовать предугадать самостоятельно принцип работы, но а что, если требуемый принцип повернет совсем в другую сторону? Я считаю, в первой подзадаче стоит на пальцах в одном абзаце все же описать главные моменты.
Darth Nihilus Уровень 35 Казань
11 мая 2021
10 задача, "Начинает с Х и У...", а принимает только, когда начинаешь циклы с нуля. Так и не понял почему
Elistar Уровень 27 Киев Украина
27 апреля 2021
мда... запорол последнюю задачу, когда в идеи спросили, точно не знаю, типа "импортировать новый(чужой) код?" не разобравшись нажал нет :) в итоге меня закинули на последнюю задачу, валидатор ее принял... без ваших "KeyboardObserver" и не рабочую... только тот который я набирал сам... в итоге все типа написано успешно, но в арканоид так и не поиграл, нужно сбросить и с нуля делать :) так и в змейке было, но там я на 8й задаче был, быстро сбросил и заново пробежал :) а тут... оставлю пометку на будущее, переписать арканоид... :)
Anonymous #2497433 Уровень 35
26 апреля 2021
есть, так точно, есть
Сергей Уровень 25 Киев Украина
25 марта 2021
Немного фпс ей конечно не хватает)
Питруха Уровень 41
15 марта 2021
Девятитысячный
Fyodor Gannutin Уровень 41 Могилев Белоруссия
13 марта 2021
К сожалению, упаковка игры в .jar и запуск в cmd не спасли меня от эпилептического припадка....