Сообщество - Задачки для изучающих Java
Задачки для изучающих Java
29 постов 1 058 подписчиков
20

Создаем программу Hello World в JavaFX в IntelliJ IDEA

Пост вольный перевод статьи:

https://www.jetbrains.com/help/idea/developing-a-javafx-hell...


Для начала создаем проект JavaFX

Создаем программу Hello World в JavaFX в IntelliJ IDEA Java, Javafx, Программирование, Графика, Длиннопост

Выбираем JavaFX и жмем Next

Создаем программу Hello World в JavaFX в IntelliJ IDEA Java, Javafx, Программирование, Графика, Длиннопост

Даем имя проекту и жмем Finish.

информация с сайта http://ru.java.wikia.com/wiki/Контроллер

Контроллер - это класс, предназначенный для непосредственной обработки запросов от клиента и возвращения результатов.

Чаще всего, в самом контроллере не описывается логика обработки данных. Создаются дополнительные, сервисные классы, которые выполняют все основные задачи по обработке данных. Задача методов в контроллере - вызов сервисных методов в нужном порядке и возвращение результатов клиенту.

Основная задача методов контроллера - определить требуемое действие, корректно принять данные, корректно возвратить результат. При тестировании методов клиента рекомендуется проверять не фактическую обработку данных, а корректный вызов всех команд в методе - предполагая, что алгоритм работы этих методов продуман верно.

Файл sample.fxml отвечает за интерфейс пользователя.

Создаем программу Hello World в JavaFX в IntelliJ IDEA Java, Javafx, Программирование, Графика, Длиннопост

Переименовываем Controller в файле Controller.java

1. Наводим на имя класса-контроллера (Controller), выбираем Refractor->Rename и меняем имя класса-контроллера:

Создаем программу Hello World в JavaFX в IntelliJ IDEA Java, Javafx, Программирование, Графика, Длиннопост

Жмем enter и завершаем рефракторинг. В файле sample.fxml должно было измениться имя класса контроллера: fx:controller="sample.SampleController"

Важный момент, конструкция fx:id будет использоваться часто, она означает, что мы работаем с объектом класса Controller.

Создадим кнопку в интерфейсе пользователя, для этого в файл  sample.fxml добавим следующие сточки:

<Button text="Say 'Hello World'" onAction="#sayHelloWorld"/>

<Label GridPane.rowIndex="1" fx:id="helloWorld"/>


Возможно, понадобиться руками добавить:


<?import javafx.scene.control.Button?>

<?import javafx.scene.control.Label?>

Создаем программу Hello World в JavaFX в IntelliJ IDEA Java, Javafx, Программирование, Графика, Длиннопост

Как видите sayHelloWorld отмечен красным цветом, а helloWorld выделен.

Введем исправления:

Создаем программу Hello World в JavaFX в IntelliJ IDEA Java, Javafx, Программирование, Графика, Длиннопост

Используя встроенные функции IDEA создадим поле helloWorld в файле SampleController.java

Создаем программу Hello World в JavaFX в IntelliJ IDEA Java, Javafx, Программирование, Графика, Длиннопост

Жмем  enter, завершаем рефракторинг.

Далее создаем функцию sayHelloWorld встроенными способами IDEA:

Создаем программу Hello World в JavaFX в IntelliJ IDEA Java, Javafx, Программирование, Графика, Длиннопост

Жмем enter и завершаем рефракторинг.

Создаем программу Hello World в JavaFX в IntelliJ IDEA Java, Javafx, Программирование, Графика, Длиннопост

Добавляем действие в функцию sayHelloWorld:

Создаем программу Hello World в JavaFX в IntelliJ IDEA Java, Javafx, Программирование, Графика, Длиннопост

Результат работы программы:

Создаем программу Hello World в JavaFX в IntelliJ IDEA Java, Javafx, Программирование, Графика, Длиннопост
Создаем программу Hello World в JavaFX в IntelliJ IDEA Java, Javafx, Программирование, Графика, Длиннопост

Добавим стили в нашу программу.

В файл sample.fxml добавим следующий текст:

stylesheets="/sample/sample.css"

Создаем программу Hello World в JavaFX в IntelliJ IDEA Java, Javafx, Программирование, Графика, Длиннопост

Встроенными методами IDEA создадим файл sample.css

Создаем программу Hello World в JavaFX в IntelliJ IDEA Java, Javafx, Программирование, Графика, Длиннопост

В файл sample.css добавляем текст:

.root {

-fx-background-color: gold; //Цвет заднего фона окна

}


.label {

-fx-font-size: 20; //Высота текста Hello World

}

Создаем программу Hello World в JavaFX в IntelliJ IDEA Java, Javafx, Программирование, Графика, Длиннопост

Результат работы программы:

Создаем программу Hello World в JavaFX в IntelliJ IDEA Java, Javafx, Программирование, Графика, Длиннопост
Создаем программу Hello World в JavaFX в IntelliJ IDEA Java, Javafx, Программирование, Графика, Длиннопост
Показать полностью 16
10

Изучаем вместе

Добрый день, есть ли среди участников сообщества те, кто хотел бы поделиться опытом в изучении Джавы или же те, кто непосредственно занимается изучением данного языка и захотел бы к примеру сравнить свои результаты с другими (такого же уровня)?


На данный момент я изучаю Джаву по книгам, разным ресурсам и мне не хватает такой вещи как непосредственного общения с разработчиком, который мог бы сказать на что конкретно нужно делать уклон, что я делаю не так при изучении и как правильно двигаться дальше. Да и мотивировало бы это больше. Так же не помешало бы и общение с изучающими людьми, узнавать их подход.


Если кто-нибудь откликнется, будет здорово. Если это будет больше одного человека, можно было бы создать телеграм канал или что то в этом духе.


Всем добра, бобра и лучей позитива!

15

Помогите начинающему программисту JAVA

Дорогие пикабушники. Если среди вас есть программист по java, подскажите новичку как набирать опыта. т.е. требуется практика, примеры работы или участие в каком не будь проекте как новичку.


