Задание 15
Теперь напиши класс Ufo.
Он чуть сложнее класса Bomb и проще SpaceShip.
Тебе понадобятся методы draw(), move(), fire()

Метод  draw() сделай по аналогии с SpaceShip.
И добавь матрицу, по аналогии с SpaceShip.

Метод move() надо сделать так:
а) корабль перемещается по случайной траектории
Подсказка:
          double dx = Math.random() * 2 - 1;  //-1..1
          double dy = Math.random() * 2 - 1;  //-1..1
б) корабль не опускается в нижнюю половину экрана
y <= height/2
в) Один раз за 10 ходов корабль должен стрелять - вызывать метод fire

Метод fire()
Корабль сбрасывает одну бомбу по середине.
Сделать аналогично классу SpaceShip

Также не забудь о конструкторе. Типы параметров double, а радиус ufo будет равен 3.



Задание 14
Теперь перейдем к методам draw, move
В методе move() надо:
а) увеличить x на dx
б) проверить, не вылез ли корабль за границы космоса [0, Space.game.getWidth()]
Учти, что ширина корабля равна двум его радиусам.

Метод draw я напишу сам - просто объяви пустой метод.

Еще нам понадобится метод fire(), ведь корабль умеет стрелять.
Этот метод вызывается, когда надо произвести выстрел.
В этом методе надо
а) создать две ракеты
б) установить им координаты левого края корабля и правого края корабля (пушки корабля находятся по краям)
в) добавить эти ракеты в список ракет объекта game.

Его можно получить так:
Space.game.getRockets()



Задание 13
Теперь займемся кораблем.
Для сложности сделаем так: если пользователь нажал кнопку влево, то корабль начинает все время двигаться влево.
Если нажал кнопку вправо - все время в право до упора.
Поэтому заведем специальную переменную dx, которая будет хранить направление движения корабля.
если dx = 1, корабль каждый ход идет на 1 вправо
если dx = -1, корабль каждый ход идет на 1 влево
Надо:
а) добавь в класс SpaceShip переменную dx (double, по умолчанию равна 0)
б) метод moveLeft(), устанавливает dx равной -1
в) метод moveRight(), устанавливает dx равной 1
г) добавь конструктор, можно такой:
Радиус корабля будет равен 3. Корабль большой - это вам не ракета и не бомба.
public SpaceShip(int x, int y)
{
    super(x, y, 3);
}



Задание 12
Теперь напишем класс Rocket.
Практически совпадает с классом Bomb.
Только
а) Ракета летит вверх (т.е. y уменьшается на 1)
б) Рисуем не букву "B", а букву "R"



Задание 11
Теперь напишем класс Bomb. Тут все просто.
Bomb унаследован от BaseObject.
Надо:
а) написать конструктор
Конструктор Bomb должен выглядеть примерно так:
public Bomb(double x, double y)
{
    super(x, y, 1);
}
x и y переданные в конструктор Bomb мы передаем дальше в конструктор BaseObject с помощью super
Где так же указываем радиус "бомбы" равный 1.

б) написать метод move()
тут все просто - бомба падает вниз  - просто увеличиваем y на 1

в) метод draw(Canvas canvas)
тут тоже не очень сложная логика
Давай просто ставить точку с координатами (x,y) и "цветом" c
canvas.setPoint(x,y,'B');

г) Создай в классе Space нашу игру public static Space game;


Задание 10
Еще Canvas понадобится два метода, напиши их.
а) метод clear()
Этот метод будет очищать матрицу, чтобы на ней снова можно было рисовать.
Например заменить все символы матрицы на пробелы.

б) метод print()
Этот метод отрисовывает матрицу на экран.
Тут уже ты должен сам разобраться: вывести набор символов не так уж и сложно.
Не забудь добавить пару пустых строк в конце, чтобы матрицы выведенные в разное время не слипались.



Задание 9
Что мы будем делать с Canvas?
Мы будем рисовать на нем (в его матрице).
Поэтому нам понадобятся два метода
public void setPoint(double x, double y, char c)
public void drawMatrix(double x, double y, int[][] matrix, char c)

Первый метод - setPoint будет "ставить точку в координатах x,y цветом c".
В методе надо:
а) округлить x и y до целых чисел
б) занести в matrix[y][x] значение с
в) ничего не делать, если x<0 или y<0 или y>matrix.length или x>matrix[0].length

