Хорошо, давайте разберем эту задачу по разработке проекта.
Подготовка проекта
Для начала работы с проектом нужно его создать. В IntelliJ создайте новый проект со следующими настройками:
Name: Pkmn
Create Git repository (поставьте галочку)
Build system: Maven
JDK: 21
В Advanced Settings → groupId: ru.mirea.фамилия (вместо "фамилия" укажите свою фамилию)
Система сборки Maven нам понадобится для добавления различных библиотек в проект в будущем. Репозиторий Git требуется для реализации версионности проекта и сохранения его на GitHub.
Теперь иерархия папок проекта выглядит так:
Pkmn
.idea
src
main
java
resources
test
Исходный код с пакетами по умолчанию находится в каталоге
java, а дополнительные ресурсы (файлы конфигурации, изображения и т.д.), в каталоге
resources.
Реализация UML диаграммы в коде
Создайте структуру пакетов в каталоге
java: ru.mirea.pkmn.фамилия. Внутри пакета
pkmn необходимо создать набор классов, указанных на диаграмме.
Обратите внимание, что
EnergyType и
PokemonStage объявляются не как
class, а как
enum!
Так же, создайте во всех классах конструкторы, геттеры и сеттеры.
К счастью, инструментарий IntelliJ позволяет автоматизировать этот процесс.
Внутри класса нажмите ПКМ → Generate... → Constructor и создайте сначала конструктор со всеми полями, а затем пустой конструктор (Select None).
Для геттеров и сеттеров похожая схема: ПКМ → Generate... → Getter and Setter.
Дополнительно сгенерируйте
toString() методы: ПКМ → Generate → toString
Создайте дополнительно класс
PkmnApplication в котором будет располагаться точка входа в программу.
Самостоятельная работа
⚠ Выполняйте эти задания внутри пакета
фамилия!
💡 Эти задания предполагают, что вы реализовали UML диаграмму ранее.
ℹ Для выполнения обоих заданий вам помогут знания из лекции 2.6
Работа с файлами.
⚠ Не забудьте
загрузить свой проект на GitHub, и после каждого задания сохраняйте изменения.
Задание 1. (15 ОО)
Создайте в папке
resources файл
my_card.txt, в котором напишите построчно в следующем порядке все данные из вашей карты:
1. Стадия
2. Имя покемона
3. ХП
4. Тип покемона
5. Из какого покемона эволюционирует*
6. Способности атак в формате: цена / название / урон , если способностей две, то через запятую: цена / название / урон,цена / название / урон
7. Тип слабости (если есть)
8. Тип сопротивления (если есть)
9. Цена побега
10. Название сета**
11. Отметка легальности (буква E, G, и т.п)
12. Владелец карты в формате: фамилия / имя / отчество / группа
Пример:
my_card.txt
1 Basic
2 PikachuV
3 200
4 Lightning
5 -
6 1/Tail Whap/20,2L/Thunderbolt/100
7 Fighting
8 -
9 1
10 Fusion Strike
11 E
12 Иванов/Иван/Иванович/БСБО-01-23
Стоимость способности атаки и побега записывается первой буквой названия энергии, кроме Fighting, Fairy, Dragon, для их обозначения используются H, I, R соответственно.
* для этого найдите данные карточки другого покемона из интернета и создайте дополнительный файл
имя_покемона_прошлой_стадии.txt с данными соответствующей этой карте, кроме владельца карты, поместите путь к этому файлу в эту строчку. Если покемон в базовой стадии, то ставьте прочерк
-.
Поиск карт можно осуществлять через сайт
https://www.tcgplayer.com
** ищется на этой странице (если несколько для одной эмблемы, то подставляйте любой):
https://bulbapedia.bulbagarden.net/wiki/List_of_Pokémon_Trading_Card_Game_expansions
Создайте класс
CardImport, в котором опишите логику создания экземпляра карты из данных, описанных в файле, учитывая возможную зависимость от эволюционирования покемона.
Создайте экземпляр класса
CardImport в точке входа в
PkmnApplication, передайте туда путь к файлу
my_card.txt для загрузки данных. Выведите на экран полную информацию о покемоне.
Задание будет считаться выполненным только, если будет реализована логика загрузки из файла. Создание экземпляра, описанное "хардкодом" в конструкторе
Card не будет считаться.
Задание 2. (15 ОО)
Создайте класс
CardExport в котором опишите логику сериализации в байтовый формат объекта
Card. Формат выходного файла должен быть с расширением
.crd, название файла будет именем покемона.
Не забудьте, что классы
Card,
AttackSkill и
Student должны реализовывать стандартный интерфейс
Serializable (уже присутствует в JDK).
В
PkmnApplication создайте и используйте экземпляр
CardExport для сохранения созданной карты из предыдущего задания на диск.
В классе
CardImport создайте новый метод, который будет десериализовывать файл из байтового формата в класс
Card. Попросите владельца любой другой карты передать свой
.crd файл и загрузите его в программу и выведите всю информацию о карте.
⚠ Важный момент. Из-за
особенностей сериализации и десериализации объектных типов данных в случае, если происходит ошибка десериализации из-за "несовпадения полей класса", необходимо в проектах обоих студентов прописать в каждом классе (кроме
enum) константу:
public static final long serialVersionUID = 1L;
Затем снова сериализовать файл на диск и повторить попытку передачи.
Задание будет считаться выполненным, только, если вся информация будет загружаться из файла и все данные карты будут корректно отображаться, в том числе атакующие способности и владелец карты.