Буду благодарен

8

Небольшой разбор первого задания

При прочтении просьба не забывать, что я всего лишь кот :3

Небольшой разбор первого задания Java, Задача, Решение, Длиннопост

Объявляем класс:


class Cat {
}

При объявлении переменных класса я использовал модификатор private для что, чтобы их можно изменять извне только с помощью специального интерфейса.


private String name, colour;
private double weight, length, height, strength;

Конструктор по умолчанию, присваивающий стандартные значения переменным класса:


public Cat () {
name = "NoName";
colour = "Black";
weight = 6.5;
length = 1.0;
height = 0.4;
strength = 0.5 * weight * length * height;
}

Конструктор, через который мы сможем в программе присвоить свои значения переменным класса:


public Cat (String name, String colour, double weight, double length, double height)
{
this.name = name;
this.colour = colour;
this.weight = weight;
this.length = length;
this.height = height;
strength = 0.5*weight * length * height;
}

Так как имена передаваемых параметров в конструкторе совпадают с переменными класса, используется конструкция this.переменная = переменная.


Вводится функция класса, позволяющая получить имя кота. Это необходимо, так как переменные класса имеют модификатор private и доступа к ним извне нет.


public String getName () {
return name;
}

И проверка класса на работоспособность:


public static void main(String[] args)

{
Cat cat1 = new Cat();
System.out.println(cat1.getName());
Cat cat2 = new Cat("Salem", "Black", 6.5, 1.0, 0.4);
System.out.println(cat2.getName());
}

Так как классы имеют сложную структуру необходимо использовать ключевое слово new для того, чтобы для него была выделена память программой.


#comment_67980312


Программа выводит следующее:


NoName
Salem

Вручите мне мой приз, пожалуйста.)

Небольшой разбор первого задания Java, Задача, Решение, Длиннопост
Показать полностью 1
11

Когда Hello world уже не достаточно.

Привет всем кто учит какие либо языки программирования, а в особенности Java.

Я далекий от про уровня человек, но люблю на досуге писать код. И вот я не так давно (благодаря упоминанию тут), открыл для себя ресурс codewars.


Ресурс поддерживает много языков программирования, так что одни и те же задачи можно решать разными языками. Пользователи сами могут создавать задачи для других и тд.


Но причина создания не в рекламе ресурса, а том что бы найти других людей у которых хобби как у меня и вместе решать задачки, обсуждать их, а может и создавать.

Когда Hello world уже не достаточно. Java, Codewars, Программирование, Логическая задача, М
10

Интересный вопрос.

Все знаю про три закона робототехники разработанные А. Азимовым



Робот не может причинить вред человеку или своим бездействием допустить, чтобы человеку был причинён вред.

Робот должен повиноваться всем приказам, которые даёт человек, кроме тех случаев, когда эти приказы противоречат Первому Закону.

Робот должен заботиться о своей безопасности в той мере, в которой это не противоречит Первому или Второму Законам.


(Не обязательно же наличие "позитронных" мозгов, становится актуально с появлением автомобилей на автопилоте)


Но хоть один программист пытался их написать машинным или программным кодом??

7

Реализация программы TankBattle с использованием Swing. Часть первая - создание окна приложения.

О да, я вернулся..)

Реализация программы TankBattle с использованием Swing. Часть первая - создание окна приложения. Java, Задача, Обучение, Программирование, Длиннопост

Проект находится по адресу: https://github.com/Norfin85/TankBattle

Вся графика реализована в файле: Graphics.java.

Открытие окна происходит через стандартную для Swing процедуру:

Реализация программы TankBattle с использованием Swing. Часть первая - создание окна приложения. Java, Задача, Обучение, Программирование, Длиннопост

С помощью SwingUtilities.invokeLater мы помещаем создание окна в очередь событий - event dispatch thread.

Основное окно использует компоновщик BoxLayout:

frame.setLayout(new BoxLayout(frame.getContentPane(), BoxLayout.Y_AXIS)

и размещает панели сверху-вниз.

Внутрь окна мы помещаем две панели: MainPanel и BottomPanel, которые будут содержать более детальные блоки программы, о чем будет рассказано ниже.


Примерная структура любого окна в Swing:

Реализация программы TankBattle с использованием Swing. Часть первая - создание окна приложения. Java, Задача, Обучение, Программирование, Длиннопост

Структура нашего окна:

Реализация программы TankBattle с использованием Swing. Часть первая - создание окна приложения. Java, Задача, Обучение, Программирование, Длиннопост

Параметры нашего окна определяются следующими командами:

Реализация программы TankBattle с использованием Swing. Часть первая - создание окна приложения. Java, Задача, Обучение, Программирование, Длиннопост

Структура MainPanel:

Реализация программы TankBattle с использованием Swing. Часть первая - создание окна приложения. Java, Задача, Обучение, Программирование, Длиннопост

На первый взгляд мудрено....

Реализация программы TankBattle с использованием Swing. Часть первая - создание окна приложения. Java, Задача, Обучение, Программирование, Длиннопост

Рассмотрим более детально.

Внутрь MainPanel помещаются три панели - LeftPanel, CenterPanel, RightPanel, для них задаются конкретные размеры с помощью функции setPreferredSize(new Dimension(X, Y)).  Дальше простая арифметика - сумма параметров по X и Y должна равняться параметрам

X и Y MainPanel.

Внутри MainPanel используется тоже компоновщик BoxLayout, но уже по оси X, размещающий панели слева-направо.

Внутрь панелей вносятся элементы. Для позиционирования элементов я выбрал способ - создание EmptyBorder(int top, int left, int bottom, int right) и задание конкретных размеров элементов через функцию setPreferredSize(new Dimension(X, Y)).


В BottomPanel помещаются две кнопки и разносятся по сторонам через:

setAlignmentX(Component.RIGHT_ALIGNMENT)

setAlignmentX(Component.LEFT_ALIGNMENT)


Внутри элементов TextPanel размещаются элементы JTextPane. Использование данных элементов позволило стилизовать текст через следующую конструкцию:

Реализация программы TankBattle с использованием Swing. Часть первая - создание окна приложения. Java, Задача, Обучение, Программирование, Длиннопост

StyleConstants.setAlignment(simpleAttributeSet, StyleConstants.ALIGN_LEFT)- выравнивание по левому краю.

StyleConstants.setFontSize(simpleAttributeSet, 12) - размер шрифта.

StyleConstants.setFontFamily(simpleAttributeSet, "Times New Roman, cursive") - семейство шрифта.

simpleAttributeSet.addAttribute(StyleConstants.CharacterConstants.Foreground, new Color(112, 126, 173)) - цвет шрифта.


Дляотражения имеющихся танков использованы JProgressBar-ы, в дальнейшем они будут отражать промежуточные показатели здоровья танком, а не только жив-мертв.

Реализация программы TankBattle с использованием Swing. Часть первая - создание окна приложения. Java, Задача, Обучение, Программирование, Длиннопост

setMinimum(0) - минимальное значение в прогресс баре.

setMaximum(100) - максимальное значение.

setValue(100) - текущее значение.

setString("Легкий танк СССР " + (i + 1)) - аннотация.


BattleList (JTextPane) мы помещаем внутрь JScrollBar и назначаем параметр jsp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS)  - чтобы всегда отражался скролл.


