— Здорово, Амиго!
— Здравия желаю, Капитан Бобров!
— Готов к новой полностью секретной миссии?
— Готов, сэр!
— Тогда вот тебе инструкции к первому секретному заданию:
«А теперь напишем игру «змейка»».
— Есть, написать игру «змейка»!
— Да не кричи ты. Говорят же тебе – полностью секретное задание.
Для его выполнения будешь работать с агентом IntellijIDEA. Он введет тебя в курс дела.
Все дальнейшие инструкции также через него.
— Разрешите приступить, сэр?
— Приступайте.
6
Задача
Java Multithreading,
2 уровень,
18 лекция
Недоступна
Змейка(1)
А теперь напишем игру "змейка".
Для этого нам понадобятся:
а) собственно сама змея (класс Snake);
б) комната, в которой она будет ползать (класс Room);
в) мыши, которых она будет есть (класс Mouse).
Создай классы Snake, Room, Mouse.
6
Задача
Java Multithreading,
2 уровень,
18 лекция
Недоступна
Змейка(2)
Теперь самое интересное - как будет устроена змея.
Что можно сказать о змее:
а) По сути - змея это набор кусочков - клеточек. Но точно известно, что один из них - голова.
б) У змеи есть направление движения.
Так что нам еще понадобятся классы:
SnakeSection - кусочек змеи.
6
Задача
Java Multithreading,
2 уровень,
18 лекция
Недоступна
Змейка(3)
Отлично. Я еще добавил класс KeyboardObserver на будущее.
Изучи его внимательно. Пригодится.
Начнем с самого простого - класса Mouse.
Мышь не будет двигаться и у нее будут только координаты и все.
Добавь два приватных поля в класс Mouse: x и y типа int.
6
Задача
Java Multithreading,
2 уровень,
18 лекция
Недоступна
Змейка(4)
Координаты x и y ты уже создал в классе Mouse, а как получить к ним доступ?
Создай корректные геттеры для этих полей и конструктор с двумя параметрами типа int (x и y соответственно).
6
Задача
Java Multithreading,
2 уровень,
18 лекция
Недоступна
Змейка(5)
Теперь доделаем enum SnakeDirection так, чтобы он содержал возможные направления движения змейки.
Добавь 4 значения UP, DOWN, LEFT, RIGHT.
Должно получиться примерно так:
public enum SnakeDirection
{
UP,
RIGHT,
DOWN,
LEFT
}
6
Задача
Java Multithreading,
2 уровень,
18 лекция
Недоступна
Змейка(6)
Теперь займемся классом SnakeSection.
Он будет описывать один кусочек змеи.
А у каждого кусочка что есть?
Правильно! Координаты.
Добавь два поля в класс SnakeSection: x и y типа int.
Добавь для них getter'ы и конструктор с двумя параметрами типа int.
6
Задача
Java Multithreading,
2 уровень,
18 лекция
Недоступна
Змейка(7)
"Кусочки змеи" мы описали, теперь займемся самой змеей.
У змеи должен быть список кусочков(SnakeSection) и голова.
Пусть головой будет просто самый первый кусочек (с номером 0).
У змеи также есть направление движения - сторона, куда она движется по умолчанию.
6
Задача
Java Multithreading,
2 уровень,
18 лекция
Недоступна
Змейка(8)
Настала очередь конструктора класса Snake.
Змея у нас будет поначалу состоять из одного кусочка - головы.
А что для него требуется?
Что необходимо передать в конструктор?
Координаты змеи, конечно же.
Надо:
а) Передать в конструктор координаты головы змеи (x и y).
6
Задача
Java Multithreading,
2 уровень,
18 лекция
Недоступна
Змейка(9)
Еще остался самый главный класс - Room.
Что нам нужно для его описания?
Размеры комнаты (width и height) - раз.
Змея - два
Мышь - три.
Надо:
а) создать в классе Room переменные width и height типа int.
б) создать в классе Room переменную snake типа Snake.
6
Задача
Java Multithreading,
2 уровень,
18 лекция
Недоступна
Змейка(10)
Займемся методом main.
Для начала надо создать в классе Room статическое поле game типа Room. Доступ к переменной должен быть из всех классов.
Затем в методе main:
а) Создать змею - объект типа Snake.
б) Создать комнату - объект типа Room и передать в него ширину, высоту и змею.
6
Задача
Java Multithreading,
2 уровень,
18 лекция
Недоступна
Змейка(11)
Теперь логика управления мышью.
С мышью у нас будут происходить две вещи.
Первая - змея съедает мышь.
Вторая - появляется новая мышь в случайной точке комнаты.
Надо написать и реализовать метод createMouse() в классе Room.
6
Задача
Java Multithreading,
2 уровень,
18 лекция
Недоступна
Змейка(12)
Змея у нас есть, пусть и мышь будет.
Добавить в метод main:
a) вызов метода createMouse().
б) вызов метода run().
Без него ничего работать не будет. В нем вся основная логика.
Неплохо получилось, но я все-таки внесу пару правок.
Кстати, как насчет написать метод sleep?
12
Задача
Java Multithreading,
2 уровень,
18 лекция
Недоступна
Змейка(13)
Предлагаю тебе в этот раз написать специальный метод sleep(), который будет делать паузу
в зависимости от длины змеи (количества элементов в sections).
Придумай какой-нибудь хитрый алгоритм. Чтобы на первом уровне пауза была 500 миллисекунд,
к 11 уровню постепенно уменьшилась до 300. А к 15 до 200. И дальше оставалась постоянной.
24
Задача
Java Multithreading,
2 уровень,
18 лекция
Недоступна
Змейка(14)
Теперь поработаем над методом print().
Надо:
а) вывести на экран прямоугольник из точек размером width x height.
б) тело змеи отметить символом "x"-английское
в) голову змеи нарисовать символом "X"-английское.
Подсказка:
а) удобно сначала создать матрицу типа int[][] с размером (height x width).
12
Задача
Java Multithreading,
2 уровень,
18 лекция
Недоступна
Змейка(15)
Теперь осталось допилить змею.
Вот что я предлагаю насчет движения змеи:
Змея состоит из кусочков. Давай каждый ход просто добавлять один кусочек со стороны головы,
а самый последний - удалять. Тогда получится, что змея ползет.
12
Задача
Java Multithreading,
2 уровень,
18 лекция
Недоступна
Змейка(16)
Ничто не вечно.. Так и змея должна умирать, если она врезается в стену или саму себя.
Для определения, не пересекается ли змея сама с собой, можно сделать очень простую проверку:
содержит ли список sections "новую голову змеи".
24
Задача
Java Multithreading,
2 уровень,
18 лекция
Недоступна
Змейка(17)
Теперь закончим класс Snake.
Змея состоит из кусочков. Давай каждый ход просто добавлять один кусочек со стороны головы,
а самый последний - удалять. Тогда получится, что змея ползет.
Добавлять кусочек нужно рядом с текущей головой (кусочком номер 0).
6
Задача
Java Multithreading,
2 уровень,
18 лекция
Недоступна
Змейка(18)
Отлично!
Запускаем и наслаждаемся змейкой.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