Второй метод - drawMatrix копирует переданную ему картинку (матрицу) в матрицу Canvas.
И не просто копирует, а начиная с координат x, y
В методе надо:
а) с помощью двух вложенных циклов пройтись по всем ячейкам переданной картинки
б) если значение ячейки matrix[i][j] не равно 0, то покрасить в матрице объекта Canvas точку (x+j, y+i) в цвет c:
 setPoint(x+j, y+i, c)



Задание 8
Теперь займемся классом Canvas.
Он у нас будет содержать матрицу, куда мы будем рисовать.
У матрицы есть ширина и высота.
А еще будем в ней хранить не числа(int), а символы (char).
Надо:
а) Добавить в класс две переменные width и height
б) Добавить в класс переменную matrix (char[][])
в) Добавь геттеры для них
г) В конструкторе проинициализируй матрицу



Задание 7
Но и это еще не все.
Классу BaseObject нужны еще методы.
Пока это будут пустые методы draw() и move().
Классы-наследники должны будут переопределить их у себя и реализовать необходимую функциональность.

Еще добавь метод die() - объект умирает (isAlive=false)

А еще нам нужно будет определять попала бомба в корабль или ракета в НЛО.
Это будем делать так:
Создадим специальный метод: public boolean isIntersec(BaseObject o)
Он будет определять - "пересеклись" объекты или нет. Если пересеклись - возвращать true, если нет - false.

Т.к. объекты мы условно считаем кругами, то предлагаю такую формулу взаимодействия
Если центр круга одного объекта попал в круг другого, то будем считать, что они столкнулись.
Или еще проще:
дистанция_между_объектами < max (радиус_первого_объекта, радиус_второго_объекта)



Задание 6
Теперь перейдем к классу BaseObject.
Я хочу сделать несколько предложений.

Во-первых. Для простоты, считать все объекты у нас в космосе круглыми.
Нет, отрисовывать их мы будем фигурными, как и раньше.
А вот при расчетах из взаимодействия исходить из того, что они круглые.
Так - гораздо проще.

Во-вторых. Пусть координаты объектов и радиус будут вещественными числами.
Это придаст плавность движениям и точность всем вычислениям.
А при отрисовке мы будем их округлять

Надо:
а) Добавь в класс BaseObject  переменные x(double), y (double), radius (double), геттеры и сеттеры для них.
б) Добавить логическую переменную isAlive (жив объект или уже нет)
в) Добавить геттеры (isAlive()-метод для isAlive-переменной)
г) Добавить конструктор BaseObject(double x, double y, double radius)
д) Проследить, чтобы в конструкторе isAlive устанавливался в true (мертворожденные нам ни к чему)
е) Надо пройтись по всем классам-наследникам и поправить у них конструкторы
Если вы пользуйтесь Intellij IDEA - Alt+Insert вам в помощь



Задание 5
Чего не хватает классу Space?
Правильно - методов run() и draw().
run управляет всей логикой игры, если ты помнишь.
А draw отвечает за отрисовку очередного "кадра".

А еще нам пригодится метод sleep(int ms)
Создай их.



Задание 4
Для чего нам нужен класс Space?
Чтобы хранить в себе все объекты и управлять их взаимодействием.
А какие параметры должны у него быть?
width (ширина), height (высота).
А еще?
а) ship (космический корабль),
б) список для хранения всех НЛО -  ufos (ArrayList<Ufo>)
в) список для хранения всех ракет -  rockets (ArrayList<Rocket>)
г) список для хранения всех бомб -  bombs (ArrayList<Bomb>)

Задание:
Добавь все эти переменные к классу Space.
Инициализируй коллекции.
И не забудь добавить переменным getter'ы, а для ship еще и setter!

А что должен содержать конструктор?
Достаточно будет width и height



Задание 3
У нас будут бомбы и ракеты.
Значит нам нужны классы Bomb(бомба) и Rocket(ракета).
Создай их.

У наших объектов будет много общего.
Они будут перемещаться по космосу и отрисовываться.
Значит у них у всех будут координаты и размер.
А еще методы move() - для перемещения и draw() для отрисовки.

Есть интересное предложение: давай введем один базовый класс для всех объектов.
Пусть это будет класс BaseObject.
А классы Ufo, SpaceShip, Rocket, Bomb от него наследуются.
Создай класс BaseObject и добавь его родителем к классам Ufo,SpaceShip, Rocket, Bomb