Все блоки графики имеют статус private, т.е. изменения возможны только через специальный интерфейс - обычные правила хорошего тона в программировании (если судить по книжкам).


public static void setButton(String text, Boolean setActive) - меняет нашу кнопку buttom (меняет текст и делает активно/неактивной).


public static void setHealthes(Tank ussrTank, Tank germanTank) - меняет параметры здоровья в текстовых блоках слева и справа.


public static void setCurrentBattle(Tank ussrTank, Tank germanTank) - устанавливает текст текущей битвы в текстовом блоке CurrentBattle.


public static void updateFrame() - обновляем окно.


public static void updateBattleList() - обновляем battleList.


public static void startBattle() - запускает бой.


public static void setTankHealth(int id, int percent)  - устанавливает значение здоровья танка в соответствующем JProgressBar.


public static void showLog() - отображает окно лога битвы.


Лог битвы выведен на отдельную кнопку, открывающую окно лога, состоящего из JFrame и помещенного в него JScrollBar с вложенным в него JTextPane.


За сим на сегодня все..) Продолжение следует...)

Реализация программы TankBattle с использованием Swing. Часть первая - создание окна приложения. Java, Задача, Обучение, Программирование, Длиннопост
Показать полностью 8
5

Выполняем задание на Abstract Factory Pattern часть 1

В первой части мы создадим абстрактную фабрику танков, по одному экземпляру каждого танка и проведем бой между случайными танками СССР и Германии.

Выполняем задание на Abstract Factory Pattern часть 1 Java, Программирование, Паттерны, Задача, Длиннопост

Структура программы:

Выполняем задание на Abstract Factory Pattern часть 1 Java, Программирование, Паттерны, Задача, Длиннопост

Весь код программы находится по адресу: https://github.com/Norfin85/TankBattle


Опишу лишь пару, на мой, взгляд интересных моментов.

Момент 1:

Классы LightUssrTank, MediumUssrTank, HeavyUserTank имеют различный показатель armor. Все переменные в классах имеют модификатор private, а значит объявление переменной должно происходить в классе . Но UssrFactory возвращает  объекты класса Tank, а значит поле armor будет недоступно в этих объектах. Эту проблему можно решить следующим образом:

В абстрактом классе Tank объявляется абстрактная функция getArmor:

Выполняем задание на Abstract Factory Pattern часть 1 Java, Программирование, Паттерны, Задача, Длиннопост

А в конкретных класса объявляется переменная armor и реализация функции getArmor:

Выполняем задание на Abstract Factory Pattern часть 1 Java, Программирование, Паттерны, Задача, Длиннопост

Момент 2: в абстрактом классе задается конструктор, а в классе-наследнике UssrMediumTank он используется используя ключевое слово super(), при  этом класс UssrMediumTank имеет свой конструктор с большим количеством полей. Это позволяет нам объединять общие параметры для всех классов-наследников в один общий абстрактный класс.

И сама главная программа:

Выполняем задание на Abstract Factory Pattern часть 1 Java, Программирование, Паттерны, Задача, Длиннопост

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

И еще некоторые модификации...)

Выполняем задание на Abstract Factory Pattern часть 1 Java, Программирование, Паттерны, Задача, Длиннопост
Показать полностью 4
5

Необходима помощь более опытных людей (Java)

