— Привет, Амиго!
— Здравия желаю, Капитан Бобров!
— Сегодня у тебя новое, более сложное задание.
Мы напишем игру Арканоид.
Вот как, примерно, это выглядит — https://youtu.be/Th-Z6QQ5AOQ
— И что, будет такая же графика?
![Большая задача: Пишем игру Arkanoid - 1](https://cdn.javarush.com/images/article/593a82eb-2edd-4499-ac8a-1ebea615fa70/original.jpeg)
— Конечно, нет, мы же не гражданские.
— А что, такая?
![Большая задача: Пишем игру Arkanoid - 2](https://cdn.javarush.com/images/article/4879a6c9-944f-4adf-b8a7-bc2de2d97e65/original.jpeg)
— Все будет консольно-спартанское, как и должно быть у военных.
Приступай.
— Есть, приступить к выполнению задачи.
7
Задача
Java Multithreading,
3 уровень,
13 лекция
Недоступна
Арканоид(1)
Давай сегодня напишем игру Арканоид.
В оригинале это выглядит примерно так https://www.youtube.com/watch?v=Th-Z6QQ5AOQ
Для начала мы напишем упрощенную версию этой игры.
У нас будут кубики, шарик и летающая "подставка", которая не дает шарику упасть.
Поэтому нам понадобятся классы:
а) Arkanoid - кл
7
Задача
Java Multithreading,
3 уровень,
13 лекция
Недоступна
Арканоид(2)
Главному классу (Arkanoid) нужно будет хранить информацию о размерах поля, где будут происходить все действия.
Поэтому:
а) добавь в класс Arkanoid два приватных поля width(ширина) и height(высота) типа int
б) создай для них публичные геттеры и сеттеры
7
Задача
Java Multithreading,
3 уровень,
13 лекция
Недоступна
Арканоид(3)
Пожалуй, пора добавить конструктор в класс Arkanoid.
Конструктор должен принимать два параметра типа int (width и height) и корректно устанавливать значения соответствующих полей класса.
7
Задача
Java Multithreading,
3 уровень,
13 лекция
Недоступна
Арканоид(4)
Также классу Arkanoid нужно будет хранить ссылку на шарик (Ball), "подставку" Stand и список "кирпичей".
Нужно в классе Arkanoid:
а) создать приватное поле ball типа Ball
б) создать приватное поле stand типа Stand
в) создать приватное поле bricks типа List<Brick>
7
Задача
Java Multithreading,
3 уровень,
13 лекция
Недоступна
Арканоид(5)
Чего еще не хватает классу Arkanoid?
Во-первых ему нужен метод run(), в котором будет описана основная логика программы.
Еще нужен метод move() - который будет двигать на один шаг все объекты требующие движения.
Создай методы run() и move().
Еще нам понадобится НЕ приватная статическая переменная g
7
Задача
Java Multithreading,
3 уровень,
13 лекция
Недоступна
Арканоид(6)
У нас будут "кирпичи", "шарик" и "подставка", и у них будет много общего.
Они будут перемещаться по полю и отрисовываться.
Значит, у них у всех будут координаты и размер.
А еще методы move() - для перемещения и draw() - для отрисовки.
7
Задача
Java Multithreading,
3 уровень,
13 лекция
Недоступна
Арканоид(7)
Теперь перейдем к классу BaseObject.
Я хочу сделать несколько предложений.
Во-первых для простоты считать что все объекты у нас будут круглыми.
Нет, отрисовывать их мы будем фигурными, как и раньше.
А вот при расчетах из взаимодействия исходить из того, что они круглые.
Так - гораздо проще.
Во-вто
13
Задача
Java Multithreading,
3 уровень,
13 лекция
Недоступна
Арканоид(8)
Но и это еще не все.
Классу BaseObject нужны еще методы.
Пока это будут пустые методы draw(Canvas canvas) и move().
Классы-наследники должны будут переопределить их у себя и реализовать необходимую функциональность (пока можешь оставить их пустыми, просто чтобы код компилировался).
Объяви эти методы
7
Задача
Java Multithreading,
3 уровень,
13 лекция
Недоступна
Арканоид(9)
Теперь займемся классом Canvas.
Он у нас будет содержать матрицу(двумерный массив), куда мы будем "рисовать".
У матрицы есть ширина и высота.
А еще будем в ней хранить не числа (int), а символы (char).
Надо:
а) Добавить в класс два приватных поля width и height.
б) Добавить в класс приватное поле m
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".
В методе надо:
а
7
Задача
Java Multithreading,
3 уровень,
13 лекция
Недоступна
Арканоид(11)
Еще Canvas понадобится два метода, напиши их.
а) метод clear()
Этот метод будет очищать матрицу, чтобы на ней снова можно было рисовать.
Можешь просто заново инициализировать matrix пустым массивом правильной размерности.
б) метод print()
Этот метод рисует матрицу на экран.
Тут уже ты должен сам ра
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) я займусь сам.
7
Задача
Java Multithreading,
3 уровень,
13 лекция
Недоступна
Арканоид(13)
Класс Ball уже посложнее - шарик же двигается.
Нам понадобятся приватные поля:
а) speed (скорость шарика) типа double;
б) direction (направление движения в градусах: от 0 до 360) типа double;
в) dx (расстояние по x, которое проходит шарик за один шаг. вычисляется на основе speed и direction) типа d
7
Задача
Java Multithreading,
3 уровень,
13 лекция
Недоступна
Арканоид(14)
Чего-то не хватает в классе Ball:
Во-первых надо реализовать метод move(), унаследованный от BaseObject:
а) x должен увеличиваться на dx каждый ход
б) y должен увеличиваться на dy каждый ход
если шарик "заморожен", то x и y меняться не должны
Во-вторых надо реализовать метод draw(Canvas canvas):
н
7
Задача
Java Multithreading,
3 уровень,
13 лекция
Недоступна
Арканоид(15)
Не поверишь, но и это еще не все.
Во-первых нужен метод setDirection,
который не только устанавливает значение переменной direction,
но и вычисляет новые значения переменных dx и dy.
Код должен выглядеть примерно так:
this.direction = direction;
double angle = Math.toRadians(direction);
dx = Math.
7
Задача
Java Multithreading,
3 уровень,
13 лекция
Недоступна
Арканоид(16)
И наконец "подставка"!
Ей понадобятся такие приватные поля:
а) speed (скорость шарика) типа double;
б) direction (направление движения по оси x: 1 - вправо, -1 - влево, 0 - начальное значение, стоим на месте) типа double.
Также создай для них геттеры.
А еще с тебя конструктор, примерно вот такой:
7
Задача
Java Multithreading,
3 уровень,
13 лекция
Недоступна
Арканоид(17)
Еще подставке нужны методы:
а) move - см. move в BaseObject
Движение доски осуществляется горизонтально, поэтому мы меняем только координату х.
Подумай, как координата х зависит от направления (direction) и скорости (speed). Реализуй зависимость.
б) draw - см. draw в BaseObject
Его кодом я займусь с
7
Задача
Java Multithreading,
3 уровень,
13 лекция
Недоступна
Арканоид(18)
Теперь вернемся к классу Arkanoid.
Реализуй метод move():
В этом методе нужно двигать все движимые объекты (stand, ball).
Создай и реализуй метод void draw(Canvas canvas)
В этом методе надо вызвать метод draw всех существующих объектов, которые его имеют.
13
Задача
Java Multithreading,
3 уровень,
13 лекция
Недоступна
Арканоид(19)
Осталось совсем чуть-чуть.
В классе Arkanoid создай поле приватное isGameOver типа boolean.
Реализуй метод checkBricksBump.
В этом методе надо проверить - не столкнулся ли шарик с каким-нибудь из "кирпичей".
Для проверки столкновения используй метод intersects.
Если шарик все-таки попал в кирпич,
7
Задача
Java Multithreading,
3 уровень,
13 лекция
Недоступна
Арканоид(20)
Отличная работа! Я добавил пару методов, а также класс KeyboardObserver.
Немного отдохни перед новым уровнем и поиграй.
P.S. Только не забудь отрегулировать высоту консоли.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