Еще нам понадобится класс Canvas
Он будет ответственным за "отрисовку" объектов.
С его помощью они будут отрисовывать себя.
Вернее даже на нем.
Создай и этот класс.



Задание 2
Так. Чего на не хватает?
Метода main, конечно.
Вот с него и начнем.
Добавь метод main в класс Space



Задание 1
Давай напишем новую компьютерную игрушку.
У нас будет космический корабль, который стреляет ракетами в НЛО.
А НЛО в свою очередь сбрасывает на корабль бомбы.
Ну и, конечно, всё дело происходит в космосе.

Нам понадобятся классы: Space(космос), SpaceShip(космический корабль) и Ufo(НЛО)
Создай классы: Space, SpaceShip, Ufo

 

package com.javarush.test.level25.lesson16.big01;

/**
 * Created by promoscow on 15.02.17.
 */
public class Ufo extends BaseObject {
    public static int counter;
    private static int[][] matrix = {
            {0, 0, 0, 0, 0},
            {0, 0, 1, 0, 0},
            {0, 0, 1, 0, 0},
            {1, 0, 1, 0, 1},
            {1, 1, 1, 1, 1},
    };

    public Ufo(double x, double y) {
        super(x, y, 3);
    }

    @Override
    public void draw(Canvas canvas) {
        canvas.drawMatrix(x - radius + 1, y, matrix, 'M');
    }

    public void move() {
        double dx = Math.random() * 2 - 1;
        double dy = Math.random() * 2 - 1;
        x += dx;
        y += dy;
        checkBorders(radius, Space.game.getWidth() - radius + 1, 1, (Space.game.getHeight() / 2));
        if (++counter % 10 == 0) fire();
    }

    public void fire() {
        Space.game.getBombs().add(new Bomb(x, y));
    }
}

 

package com.javarush.test.level25.lesson16.big01;

/**
 * Класс для космического корабля
 */
public class SpaceShip extends BaseObject {
    //картинка корабля для отрисовки
    private static int[][] matrix = {
            {0, 0, 0, 0, 0},
            {0, 0, 1, 0, 0},
            {0, 0, 1, 0, 0},
            {1, 0, 1, 0, 1},
            {1, 1, 1, 1, 1},
    };

    //вектор движения (-1 влево,+1 вправо)
    private double dx = 0;

    public SpaceShip(int x, int y) {
        super(x, y, 3);
    }

    public SpaceShip() {

    }

    /**
     * Устанавливаем вектор движения влево
     */
    public void moveLeft() {
        dx = -1;
    }

    /**
     * Устанавливаем вектор движения вправо
     */
    public void moveRight() {
        dx = 1;
    }

    /**
     * Метод рисует свой объект на "канвасе".
     */
    @Override
    public void draw(Canvas canvas) {
        canvas.drawMatrix(x - radius + 1, y, matrix, 'M');
    }

    /**
     * Двигаем себя на один ход.
     * Проверяем столкновение с границами.
     */
    @Override
    public void move() {
        x = x + dx;

        checkBorders(radius, Space.game.getWidth() - radius + 1, 1, Space.game.getHeight() + 1);
    }

    /**
     * Стреляем.
     * Создаем две ракеты: слева и справа от корабля.
     */
    public void fire() {
        Space.game.getRockets().add(new Rocket(x - 2, y));
        Space.game.getRockets().add(new Rocket(x + 2, y));
    }
}

 

package com.javarush.test.level25.lesson16.big01;

/**
 * Базовый класс для всех объектов игры.
 */
public abstract class BaseObject {
    //координаты
    protected double x;
    protected double y;
    //радиус объекта
    protected double radius;
    //состояние объект - жив ли объект
    private boolean isAlive;

    public BaseObject(double x, double y, double radius) {
        this.x = x;
        this.y = y;
        this.radius = radius;
        this.isAlive = true;
    }

    public BaseObject() {

    }

    public double getX() {
        return x;
    }

    public void setX(double x) {
        this.x = x;
    }

    public double getY() {
        return y;
    }

    public void setY(double y) {
        this.y = y;
    }

    public double getRadius() {
        return radius;
    }

    public void setRadius(double radius) {
        this.radius = radius;
    }

    /**
     * Метод рисует свой объект на "канвасе".
     */
    public void draw(Canvas canvas) {
        //do nothing
    }

    /**
     * Двигаем себя на один ход.
     */
    public void move() {
        //do nothing
    }