Всем доброго времени суток! Необходима помощь падавану, т.е мне. Вкратце суть: С недавних пор судьба решила что пора мне расти на профессиональном попроще программиста и заставила начать потихоньку обучатся Java. Ту инфу что накопал в сети(статейки на хабре, видеоуроки и т.д) по шурудил в целом и некоторые аспекты удалось усвоить (в активе 4 года технаря на техника-программиста(основной упор шел на Delphi) и 1.5 года работы сопровождающим (делфа+немного С#) так что базовые знания программиста имеются). Собственно столкнулся с тем что тяжеловато найти материал, проще говоря обычную методичку где будет реально описано подробно создание какого нибудь проекта. Реального проекта на основе которого можно было бы уже развиваться дальше. В этом плане плане понравились уроки Дударя с JavaFX на основе которых мне удалось самостоятельно реализовать некоторые модули АС которой занимается наше учреждение, но начальство планирует развивать Web направление поэтому интересно было бы, может кто знает какие-нибудь самоучители, методички, видеокурсы где пошагово все это можно посмотреть и повторить и потом уже с полученными знаниями накрутить своих фишек для усвоения материала? Особенно что касается разработки Web-сервиса как серверной части так и клиентской.

5

Разбор задания 2

Использован вариант решения #comment_68039914


Для определения высоты прыжка создаем функцию junpTo в классе Cat:


public double jumpTo() {
if ((length * height * 6.5 / weight) > 2 || (length * height * 6.5 / weight) < 0.5)
return (20 * length * height * 0,5);
return (20 * length * height);
}

Если кот слишком толстый или худой, уменьшаем его высоту прыжка...

Разбор задания 2 Java, Решение задач, Программирование, Длиннопост

Создаем базовый класс Furniture:


public abstract class Furniture {
private String color;
private String material;
private Double length;
private Double height;
public Furniture(String color, String material, Double length, Double height) {
this.setColor(color);
this.setMaterial(material);
this.setLength(length);
this.setHeight(height);
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public String getMaterial() {
return material;
}
public void setMaterial(String material) {
this.material = material;
}
public Double getLength() {
return length;
}
public void setLength(Double length) {
this.length = length;
}
public Double getHeight() {
return height;
}
public void setHeight(Double height) {
this.height = height;
}
}

Класс Furniture - абстрактный, на основе которого не могут создаваться объекты. При этом наследники класса могут быть не абстрактными, на их основе объекты создавать, соответственно, можно.

Создаем класс Table на базе класса Furniture:


public class Table extends Furniture {
private int legs;
public Table (int legs, String color, String material, Double length,
Double height) {
super(color, material, length, height);
this.legs = legs;
}
}

Ключевое слово super () являет собой ссылку на базовый класс, которую можно использовать в дочерних классах. В основном используется для вызова методов родительского класса. В нашем случае оно вызывает конструктор:

Furniture(String color, String material, Double length, Double height)
Разбор задания 2 Java, Решение задач, Программирование, Длиннопост

Модифицируем класс Cat: создаем экземпляр класса Table и проверяем запрыгнул ли кот на него:


Table table = new Table(4, "Brown", "Wood", 2.0, 1.2);
if (cat2.jumpTo < table.getHeight())
System.out.println("Бройлер 747 удачно приземлился");
else
System.out.println("Бройлер 747 потерпел крушение");
Разбор задания 2 Java, Решение задач, Программирование, Длиннопост
Показать полностью 2
4

Abstarct Factory Pattern

Тип: порождающий шаблон


Назначение: обеспечивает создание семейств взаимосвязанных или зависящих друг от друга

объектов без указания их конкретных классов.

Является развитием паттерна Factory Method.

Используется в следующих случаях:

- система не должна зависеть от способа создания объектов;

- система работает с одним из нескольких семейств объектов;

- объекты внутри семейства взаимосвязаны.


Программа обращается к классу-конструктору фабрик FactoryProducer, создавая два класса-фабрики CatFactory и DogFactory - наследники с реализацией абстрактного класса AbstractFactory. Классы фабрики создают 3 объекта класса Cat и 3 объекта класса Dog.

Abstarct Factory Pattern Java, Паттерны, Программирование, Длиннопост

Создаем классы-интерфейсы Cat и Dog:

Cat.java, Dog.java

Abstarct Factory Pattern Java, Паттерны, Программирование, Длиннопост
Abstarct Factory Pattern Java, Паттерны, Программирование, Длиннопост

Создаем наследников класса Cat с реализацией его функций:

ThinCat.java, NormalCat.java, FatCat.java

Abstarct Factory Pattern Java, Паттерны, Программирование, Длиннопост

Создаем наследников класса Dog с реализацией его функций:

ThinDog.java, NormalDog.java, FatDog.java

Abstarct Factory Pattern Java, Паттерны, Программирование, Длиннопост

Создаем абстрактный класс AbstractFactory:

AbstractFactory.java

Abstarct Factory Pattern Java, Паттерны, Программирование, Длиннопост

Создаем классы-фабрики CatFactory и DogFactory:

CatFactory.java, DogFactory.java

Abstarct Factory Pattern Java, Паттерны, Программирование, Длиннопост

Создаем класс-конструктор фабрик FactoryProducer:

FactoryProducer.java

Abstarct Factory Pattern Java, Паттерны, Программирование, Длиннопост

Основной класс AbstractFactoryPatternCvsD:

AbstractFactoryPatternCvsD.java

Abstarct Factory Pattern Java, Паттерны, Программирование, Длиннопост
Abstarct Factory Pattern Java, Паттерны, Программирование, Длиннопост

И что выводит программа:

Abstarct Factory Pattern Java, Паттерны, Программирование, Длиннопост

С вами был Salem, на 100 лет проклятый быть криворуким программистом...

Abstarct Factory Pattern Java, Паттерны, Программирование, Длиннопост
Показать полностью 10
3

Модифицируем класс Cat, создаем базовый класс Furniture

Задание 2: необходимо создать функцию, определяющую высоту прыжка кота, зависящую от базовых параметров кота (вес, рост, высота). Создать базовый класс Furniture (мебель), обладающий параметрами: высота, цвет, материал, длина. На базе класса Furniture создать класс Table (добавить параметр количество ножек). Реализовать взаимодействие двух объектов: Cat и Table. Вывести получилось ли у кота запрыгнуть на него.

Модифицируем класс Cat, создаем базовый класс Furniture Java, Задача, Программирование, Гифка
1

Задание на Abstract Factory Pattern

Используя Abstract Factory Pattern создать 6 объектов: 3 немецких танка (легкий, средний, тяжелый) и 3 русских танка (легкий, средний, тяжелый). Танки обладают параметрами: количество хелсов, урон, время на выстрел, время на разворот на 90 градусов.

Организовать бой: у каждой стороны 1 тяжелый танк, 3 средних танка и 5 легких танков. Встречи происходят по-одному случайным образом, также случайным образом определяется тип встречи: атака лоб в лоб, боковая атака, атака сзади. Танк может атаковать, только если он повернулся к противнику. Можно организовать какие-то бонусы при атаке сзади/сбоку.

Задание на Abstract Factory Pattern Java, Задача, Программирование, Паттерны
0

Помогите с установкой JAVA

Доброго времени суток.

Решил начать изучать java для себя. С нуля, прям вообще (школьный курс qbasic, думаю, можно не вспоминать). И сразу столкнулся с проблемой исполнения Hello World. Java Runtime поддерживает версии до 52.0, JDK от Oracle уже 55.0. Что нужно сделать, чтобы версии совместить. В интернете инфы не нашёл. Хотя бы ткните носом где искать.

0

Выполняем задание на Abstract Factory Pattern часть 2

Представляю Вам вторую часть задания по абстрактной фабрике - Битва танков.

В программе появился учет скоростей разворота и перезарядки танков, небольшие отчеты по совершенным действиям танков, танков теперь 5л+3с+1т. Бои проходя также один на один, но пока разворачивается, к примеру, тяжелый танк легкий успевает его прилично повредить. У танков появились очки хода, которые они тратят на действия. И немного подробнее будет изложено ниже.

Выполняем задание на Abstract Factory Pattern часть 2 Java, Программирование, Паттерны, Задача, Длиннопост

Изменена структура проекта:

Выполняем задание на Abstract Factory Pattern часть 2 Java, Программирование, Паттерны, Задача, Длиннопост

По замечаниям в прошлых постах исправлены фабрики - теперь для выбора типа танка используется enum:

Выполняем задание на Abstract Factory Pattern часть 2 Java, Программирование, Паттерны, Задача, Длиннопост
Выполняем задание на Abstract Factory Pattern часть 2 Java, Программирование, Паттерны, Задача, Длиннопост

Мммм...можно почитать тут:

http://developer.alexanderklimov.ru/android/java/enum.php

Сильно переработан класс Tank - armor перенесен в абстрактный класс, добавлены переменные curDislocation, actionPoints, создан метод public void doAction(Tank tank), исправлен конструктор с учетом новых переменных:

Выполняем задание на Abstract Factory Pattern часть 2 Java, Программирование, Паттерны, Задача, Длиннопост

Изменения коснулись, соответственно, и классов-наследников Tank.

И переработана сама программа TankBattle - танков теперь больше, бой идет, пока одна из сторон не уничтожена, появилась система раздачи очков действий и пауза - 1 секунда перед каждой раздачей, из-за чего появился выброс исключения, часть операций перенесена внутрь классов:

Выполняем задание на Abstract Factory Pattern часть 2 Java, Программирование, Паттерны, Задача, Длиннопост

И пример боя:

Начался бой между USSR_MEDIUM и GERMAN_MEDIUM

USSR_MEDIUM расположение - 1


GERMAN_MEDIUM расположение - 0


GERMAN_MEDIUM нанес 50 урона. У противника осталось 150 очков жизни.


GERMAN_MEDIUM нанес 50 урона. У противника осталось 100 очков жизни.


USSR_MEDIUM развернулся.


USSR_MEDIUM нанес 50 урона. У противника осталось 150 очков жизни.


GERMAN_MEDIUM нанес 50 урона. У противника осталось 50 очков жизни.


USSR_MEDIUM нанес 50 урона. У противника осталось 100 очков жизни.


GERMAN_MEDIUM нанес 50 урона. У противника осталось 0 очков жизни.


USSR_MEDIUM уничтожен.


Начался бой между USSR_MEDIUM и GERMAN_MEDIUM


USSR_MEDIUM расположение - 1


GERMAN_MEDIUM расположение - 1


USSR_MEDIUM развернулся.


GERMAN_MEDIUM развернулся.


USSR_MEDIUM нанес 50 урона. У противника осталось 50 очков жизни.


GERMAN_MEDIUM нанес 50 урона. У противника осталось 150 очков жизни.


USSR_MEDIUM нанес 50 урона. У противника осталось 0 очков жизни.


GERMAN_MEDIUM уничтожен.


Начался бой между USSR_LIGHT и GERMAN_LIGHT


USSR_LIGHT расположение - 1


GERMAN_LIGHT расположение - 1


USSR_LIGHT развернулся.


GERMAN_LIGHT развернулся.


USSR_LIGHT нанес 27 урона. У противника осталось 73 очков жизни.


GERMAN_LIGHT нанес 27 урона. У противника осталось 73 очков жизни.


USSR_LIGHT нанес 27 урона. У противника осталось 46 очков жизни.


GERMAN_LIGHT нанес 27 урона. У противника осталось 46 очков жизни.


USSR_LIGHT нанес 27 урона. У противника осталось 19 очков жизни.


GERMAN_LIGHT нанес 27 урона. У противника осталось 19 очков жизни.


USSR_LIGHT нанес 27 урона. У противника осталось -8 очков жизни.


GERMAN_LIGHT уничтожен.


Начался бой между USSR_LIGHT и GERMAN_MEDIUM


USSR_LIGHT расположение - 1


GERMAN_MEDIUM расположение - 1


USSR_LIGHT развернулся.


USSR_LIGHT нанес 20 урона. У противника осталось 180 очков жизни.


USSR_LIGHT нанес 20 урона. У противника осталось 160 очков жизни.


GERMAN_MEDIUM развернулся.


USSR_LIGHT нанес 20 урона. У противника осталось 140 очков жизни.


GERMAN_MEDIUM нанес 57 урона. У противника осталось 43 очков жизни.


USSR_LIGHT нанес 20 урона. У противника осталось 120 очков жизни.


USSR_LIGHT нанес 20 урона. У противника осталось 100 очков жизни.


GERMAN_MEDIUM нанес 57 урона. У противника осталось -14 очков жизни.


USSR_LIGHT уничтожен.


Начался бой между USSR_LIGHT и GERMAN_LIGHT


USSR_LIGHT расположение - 1


GERMAN_LIGHT расположение - 1


USSR_LIGHT развернулся.


GERMAN_LIGHT развернулся.


USSR_LIGHT нанес 27 урона. У противника осталось 73 очков жизни.


GERMAN_LIGHT нанес 27 урона. У противника осталось 73 очков жизни.


USSR_LIGHT нанес 27 урона. У противника осталось 46 очков жизни.


GERMAN_LIGHT нанес 27 урона. У противника осталось 46 очков жизни.


USSR_LIGHT нанес 27 урона. У противника осталось 19 очков жизни.


GERMAN_LIGHT нанес 27 урона. У противника осталось 19 очков жизни.


USSR_LIGHT нанес 27 урона. У противника осталось -8 очков жизни.


GERMAN_LIGHT уничтожен.


Начался бой между USSR_LIGHT и GERMAN_LIGHT


USSR_LIGHT расположение - 0


GERMAN_LIGHT расположение - 0


USSR_LIGHT нанес 27 урона. У противника осталось 73 очков жизни.


GERMAN_LIGHT нанес 27 урона. У противника осталось 73 очков жизни.


USSR_LIGHT нанес 27 урона. У противника осталось 46 очков жизни.


GERMAN_LIGHT нанес 27 урона. У противника осталось 46 очков жизни.


USSR_LIGHT нанес 27 урона. У противника осталось 19 очков жизни.


GERMAN_LIGHT нанес 27 урона. У противника осталось 19 очков жизни.


USSR_LIGHT нанес 27 урона. У противника осталось -8 очков жизни.


GERMAN_LIGHT уничтожен.


Начался бой между USSR_LIGHT и GERMAN_LIGHT


USSR_LIGHT расположение - 1


GERMAN_LIGHT расположение - 0


USSR_LIGHT развернулся.


GERMAN_LIGHT нанес 27 урона. У противника осталось -8 очков жизни.


USSR_LIGHT уничтожен.


Начался бой между USSR_LIGHT и GERMAN_LIGHT


USSR_LIGHT расположение - 0


GERMAN_LIGHT расположение - 1


USSR_LIGHT нанес 27 урона. У противника осталось 73 очков жизни.


GERMAN_LIGHT развернулся.


USSR_LIGHT нанес 27 урона. У противника осталось 46 очков жизни.


GERMAN_LIGHT нанес 27 урона. У противника осталось -8 очков жизни.


USSR_LIGHT уничтожен.


Начался бой между USSR_LIGHT и GERMAN_MEDIUM


USSR_LIGHT расположение - 0


GERMAN_MEDIUM расположение - 1


USSR_LIGHT нанес 20 урона. У противника осталось 180 очков жизни.


USSR_LIGHT нанес 20 урона. У противника осталось 160 очков жизни.


USSR_LIGHT нанес 20 урона. У противника осталось 140 очков жизни.


USSR_LIGHT нанес 20 урона. У противника осталось 120 очков жизни.


GERMAN_MEDIUM развернулся.


USSR_LIGHT нанес 20 урона. У противника осталось 100 очков жизни.


GERMAN_MEDIUM нанес 57 урона. У противника осталось 43 очков жизни.


USSR_LIGHT нанес 20 урона. У противника осталось 80 очков жизни.


USSR_LIGHT нанес 20 урона. У противника осталось 60 очков жизни.


GERMAN_MEDIUM нанес 57 урона. У противника осталось -14 очков жизни.


USSR_LIGHT уничтожен.


Начался бой между USSR_MEDIUM и GERMAN_LIGHT


USSR_MEDIUM расположение - 1


GERMAN_LIGHT расположение - 0


GERMAN_LIGHT нанес 20 урона. У противника осталось 130 очков жизни.


GERMAN_LIGHT нанес 20 урона. У противника осталось 110 очков жизни.


GERMAN_LIGHT нанес 20 урона. У противника осталось 90 очков жизни.


USSR_MEDIUM развернулся.


GERMAN_LIGHT нанес 20 урона. У противника осталось 70 очков жизни.


USSR_MEDIUM нанес 57 урона. У противника осталось -11 очков жизни.


GERMAN_LIGHT уничтожен.


Начался бой между USSR_LIGHT и GERMAN_LIGHT


USSR_LIGHT расположение - 0


GERMAN_LIGHT расположение - 1


USSR_LIGHT нанес 27 урона. У противника осталось 73 очков жизни.


USSR_LIGHT нанес 27 урона. У противника осталось 46 очков жизни.


GERMAN_LIGHT развернулся.


USSR_LIGHT нанес 27 урона. У противника осталось 19 очков жизни.


GERMAN_LIGHT нанес 27 урона. У противника осталось -8 очков жизни.


USSR_LIGHT уничтожен.


Начался бой между USSR_MEDIUM и GERMAN_LIGHT


USSR_MEDIUM расположение - 1


GERMAN_LIGHT расположение - 1


GERMAN_LIGHT развернулся.


GERMAN_LIGHT нанес 20 урона. У противника осталось 50 очков жизни.


USSR_MEDIUM развернулся.


GERMAN_LIGHT нанес 20 урона. У противника осталось 30 очков жизни.


USSR_MEDIUM нанес 57 урона. У противника осталось -38 очков жизни.


GERMAN_LIGHT уничтожен.


Начался бой между USSR_MEDIUM и GERMAN_MEDIUM


USSR_MEDIUM расположение - 1


GERMAN_MEDIUM расположение - 1


USSR_MEDIUM развернулся.


USSR_MEDIUM нанес 50 урона. У противника осталось 10 очков жизни.


GERMAN_MEDIUM развернулся.


GERMAN_MEDIUM нанес 50 урона. У противника осталось -20 очков жизни.


USSR_MEDIUM уничтожен.


Начался бой между USSR_MEDIUM и GERMAN_MEDIUM


USSR_MEDIUM расположение - 1


GERMAN_MEDIUM расположение - 0


GERMAN_MEDIUM нанес 50 урона. У противника осталось 150 очков жизни.


GERMAN_MEDIUM нанес 50 урона. У противника осталось 100 очков жизни.


USSR_MEDIUM развернулся.


USSR_MEDIUM нанес 50 урона. У противника осталось 50 очков жизни.


GERMAN_MEDIUM нанес 50 урона. У противника осталось 50 очков жизни.


USSR_MEDIUM нанес 50 урона. У противника осталось 0 очков жизни.


GERMAN_MEDIUM уничтожен.


Начался бой между USSR_MEDIUM и GERMAN_MEDIUM


USSR_MEDIUM расположение - 0


GERMAN_MEDIUM расположение - 0


USSR_MEDIUM нанес 50 урона. У противника осталось -40 очков жизни.


GERMAN_MEDIUM уничтожен.


Начался бой между USSR_MEDIUM и GERMAN_HEAVY


USSR_MEDIUM расположение - 0


GERMAN_HEAVY расположение - 0


USSR_MEDIUM нанес 40 урона. У противника осталось 460 очков жизни.


GERMAN_HEAVY нанес 90 урона. У противника осталось -40 очков жизни.


USSR_MEDIUM уничтожен.


Начался бой между USSR_HEAVY и GERMAN_HEAVY


USSR_HEAVY расположение - 1


GERMAN_HEAVY расположение - 1


GERMAN_HEAVY развернулся.


USSR_HEAVY развернулся.


GERMAN_HEAVY нанес 80 урона. У противника осталось 420 очков жизни.


USSR_HEAVY нанес 80 урона. У противника осталось 380 очков жизни.


GERMAN_HEAVY нанес 80 урона. У противника осталось 340 очков жизни.


USSR_HEAVY нанес 80 урона. У противника осталось 300 очков жизни.


GERMAN_HEAVY нанес 80 урона. У противника осталось 260 очков жизни.


USSR_HEAVY нанес 80 урона. У противника осталось 220 очков жизни.


GERMAN_HEAVY нанес 80 урона. У противника осталось 180 очков жизни.


USSR_HEAVY нанес 80 урона. У противника осталось 140 очков жизни.


GERMAN_HEAVY нанес 80 урона. У противника осталось 100 очков жизни.


USSR_HEAVY нанес 80 урона. У противника осталось 60 очков жизни.


GERMAN_HEAVY нанес 80 урона. У противника осталось 20 очков жизни.


USSR_HEAVY нанес 80 урона. У противника осталось -20 очков жизни.


GERMAN_HEAVY уничтожен.


App.Tanks.Ussr.UssrHeavyTank@677327b6


Все танки Германии уничтожены!

Выполняем задание на Abstract Factory Pattern часть 2 Java, Программирование, Паттерны, Задача, Длиннопост

Исходники программы: https://github.com/Norfin85/TankBattle

Показать полностью 6

«На мониторе 21:9 спокойно помещаются восемь мобильных макетов в ряд». Тест-драйв ультраширокого монитора от дизайнера

Пикабу и LG запустили совместный проект, в котором дизайнер, редактор и геймер тестируют UltraWide мониторы. Еще на страничке проекта вы можете поделиться своим рабочим столом и посмотреть на рабочие столы других пикабушников и пикабушниц, а также попытаться выиграть один из ультрашироких мониторов в конкурсе.


Меня зовут Надя, и я рисую. Лет так до 23 исключительно ради удовольствия, а теперь, наконец, за деньги. Вообще, я графический дизайнер, но каждый год кто-то придумывает моей профессии новые модные названия. Поэтому я продуктовый ui/ux дизайнер в IT-стартапе: рисую интерфейсы в сфере финтеха. Но иногда балуюсь и иллюстрацией. Мне удалось провести неделю с самым большим монитором в моей жизни — LG UltraWide (38WK95C).

«На мониторе 21:9 спокойно помещаются восемь мобильных макетов в ряд». Тест-драйв ультраширокого монитора от дизайнера Длиннопост

Первые впечатления


У нас, как водится в современных IT-компаниях, прогрессивное руководство, крутая команда, офис с кофе, печеньками и вот этим вот всем. А у меня — как дизайнера в этой современной компании — огромный монитор, простор для фантазии и свободный график. Пару недель назад мне написал редактор Pikabu:

— Как ты относишься к большим мониторам?
— Ну этим меня не удивишь! В офисе огромный iMac, а когда остаюсь дома, довольствуюсь 15-дюймовым экраном ноутбука.
— А не хочешь и дома недельку за большим монитором посидеть?

Я соглашаюсь, предупреждаю коллег и готовлюсь к приему «гостя». В пятницу приезжает Он – LG UltraWide. Мне показалось, что в Pikabu что-то напутали и вместо монитора выдали на тест домашний кинотеатр. Потому что в такую коробку кроме монитора должны еще как минимум поместиться я в горнолыжном костюме и 12 томов советской энциклопедии.

«На мониторе 21:9 спокойно помещаются восемь мобильных макетов в ряд». Тест-драйв ультраширокого монитора от дизайнера Длиннопост

Как назло, в эти дни осталась дома одна. Понимая, что мне не на кого рассчитывать, вскрыла коробку и охнула: монитор широченный, еще и изогнутый. Пара слов про эстетическую составляющую. С первого взгляда покорил не только размер. Как представитель творческой профессии, я оценила минималистичный дизайн корпуса, почти безрамочный экран и эффектный изгиб панели.


Достала, собрала: присоединила «туловище» к тонкой металлической ножке, тоже изогнутой, – поначалу казалось, что она слишком хрупкая для почти 8 кг, но стояло надежно. Охнула еще раз, но подключать монитор не решилась. Подумала: это же надо будет как-то законнектить с моим макбуком, переходники / драйвера / настройки… И легла спать – утро вечера мудренее.


Очень быстрая настройка


Утром оказалось, что у монитора за спиной не только по два классических порта HDMI и USB, но еще есть разъем USB Type-C (а в моем макбуке только такие), провод был в комплекте. Пришлось всего лишь воткнуть один провод в макбук, другой в сеть – и все получилось. Вот так! За полминуты я управилась с подключением и начала работать. Да, в субботу… не терпелось, знаете ли :) Испытание на совместимость с инородными объектами монитор прошел успешно. Неожиданный бонус: от этого же разъема USB-C заряжается подключенный к нему ноутбук!

«На мониторе 21:9 спокойно помещаются восемь мобильных макетов в ряд». Тест-драйв ультраширокого монитора от дизайнера Длиннопост

Следующее открытие – кнопка-джойстик. Если помните старые мониторы – аккордеоны с вертикалью кнопок с двух сторон, когда на ощупь пытаешься найти, где там корректировка яркости, – то оцените, что у LG одна кнопка. И для включения, и для навигации по меню настроек. Удобно и понятно.


Режимы изображений и экран


Первым, что бросилось в глаза, когда подключила: отличие цветопередачи от привычного мне дисплея Retina. Полезла в настройки, где помимо коррекции отдельных параметров, можно было выбрать один из готовых режимов изображений (тут и «фото», и «кино», и даже «Темная комната» для работы с приглушенным светом). С первого раза идеально подстроить друг под друга два экрана, увы, не вышло. Но интернет подсказал, что это легко исправить установкой драйвера.

«На мониторе 21:9 спокойно помещаются восемь мобильных макетов в ряд». Тест-драйв ультраширокого монитора от дизайнера Длиннопост

Само покрытие экрана полуматовое, не бликует. Боялась, что из-за изгиба монитора будет искажаться изображение, но нет. При такой ширине экрана (37,5 дюймов, разрешение 3840х1600) это помогает лучше воспринимать информацию по бокам.


Еще немного впечатлений первого дня:

• Он огромный. Нет. Он ОГРОМНЫЙ! Почти в полтора раза шире моего офисного.

• Простота подключения, наличие разных разъемов и проводов в комплекте.


Пара неудобств:

• Пока теряю курсор в навигации между двумя экранами.

• От постоянных поворотов слева направо между панелями инструментов в Sketch устала шея.


37,5 дюймов для дизайна и графики


Всю следующую неделю я проводила за монитором по 12 часов в день. Мой основной рабочий инструмент – программа Sketch для векторной графики. На широкоформатном мониторе, оказывается, спокойно умещаются в ряд восемь мобильных макетов. Вот они – все перед глазами, и мне реже приходится переносить рабочую область в поисках нужного.


Решила затестить удобство работы с растром. Нарисовала в альбоме картинку и поработала над ней в фотошопе: почистила фон и лишние штрихи, отрегулировала контраст, добавила цвет. Без каких-либо проблем сделала все, что хотела, и просто насладилась видом «в масштабе».


Нарисовать, конечно, решила себя за работой и LG UltraWide, и вот, что у меня получилось. Примерно так я ощущала себя, сидя перед монитором :)

«На мониторе 21:9 спокойно помещаются восемь мобильных макетов в ряд». Тест-драйв ультраширокого монитора от дизайнера Длиннопост

Главное неудобство для меня было как раз в том, что приходилось пользоваться клавиатурой ноутбука. Поэтому он стоял перед монитором и слегка мешал. Зато там же, в настройках, я выставила положение двух экранов таким образом, чтобы оно соответствовало реальности, и больше с курсором путаницы не было. К слову, шея адаптировалась тоже :)


