Skip to content
Open

wtf #10

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
106 changes: 106 additions & 0 deletions VendingAppProject/Application.java
Original file line number Diff line number Diff line change
@@ -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<Item> colas = new Stack<>(); // 1
Stack<Item> 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);
}
}
}
27 changes: 27 additions & 0 deletions VendingAppProject/Command.java
Original file line number Diff line number Diff line change
@@ -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
+ " }";
}
}
57 changes: 57 additions & 0 deletions VendingAppProject/ConsoleInput.java
Original file line number Diff line number Diff line change
@@ -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;
}

}
23 changes: 23 additions & 0 deletions VendingAppProject/ConsoleScreen.java
Original file line number Diff line number Diff line change
@@ -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();
}
}

}
13 changes: 13 additions & 0 deletions VendingAppProject/Coordinates.java
Original file line number Diff line number Diff line change
@@ -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<Coordinates, Stack<Item>> {
}
39 changes: 39 additions & 0 deletions VendingAppProject/ProductsBox.java
Original file line number Diff line number Diff line change
@@ -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<Item> items = scheme.get(coordinates);

// Если пусто - возвращаем пустоту
return items.pop();
}

public boolean Check(Coordinates coordinates) {
Stack<Item> items = scheme.get(coordinates);
if (items.empty()) {
return false;
}
return true;
}
}



116 changes: 116 additions & 0 deletions VendingAppProject/Screen.java
Original file line number Diff line number Diff line change
@@ -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();
}

}
Loading