    /**
     * Проверяем - не выходит ли (x,y) за границы.
     */
    public void checkBorders(double minx, double maxx, double miny, double maxy) {
        if (x < minx) x = minx;
        if (x > maxx) x = maxx;
        if (y < miny) y = miny;
        if (y > maxy) y = maxy;
    }

    public boolean isAlive() {
        return isAlive;
    }

    public void setAlive(boolean alive) {
        isAlive = alive;
    }

    public void die() {
        isAlive = false;
    }

    /**
     * Проверяем - пересекаются ли переданный(o) и наш(this) объекты.
     */
    public boolean isIntersec(BaseObject o) {
        double dx = x - o.x;
        double dy = y - o.y;
        double destination = Math.sqrt(dx * dx + dy * dy);
        double destination2 = Math.max(radius, o.radius);
        return destination <= destination2;
    }
}

 

package com.javarush.test.level25.lesson16.big01;

/**
 * Класс для бомбы.
 */
public class Bomb extends BaseObject {
    public Bomb(double x, double y) {
        super(x, y, 1);
    }

    /**
     * Отрисовываем себя на холсте.
     */
    @Override
    public void draw(Canvas canvas) {
        canvas.setPoint(x, y, 'B');
    }

    /**
     * Двигаем себя вниз на один ход.
     */
    @Override
    public void move() {
        y++;
    }
}

 

package com.javarush.test.level25.lesson16.big01;

/**
 * Класс для объектов-ракета
 */
public class Rocket extends BaseObject {

    public Rocket(double x, double y) {
        super(x, y, 1);
    }

    /**
     * Метод рисует свой объект на "канвасе".
     */
    @Override
    public void draw(Canvas canvas) {
        canvas.setPoint(x, y, 'R');
    }

    /**
     * Двигаем себя вверх на один ход.
     */
    @Override
    public void move() {
        y--;
    }
}

 

package com.javarush.test.level25.lesson16.big01;


public class Canvas {
    private int width;
    private int height;
    private char[][] matrix;

    public Canvas(int width, int height) {
        this.width = width;
        this.height = height;
        this.matrix = new char[height + 2][width + 2];
    }

    public void clear() {
        this.matrix = new char[height + 2][width + 2];
    }

    public void drawMatrix(double x, double y, int[][] matrix, char c) {
        int height = matrix.length;
        int width = matrix[0].length;

        for (int i = 0; i < height; i++) {
            for (int j = 0; j < width; j++) {
                if (matrix[i][j] == 1)
                    setPoint(x + j, y + i, c);
            }
        }
    }

    public void setPoint(double x, double y, char c) {
        int x0 = (int) Math.round(x);
        int y0 = (int) Math.round(y);
        if (y0 < 0 || y0 >= matrix.length) return;
        if (x0 < 0 || x0 >= matrix[y0].length) return;

        matrix[y0][x0] = c;
    }

    public void print() {
        System.out.println();

        for (int i = 0; i < height + 2; i++) {
            for (int j = 0; j < width + 2; j++) {
                System.out.print(" ");
                System.out.print(matrix[i][j]);
                System.out.print(" ");
            }

            System.out.println();
        }

        System.out.println();
        System.out.println();
        System.out.println();
    }

    public int getWidth() {
        return width;
    }

    public int getHeight() {
        return height;
    }

    public char[][] getMatrix() {
        return matrix;
    }
}

 

package com.javarush.test.level25.lesson16.big01;

import java.util.ArrayList;

/**
 * Created by promoscow on 15.02.17.
 */
public class Space {
    private int height;
    private int width;
    private SpaceShip ship = new SpaceShip();
    ArrayList<Ufo> ufos = new ArrayList<>();
    ArrayList<Bomb> bombs = new ArrayList<>();
    ArrayList<Rocket> rockets = new ArrayList<>();

    public static Space game;

    public Space(int height, int width) {
        this.height = height;
        this.width = width;
    }

    public ArrayList<Ufo> getUfos() {
        return ufos;
    }

    public ArrayList<Bomb> getBombs() {
        return bombs;
    }

    public ArrayList<Rocket> getRockets() {
        return rockets;
    }

    public void setShip(SpaceShip ship) {

        this.ship = ship;
    }

    public int getHeight() {

        return height;
    }

    public int getWidth() {
        return width;
    }

    public SpaceShip getShip() {
        return ship;
    }

    public static void main(String[] args) {

    }

    public void run() {

    }

    public void draw() {

    }

    public void sleep(int ms) {

    }
}