Можно на небольшом экране ноутбука открыть чаты, а монитор целиком отвести под рабочую область, а то и под две разом. Но удобнее объединить (и одновременно разделить) экраны ноутбука и монитора в режиме Dual Controller («Двойной контроль»). Для этого надо установить дополнительную утилиту с официального сайта LG и выбрать режим Picture-by-picture («кадр рядом с кадром»). Так, одну область целиком отводишь для Sketch и Zeplin, другую – на почту, Slack и прочие мессенджеры. Ну или фоном включаешь сериальчик под конец рабочего дня – все-таки есть плюсы работы из дома!


Вместо домашнего кинотеатра


Вечером с работы вернулся мой суженный и, как полагается всем суженным, настоял на том, что теперь мы должны все бросить и срочно тестить просмотр кино. В конце концов, не дизайном единым. Поэтому заказали себе в LG-кинозал пиццу и стали искать среди платного контента (да-да, мы те самые, кто оформляют подписки и платят за просмотр) расхваленное 4К-качество. Но без специальных ТВ-приставок сделать это проблематично. То есть вот перед вами 37-дюймовый монитор, который в состоянии такое качество изображения поддержать, а кино еще надо как следует поискать. Но есть YouTube! Потестили 4К на кусочке «вДудя» («Круто, смотри, виден каждый волосок на его голове!»), а дальше любовались «Темным рыцарем» в скромном Full HD качестве.

