diff --git a/VendingAppProject/Application.java b/VendingAppProject/Application.java new file mode 100644 index 0000000..7d520a8 --- /dev/null +++ b/VendingAppProject/Application.java @@ -0,0 +1,106 @@ + +import edu.androidclub.domain.Item; +import edu.androidclub.domain.ItemBox; + +import java.util.Stack; + +/* + Главный класс нашей программы - представляет собой само приложение. + Реализуем интерфейс Runnable - обозачаем, что этот класс (наше приложение) ЗАПУСКАЕМО, + или имеет метод run() +*/ +public class Application implements Runnable { + + + /* + Храним статический экземпляр нашего приложения + */ + private static Application app; + + /* + Точка входа в ПРОГРАММУ + */ + public static void main(String[] args) { + // Создаем экземпляр приложения в статической переменной и запускаем его + app = new Application(); + app.run(); + } + + /* + С помощью этого метода мы в любом участке кода (тк public static) можем получить наше приложение, + причём полученный экземпляр будет ОДИНАКОВЫМ ДЛЯ КАЖДОГО ВЫЗОВА МЕТОДА + (паттерн Singleton) + */ + public static Application getInstance() { + if (app == null) { // Если не создан - создаём + app = new Application(); + } + return app; + } + + /* + Метод запуска приложения как объекта. Определён интерфейсом + */ + @Override + public void run() { + test(); + } + + /* + Метод тестирования нашего приложения. + Здесь мы создадим случайные данные о продуктах и заполним ими наш "автомат", чтобы протестировать то, что + уже написано + */ + private void test() { + // Создадим схему продуктов (пустую) + ItemInfoScheme itemScheme = new ItemInfoScheme(); + // Создадим наборы продуктов для ячеек схемы (пустые) + Stack colas = new Stack<>(); // 1 + Stack sprites = new Stack<>(); // 2 + + // Заполним наши наборы продуктами + colas.push(new Cola()); + colas.push(new Cola()); + colas.push(new Cola()); + sprites.push(new Sprite()); + sprites.push(new Sprite()); + + // Создадим объекты-координаты наших наборов продуктов в схеме + Coordinates colaCors = new Coordinates(1, 1); + Coordinates spriteCors = new Coordinates(1, 2); + + // Поместии наборы продуктов в схему + itemScheme.put(colaCors, colas); + itemScheme.put(spriteCors, sprites); + + // Создадим нашу витрину (коробку продуктов) на основании схемы + ItemBox itemBox = new ProductsBox(itemScheme); + + // Протестируем схему - заставим витрину выдавать объекты на заданных координатах + if (itemBox.Check(new Coordinates(1, 1))) + ScreenOutput.printItemInfo(itemBox.emit(new Coordinates(1, 1))); + + if (itemBox.Check(new Coordinates(1, 1))) + ScreenOutput.printItemInfo(itemBox.emit(new Coordinates(1, 1))); + + if (itemBox.Check(new Coordinates(1, 1))) + ScreenOutput.printItemInfo(itemBox.emit(new Coordinates(1, 1))); + + if (itemBox.Check(new Coordinates(1, 1))) + ScreenOutput.printItemInfo(itemBox.emit(new Coordinates(1, 1))); + } + + // Опишем Колу как подкласс Предмета + public static class Cola extends Item { + public Cola() { + super("Cola",50); // Вызов конструктора класса-родителя (класса Item) + } + } + + // Опишем Спрайт как подкласс Предмета + public static class Sprite extends Item { + public Sprite() { + super("Sprite",60); + } + } +} \ No newline at end of file diff --git a/VendingAppProject/Command.java b/VendingAppProject/Command.java new file mode 100644 index 0000000..9d2f1f6 --- /dev/null +++ b/VendingAppProject/Command.java @@ -0,0 +1,27 @@ +public class Command { + public static final String TYPE_GET = "get"; + public static final String TYPE_STOP = "stop"; + + private final String type; + private final Object data; + + public Command(String type, Object data) { + this.type = type; + this.data = data; + } + + public String getType() { + return type; + } + + public Object getData() { + return data; + } + + @Override + public String toString() { + return "Command: { type = " + type + + ", data = " + data + + " }"; + } +} \ No newline at end of file diff --git a/VendingAppProject/ConsoleInput.java b/VendingAppProject/ConsoleInput.java new file mode 100644 index 0000000..b181ff5 --- /dev/null +++ b/VendingAppProject/ConsoleInput.java @@ -0,0 +1,57 @@ + +import edu.androidclub.domain.Keypad; +import org.omg.CORBA.CODESET_INCOMPATIBLE; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; + +public class ConsoleInput implements Keypad { + + @Override + public Command readCommand() { + InputStream in = System.in; + InputStreamReader reader = new InputStreamReader(in); + BufferedReader bufferedReader = new BufferedReader(reader); + String line = ""; + try { + line = bufferedReader.readLine(); + } catch (IOException ioex) { + System.err.println(ioex.toString()); + System.exit(0); + } + return getCommandByString(line); + } + + private Command getCommandByString(String input) { + Command result = null; + String trimInput = input.trim(); + + String[] elements = trimInput.split(" "); + + String typeStr = elements[0]; + + if (typeStr.equals(Command.TYPE_GET)) { + String dataStr = elements[1]; + + int data = Integer.valueOf(dataStr); + int x = data / 10; + int y = data % 10; + + result = new Command( + Command.TYPE_GET, + new Coordinates(x, y) + ); + } + if (typeStr.equals(Command.TYPE_STOP)) { + result = new Command( + Command.TYPE_STOP, + null + ); + } + + return result; + } + +} \ No newline at end of file diff --git a/VendingAppProject/ConsoleScreen.java b/VendingAppProject/ConsoleScreen.java new file mode 100644 index 0000000..a842a76 --- /dev/null +++ b/VendingAppProject/ConsoleScreen.java @@ -0,0 +1,23 @@ +import edu.androidclub.domain.AppScreen; + +import java.io.PrintStream; + +public class ConsoleScreen implements AppScreen { + + private static final String LINE_BORDER = "###"; + + private final PrintStream ps = System.out; + + @Override + public void printText(String text) { + ps.println(LINE_BORDER + " " + text + " " + LINE_BORDER); + } + + @Override + public void clear() { + for (int i = 0; i < 15; i++) { + ps.println(); + } + } + +} diff --git a/VendingAppProject/Coordinates.java b/VendingAppProject/Coordinates.java new file mode 100644 index 0000000..f1bf9a8 --- /dev/null +++ b/VendingAppProject/Coordinates.java @@ -0,0 +1,13 @@ + +import edu.androidclub.domain.Item; + +import java.util.HashMap; +import java.util.Stack; + +/* + Класс, представляющий собой схему наших предметов на витрине. + Наследуем его от *то, что после extends*, чтобы каждый раз не писать это *то, что после extends* + HashMap - хеш-карта - хранилище вида ключ->значение +* */ +public class ItemInfoScheme extends HashMap> { +} \ No newline at end of file diff --git a/VendingAppProject/ProductsBox.java b/VendingAppProject/ProductsBox.java new file mode 100644 index 0000000..e6e2d47 --- /dev/null +++ b/VendingAppProject/ProductsBox.java @@ -0,0 +1,39 @@ + +import edu.androidclub.domain.Item; +import edu.androidclub.domain.ItemBox; + +import java.util.Stack; + +/* + Реализация витрины аппарата +* */ +public class ProductsBox implements ItemBox { + + private ItemInfoScheme scheme; + + // Требует схему при создании + public ProductsBox(ItemInfoScheme scheme) { + this.scheme = scheme; + } + + // Выдать предмет по координатам + @Override + public Item emit(Coordinates coordinates) { + // Получить стопку предметов на позиции + Stack items = scheme.get(coordinates); + + // Если пусто - возвращаем пустоту + return items.pop(); + } + + public boolean Check(Coordinates coordinates) { + Stack items = scheme.get(coordinates); + if (items.empty()) { + return false; + } + return true; + } +} + + + diff --git a/VendingAppProject/Screen.java b/VendingAppProject/Screen.java new file mode 100644 index 0000000..dcefe94 --- /dev/null +++ b/VendingAppProject/Screen.java @@ -0,0 +1,116 @@ +import edu.androidclub.domain.AppScreen; + +import java.util.StringJoiner; + +/** + * Created by WinDA on 22.11.2016. + */ +public class Screen implements AppScreen{ + String notice; + + public Screen(){ + setNotice("Купи еду"); + } +/* + [Сообщение] + |----------|----------| + |Спрайт[65]| | + |----------|----------| + |Фанта[55] | | + |----------|----------| + */ + + @Override + public void update(ItemInfoScheme scheme) { + clear(); + System.out.println(getNotice()); // Текст сверху + + // Определяем размеры прямоугольника и ячейки + int maxRow = 0; + int maxCol = 0; + int minRow = 0; + int minCol = 0; + int maxLength = 1; + for(Coordinates i: scheme.keySet()){ + // ищем наибольшую и наименьшую Y + if(i.getColumn() > maxCol){ + maxCol = i.getColumn(); + } + else if(i.getColumn() < minCol){ + minCol = i.getColumn(); + } + + // ищем наибольший и наименьший X + if(i.getRow() > maxRow){ + maxRow = i.getRow(); + } + else if(i.getRow() < minRow){ + minRow = i.getRow(); + } + + if(scheme.get(i) != null && scheme.get(i).size() > 0){ + if(scheme.get(i).lastElement().getName().length() > maxLength){ + maxLength = scheme.get(i).lastElement().getName().length(); + } + } + } + + maxLength += 10; // Добавить места для цены и количества + + String emptyCell = multiply(" ", maxLength); + + // Начинаем рисование + String barrier = "|" + multiply("-", maxLength); + System.out.print(multiply(barrier, maxCol - minCol)); + System.out.println("|"); + for(int i = minRow; i <= maxRow; i++){ + for(int j = minCol; j <= maxCol; j++){ + System.out.print("|"); + + Coordinates coordinates = new Coordinates(i, j); + + if(scheme.get(coordinates) != null && scheme.get(coordinates).size() > 0){ + String name = scheme.get(coordinates).lastElement().getName(); + int cost = scheme.get(coordinates).lastElement().getCost(); + int amount = scheme.get(coordinates).size(); + + //Это костыль для красоты + int s1 = ("" + cost).length(); + int s2 = ("" + amount).length(); + + System.out.print(name + "[" + cost + "]" + "(" + amount + ")" + multiply(" ", maxLength - name.length() - 4 - s1 - s2)); + } + else{ + System.out.print(emptyCell); + } + } + System.out.println("|"); + System.out.print(multiply(barrier, maxCol - minCol)); + System.out.println("|"); + } + } + + @Override + public void setNotice(String text) { + this.notice = " [" + text + "]"; + } + + @Override + public String getNotice() { + return this.notice; + } + + @Override + public void clear() { + System.out.println("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"); + } + + private String multiply(String s, int amount){ + String res = new String(s); + for(int j = 0; j < amount; j++){ + res = res + s; + } + return res.toString(); + } + +} \ No newline at end of file diff --git a/VendingAppProject/ScreenInput.java b/VendingAppProject/ScreenInput.java new file mode 100644 index 0000000..af0162f --- /dev/null +++ b/VendingAppProject/ScreenInput.java @@ -0,0 +1,40 @@ +import edu.androidclub.domain.Item; + +public class ScreenInput +{ + static public void clear() + { + for (int i=0; i<50 ; i++) + System.out.println(); + } + + static public void printItemInfo(Item item) + { + System.out.print("| № "+item.getNumber()); + System.out.println(Spaces(18-Integer.toString(item.getNumber()).length())+'|'); + System.out.print("| Товар: "+item.getName()); + System.out.println(Spaces(18-item.getName().length())+'|'); + System.out.print("| Цена: "+item.getPrice()); + System.out.println(Spaces(18-Float.toString(item.getPrice()).length())+'|'); + System.out.println("+--------------------------------+"); + } + + static private String Spaces(int n) + { + String s = new String(); + for (int i=0;i + + + + + + + + + + \ No newline at end of file diff --git a/VendingAppProject/VendingAutomat.java b/VendingAppProject/VendingAutomat.java new file mode 100644 index 0000000..c519396 --- /dev/null +++ b/VendingAppProject/VendingAutomat.java @@ -0,0 +1,61 @@ +import edu.androidclub.domain.*; +import edu.androidclub.items.Cola; +import edu.androidclub.items.Fanta; +import edu.androidclub.items.Pulpy; +import edu.androidclub.items.Sprite; + +import java.io.IOException; +import java.util.Stack; + +public class VendingAutomat implements Runnable { + + private Keypad keypad = new ConsoleInput(); + private ItemBox itemBox = null; + private AppScreen screen = new ConsoleScreen(); + + @Override + public void run() { + populateItemBox(); + while (true) { + requestCommand(); + } + } + + public void stop() { + try { + Database db = new FileDatabase(); + db.persistScheme(itemBox.getScheme()); + } catch (IOException ioex) { + ioex.printStackTrace(); + } + System.exit(0); + } + + private void requestCommand() { + screen.printText( + "Hi dear User! Enter 'get #' where # is a product number to get it: " + ); + Command userCommand = keypad.readCommand(); + if (userCommand.getType().equals(Command.TYPE_GET)) { + Item item = itemBox.emit((Coordinates) userCommand.getData()); + if (item == null) { + screen.printText("No items left"); + } else { + screen.printText(item.getName() + " " + item.getCost()); + } + } + if (userCommand.getType().equals(Command.TYPE_STOP)) { + stop(); + } + } + + private void populateItemBox() { + try { + Database db = new FileDatabase(); + itemBox = new ProductsBox(db.loadScheme()); + } catch (IOException ioex) { + ioex.printStackTrace(); + } + } + +} \ No newline at end of file diff --git a/VendingAppProject/VoidItem.java b/VendingAppProject/VoidItem.java new file mode 100644 index 0000000..f7125fb --- /dev/null +++ b/VendingAppProject/VoidItem.java @@ -0,0 +1,9 @@ +import edu.androidclub.domain.Item; + + +// пустой предмет +public class VoidItem extends Item { + public VoidItem() { + super("Пустота", 0); // Вызов конструктора класса-родителя (класса Item) + } +} \ No newline at end of file diff --git a/VendingAppProject/src/Items/Cola.java b/VendingAppProject/src/Items/Cola.java new file mode 100644 index 0000000..5548fca --- /dev/null +++ b/VendingAppProject/src/Items/Cola.java @@ -0,0 +1,10 @@ + +import edu.androidclub.domain.Item; + +public class Cola extends Item { + + public Cola(int cost) { + super("Cola", cost); + } + +} \ No newline at end of file diff --git a/VendingAppProject/src/Items/Fanta.java b/VendingAppProject/src/Items/Fanta.java new file mode 100644 index 0000000..1fcc612 --- /dev/null +++ b/VendingAppProject/src/Items/Fanta.java @@ -0,0 +1,9 @@ +import edu.androidclub.domain.Item; + +public class Fanta extends Item { + + public Fanta(int cost) { + super("Fanta", cost); + } + +} \ No newline at end of file diff --git a/VendingAppProject/src/Items/Pulpy.java b/VendingAppProject/src/Items/Pulpy.java new file mode 100644 index 0000000..e7045c8 --- /dev/null +++ b/VendingAppProject/src/Items/Pulpy.java @@ -0,0 +1,10 @@ + +import edu.androidclub.domain.Item; + +public class Pulpy extends Item { + + public Pulpy(int cost) { + super("Pulpy", cost); + } + +} diff --git a/VendingAppProject/src/Items/Sprite.java b/VendingAppProject/src/Items/Sprite.java new file mode 100644 index 0000000..e18a440 --- /dev/null +++ b/VendingAppProject/src/Items/Sprite.java @@ -0,0 +1,9 @@ +import edu.androidclub.domain.Item; + +public class Sprite extends Item { + + public Sprite(int cost) { + super("Sprite", cost); + } + +} diff --git a/VendingAppProject/src/domain/AppScreen.java b/VendingAppProject/src/domain/AppScreen.java new file mode 100644 index 0000000..9a1a87a --- /dev/null +++ b/VendingAppProject/src/domain/AppScreen.java @@ -0,0 +1,10 @@ +package domain; + +/* +* Интерфейс, представляющий собой описание функционал экрана аппарата +* */ +public interface AppScreen { + /* void printText(String text); + void printItemInfo(Item item); + void clear();*/ +} \ No newline at end of file diff --git a/VendingAppProject/src/domain/Database.java b/VendingAppProject/src/domain/Database.java new file mode 100644 index 0000000..22ba71e --- /dev/null +++ b/VendingAppProject/src/domain/Database.java @@ -0,0 +1,11 @@ +import java.io.IOException; + +/* +* Класс, описывающий функционал базы данных - постоянного хранилища +* */ +public interface Database { + + ItemInfoScheme loadScheme() throws IOException; + void persistScheme(ItemInfoScheme scheme) throws IOException; + +} \ No newline at end of file diff --git a/VendingAppProject/src/domain/Item.java b/VendingAppProject/src/domain/Item.java new file mode 100644 index 0000000..09927b0 --- /dev/null +++ b/VendingAppProject/src/domain/Item.java @@ -0,0 +1,19 @@ + +package domain; + +// Абстрактный класс абстрактного предмета - ему нужна реализация в виде конкретных предметов +// Он тоже неизменяемый - т.к. все поля final +public abstract class Item { + private final String name; + private final float price; + + public Item(String name, float price) { + this.name = name; + this.price = price; + } + + // Получить имя + public String getName() {return name;} + + public float getPrice() {return price;} +} \ No newline at end of file diff --git a/VendingAppProject/src/domain/ItemBox.java b/VendingAppProject/src/domain/ItemBox.java new file mode 100644 index 0000000..9cc2c08 --- /dev/null +++ b/VendingAppProject/src/domain/ItemBox.java @@ -0,0 +1,14 @@ +package domain; + +import edu.androidclub.Coordinates; + +/* + Интерфейс, описывающий функционал (что умеет) нашей витрины (коробки с продуктами) +* */ +public interface ItemBox { + + /* Выдать предмет по его координатам */ + Item emit(Coordinates coordinates); + boolean Check(Coordinates coordinates); + +} \ No newline at end of file diff --git a/VendingAppProject/src/domain/Keypad.java b/VendingAppProject/src/domain/Keypad.java new file mode 100644 index 0000000..9f1be5f --- /dev/null +++ b/VendingAppProject/src/domain/Keypad.java @@ -0,0 +1,7 @@ +import edu.androidclub.Command; + +public interface Keypad { + + Command readCommand(); + +} \ No newline at end of file diff --git a/VendingAppProject/src/domain/MoneyReceiver.java b/VendingAppProject/src/domain/MoneyReceiver.java new file mode 100644 index 0000000..eb31e83 --- /dev/null +++ b/VendingAppProject/src/domain/MoneyReceiver.java @@ -0,0 +1,7 @@ +/* +* Класс, описывающий функционал приёмника денег +* */ +public interface MoneyReceiver { + int receiveMoney(int amount); + int returnMoney(int amount); +} \ No newline at end of file diff --git a/src/edu/androidclub/src/Application.java b/src/edu/androidclub/src/Application.java new file mode 100644 index 0000000..7d520a8 --- /dev/null +++ b/src/edu/androidclub/src/Application.java @@ -0,0 +1,106 @@ + +import edu.androidclub.domain.Item; +import edu.androidclub.domain.ItemBox; + +import java.util.Stack; + +/* + Главный класс нашей программы - представляет собой само приложение. + Реализуем интерфейс Runnable - обозачаем, что этот класс (наше приложение) ЗАПУСКАЕМО, + или имеет метод run() +*/ +public class Application implements Runnable { + + + /* + Храним статический экземпляр нашего приложения + */ + private static Application app; + + /* + Точка входа в ПРОГРАММУ + */ + public static void main(String[] args) { + // Создаем экземпляр приложения в статической переменной и запускаем его + app = new Application(); + app.run(); + } + + /* + С помощью этого метода мы в любом участке кода (тк public static) можем получить наше приложение, + причём полученный экземпляр будет ОДИНАКОВЫМ ДЛЯ КАЖДОГО ВЫЗОВА МЕТОДА + (паттерн Singleton) + */ + public static Application getInstance() { + if (app == null) { // Если не создан - создаём + app = new Application(); + } + return app; + } + + /* + Метод запуска приложения как объекта. Определён интерфейсом + */ + @Override + public void run() { + test(); + } + + /* + Метод тестирования нашего приложения. + Здесь мы создадим случайные данные о продуктах и заполним ими наш "автомат", чтобы протестировать то, что + уже написано + */ + private void test() { + // Создадим схему продуктов (пустую) + ItemInfoScheme itemScheme = new ItemInfoScheme(); + // Создадим наборы продуктов для ячеек схемы (пустые) + Stack colas = new Stack<>(); // 1 + Stack sprites = new Stack<>(); // 2 + + // Заполним наши наборы продуктами + colas.push(new Cola()); + colas.push(new Cola()); + colas.push(new Cola()); + sprites.push(new Sprite()); + sprites.push(new Sprite()); + + // Создадим объекты-координаты наших наборов продуктов в схеме + Coordinates colaCors = new Coordinates(1, 1); + Coordinates spriteCors = new Coordinates(1, 2); + + // Поместии наборы продуктов в схему + itemScheme.put(colaCors, colas); + itemScheme.put(spriteCors, sprites); + + // Создадим нашу витрину (коробку продуктов) на основании схемы + ItemBox itemBox = new ProductsBox(itemScheme); + + // Протестируем схему - заставим витрину выдавать объекты на заданных координатах + if (itemBox.Check(new Coordinates(1, 1))) + ScreenOutput.printItemInfo(itemBox.emit(new Coordinates(1, 1))); + + if (itemBox.Check(new Coordinates(1, 1))) + ScreenOutput.printItemInfo(itemBox.emit(new Coordinates(1, 1))); + + if (itemBox.Check(new Coordinates(1, 1))) + ScreenOutput.printItemInfo(itemBox.emit(new Coordinates(1, 1))); + + if (itemBox.Check(new Coordinates(1, 1))) + ScreenOutput.printItemInfo(itemBox.emit(new Coordinates(1, 1))); + } + + // Опишем Колу как подкласс Предмета + public static class Cola extends Item { + public Cola() { + super("Cola",50); // Вызов конструктора класса-родителя (класса Item) + } + } + + // Опишем Спрайт как подкласс Предмета + public static class Sprite extends Item { + public Sprite() { + super("Sprite",60); + } + } +} \ No newline at end of file diff --git a/src/edu/androidclub/src/Command.java b/src/edu/androidclub/src/Command.java new file mode 100644 index 0000000..9d2f1f6 --- /dev/null +++ b/src/edu/androidclub/src/Command.java @@ -0,0 +1,27 @@ +public class Command { + public static final String TYPE_GET = "get"; + public static final String TYPE_STOP = "stop"; + + private final String type; + private final Object data; + + public Command(String type, Object data) { + this.type = type; + this.data = data; + } + + public String getType() { + return type; + } + + public Object getData() { + return data; + } + + @Override + public String toString() { + return "Command: { type = " + type + + ", data = " + data + + " }"; + } +} \ No newline at end of file diff --git a/src/edu/androidclub/src/ConsoleInput.java b/src/edu/androidclub/src/ConsoleInput.java new file mode 100644 index 0000000..b181ff5 --- /dev/null +++ b/src/edu/androidclub/src/ConsoleInput.java @@ -0,0 +1,57 @@ + +import edu.androidclub.domain.Keypad; +import org.omg.CORBA.CODESET_INCOMPATIBLE; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; + +public class ConsoleInput implements Keypad { + + @Override + public Command readCommand() { + InputStream in = System.in; + InputStreamReader reader = new InputStreamReader(in); + BufferedReader bufferedReader = new BufferedReader(reader); + String line = ""; + try { + line = bufferedReader.readLine(); + } catch (IOException ioex) { + System.err.println(ioex.toString()); + System.exit(0); + } + return getCommandByString(line); + } + + private Command getCommandByString(String input) { + Command result = null; + String trimInput = input.trim(); + + String[] elements = trimInput.split(" "); + + String typeStr = elements[0]; + + if (typeStr.equals(Command.TYPE_GET)) { + String dataStr = elements[1]; + + int data = Integer.valueOf(dataStr); + int x = data / 10; + int y = data % 10; + + result = new Command( + Command.TYPE_GET, + new Coordinates(x, y) + ); + } + if (typeStr.equals(Command.TYPE_STOP)) { + result = new Command( + Command.TYPE_STOP, + null + ); + } + + return result; + } + +} \ No newline at end of file diff --git a/src/edu/androidclub/src/ConsoleScreen.java b/src/edu/androidclub/src/ConsoleScreen.java new file mode 100644 index 0000000..a842a76 --- /dev/null +++ b/src/edu/androidclub/src/ConsoleScreen.java @@ -0,0 +1,23 @@ +import edu.androidclub.domain.AppScreen; + +import java.io.PrintStream; + +public class ConsoleScreen implements AppScreen { + + private static final String LINE_BORDER = "###"; + + private final PrintStream ps = System.out; + + @Override + public void printText(String text) { + ps.println(LINE_BORDER + " " + text + " " + LINE_BORDER); + } + + @Override + public void clear() { + for (int i = 0; i < 15; i++) { + ps.println(); + } + } + +} diff --git a/src/edu/androidclub/src/Coordinates.java b/src/edu/androidclub/src/Coordinates.java new file mode 100644 index 0000000..f1bf9a8 --- /dev/null +++ b/src/edu/androidclub/src/Coordinates.java @@ -0,0 +1,13 @@ + +import edu.androidclub.domain.Item; + +import java.util.HashMap; +import java.util.Stack; + +/* + Класс, представляющий собой схему наших предметов на витрине. + Наследуем его от *то, что после extends*, чтобы каждый раз не писать это *то, что после extends* + HashMap - хеш-карта - хранилище вида ключ->значение +* */ +public class ItemInfoScheme extends HashMap> { +} \ No newline at end of file diff --git a/src/edu/androidclub/src/Items/Cola.java b/src/edu/androidclub/src/Items/Cola.java new file mode 100644 index 0000000..5548fca --- /dev/null +++ b/src/edu/androidclub/src/Items/Cola.java @@ -0,0 +1,10 @@ + +import edu.androidclub.domain.Item; + +public class Cola extends Item { + + public Cola(int cost) { + super("Cola", cost); + } + +} \ No newline at end of file diff --git a/src/edu/androidclub/src/Items/Fanta.java b/src/edu/androidclub/src/Items/Fanta.java new file mode 100644 index 0000000..1fcc612 --- /dev/null +++ b/src/edu/androidclub/src/Items/Fanta.java @@ -0,0 +1,9 @@ +import edu.androidclub.domain.Item; + +public class Fanta extends Item { + + public Fanta(int cost) { + super("Fanta", cost); + } + +} \ No newline at end of file diff --git a/src/edu/androidclub/src/Items/Pulpy.java b/src/edu/androidclub/src/Items/Pulpy.java new file mode 100644 index 0000000..e7045c8 --- /dev/null +++ b/src/edu/androidclub/src/Items/Pulpy.java @@ -0,0 +1,10 @@ + +import edu.androidclub.domain.Item; + +public class Pulpy extends Item { + + public Pulpy(int cost) { + super("Pulpy", cost); + } + +} diff --git a/src/edu/androidclub/src/Items/Sprite.java b/src/edu/androidclub/src/Items/Sprite.java new file mode 100644 index 0000000..e18a440 --- /dev/null +++ b/src/edu/androidclub/src/Items/Sprite.java @@ -0,0 +1,9 @@ +import edu.androidclub.domain.Item; + +public class Sprite extends Item { + + public Sprite(int cost) { + super("Sprite", cost); + } + +} diff --git a/src/edu/androidclub/src/ProductsBox.java b/src/edu/androidclub/src/ProductsBox.java new file mode 100644 index 0000000..e6e2d47 --- /dev/null +++ b/src/edu/androidclub/src/ProductsBox.java @@ -0,0 +1,39 @@ + +import edu.androidclub.domain.Item; +import edu.androidclub.domain.ItemBox; + +import java.util.Stack; + +/* + Реализация витрины аппарата +* */ +public class ProductsBox implements ItemBox { + + private ItemInfoScheme scheme; + + // Требует схему при создании + public ProductsBox(ItemInfoScheme scheme) { + this.scheme = scheme; + } + + // Выдать предмет по координатам + @Override + public Item emit(Coordinates coordinates) { + // Получить стопку предметов на позиции + Stack items = scheme.get(coordinates); + + // Если пусто - возвращаем пустоту + return items.pop(); + } + + public boolean Check(Coordinates coordinates) { + Stack items = scheme.get(coordinates); + if (items.empty()) { + return false; + } + return true; + } +} + + + diff --git a/src/edu/androidclub/src/Screen.java b/src/edu/androidclub/src/Screen.java new file mode 100644 index 0000000..dcefe94 --- /dev/null +++ b/src/edu/androidclub/src/Screen.java @@ -0,0 +1,116 @@ +import edu.androidclub.domain.AppScreen; + +import java.util.StringJoiner; + +/** + * Created by WinDA on 22.11.2016. + */ +public class Screen implements AppScreen{ + String notice; + + public Screen(){ + setNotice("Купи еду"); + } +/* + [Сообщение] + |----------|----------| + |Спрайт[65]| | + |----------|----------| + |Фанта[55] | | + |----------|----------| + */ + + @Override + public void update(ItemInfoScheme scheme) { + clear(); + System.out.println(getNotice()); // Текст сверху + + // Определяем размеры прямоугольника и ячейки + int maxRow = 0; + int maxCol = 0; + int minRow = 0; + int minCol = 0; + int maxLength = 1; + for(Coordinates i: scheme.keySet()){ + // ищем наибольшую и наименьшую Y + if(i.getColumn() > maxCol){ + maxCol = i.getColumn(); + } + else if(i.getColumn() < minCol){ + minCol = i.getColumn(); + } + + // ищем наибольший и наименьший X + if(i.getRow() > maxRow){ + maxRow = i.getRow(); + } + else if(i.getRow() < minRow){ + minRow = i.getRow(); + } + + if(scheme.get(i) != null && scheme.get(i).size() > 0){ + if(scheme.get(i).lastElement().getName().length() > maxLength){ + maxLength = scheme.get(i).lastElement().getName().length(); + } + } + } + + maxLength += 10; // Добавить места для цены и количества + + String emptyCell = multiply(" ", maxLength); + + // Начинаем рисование + String barrier = "|" + multiply("-", maxLength); + System.out.print(multiply(barrier, maxCol - minCol)); + System.out.println("|"); + for(int i = minRow; i <= maxRow; i++){ + for(int j = minCol; j <= maxCol; j++){ + System.out.print("|"); + + Coordinates coordinates = new Coordinates(i, j); + + if(scheme.get(coordinates) != null && scheme.get(coordinates).size() > 0){ + String name = scheme.get(coordinates).lastElement().getName(); + int cost = scheme.get(coordinates).lastElement().getCost(); + int amount = scheme.get(coordinates).size(); + + //Это костыль для красоты + int s1 = ("" + cost).length(); + int s2 = ("" + amount).length(); + + System.out.print(name + "[" + cost + "]" + "(" + amount + ")" + multiply(" ", maxLength - name.length() - 4 - s1 - s2)); + } + else{ + System.out.print(emptyCell); + } + } + System.out.println("|"); + System.out.print(multiply(barrier, maxCol - minCol)); + System.out.println("|"); + } + } + + @Override + public void setNotice(String text) { + this.notice = " [" + text + "]"; + } + + @Override + public String getNotice() { + return this.notice; + } + + @Override + public void clear() { + System.out.println("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"); + } + + private String multiply(String s, int amount){ + String res = new String(s); + for(int j = 0; j < amount; j++){ + res = res + s; + } + return res.toString(); + } + +} \ No newline at end of file diff --git a/src/edu/androidclub/src/ScreenInput.java b/src/edu/androidclub/src/ScreenInput.java new file mode 100644 index 0000000..af0162f --- /dev/null +++ b/src/edu/androidclub/src/ScreenInput.java @@ -0,0 +1,40 @@ +import edu.androidclub.domain.Item; + +public class ScreenInput +{ + static public void clear() + { + for (int i=0; i<50 ; i++) + System.out.println(); + } + + static public void printItemInfo(Item item) + { + System.out.print("| № "+item.getNumber()); + System.out.println(Spaces(18-Integer.toString(item.getNumber()).length())+'|'); + System.out.print("| Товар: "+item.getName()); + System.out.println(Spaces(18-item.getName().length())+'|'); + System.out.print("| Цена: "+item.getPrice()); + System.out.println(Spaces(18-Float.toString(item.getPrice()).length())+'|'); + System.out.println("+--------------------------------+"); + } + + static private String Spaces(int n) + { + String s = new String(); + for (int i=0;i