«На мониторе 21:9 спокойно помещаются восемь мобильных макетов в ряд». Тест-драйв ультраширокого монитора от дизайнера Длиннопост

Кстати, вовремя на глаза попалась коробка из-под тестируемого, на которой крупными буквами написано Bluetooth audio. В самом мониторе два встроенные динамика по 10Вт – звук сносный и приятный. Но выяснилось, что на монитор можно выводить звук просто со смартфона или любого другого устройства – домашнюю аудиоколонку не ждали? В общем, «тест UltraWide для кино и музыки» тоже пройден.


Итог


Вернулась в офис, где на столе ждал мой монитор, и теперь уже не казался таким огромным. Меня предостерегали, что такие мониторы-гиганты, как LG UltraWide (38WK95C), чаще берут для игр или кино (в этом я и сама убедилась). Момент с графикой и фото якобы спорный и неоднозначный. Как по мне, спорить не о чем. Когда у тебя большая рабочая область, все макеты перед глазами, а чаты с коллегами на виду – это как минимум удобно. Многое из задуманного не успела: хотела закончить монтаж ролика, обработать фото, а не лениться… Что-то мне подсказывает, что с этими задачами монитор бы тоже неплохо справился :)


Как выиграть UltraWide монитор
Вам нужно прочитать все три тест-драйва мониторов на странице спецпроекта, а затем прислать нам свою идею использования ультрашировких мониторов. Авторы трех лучших предложений получат в подарок по монитору LG 29WK600. Рекомендаций всего две:
• Не повторять сценарии применения, описанные в тест-драйвах.
• «Краткость — сестра таланта».
Не откладывайте надолго, ведь конкурс закончится 8 мая 2019-го!
Показать полностью 5
Отличная работа, все прочитано!