Пројектовање софтвера/К1 2024
Први колоквијум 2024. године одржан је 27. октобра 2024. године. Биле су доступне презентације о свим пројектним обрасцима, као и Java документација. Време за израду је било 120 минута.
1. задатак
Поставка
Посматра се систем за приказ и обраду дигиталних слика. Треба обезбедити то да се на оригиналну слику може применити произвољан број филтера (или ниједан), у произвољном редоследу, при чему остатак система који приказује и користи слику (“клијент”) не треба да види разлику у односу на то да ли су на слику примењени филтери или нису. Свака слика садржи низ пиксела. Пиксел има R, G и B компоненте (интензитет црвене, зелене и плаве боје), где свака има целобројну вредност од 0 до 255. Филтери који могу да се примене у овом систему су за сада (касније могу бити осмишљени и додати нови филтери):
- Greyscale – сваки пиксел се претвара у одговарајућу нијансу сиве, где се R, G и B компоненте рачунају по следећој формули:
R, G, B = 0.3 * R + 0.59 * G + 0.11 * B - Invert – R, G и B компоненте сваког пиксела се инвертују по следећој формули:
R = 255 – R, G = 255 – G, B = 255 – B
Клијент који користи слику може да прочита вредности њених пиксела; уколико су на слику примењени филтери, то су вредности пиксела оригиналне слике измењене дејством додатих филтера (у случају да ниједан филтер није примењен над оригиналном сликом, враћа се неизмењен низ пиксела оригиналне слике). Коришћењем пројектног обрасца Декоратер (Decorator) потребно је имплементирати описани део система и навести расподелу улога из обрасца класама у овом решењу; опис дати у текстуалном фајлу z1.txt.
Написати пример коришћења дате сарадње. Направити слику са филтерима Greyscale и Invert, са неким насумичним вредностима пиксела, а затим дохватити пикселе такве слике и исписати их. Имплементација пиксела приказана је у следећој класи:
package zad1;
public class Pixel {
private int R, G, B;
public Pixel(int R, int G, int B) {
this.R = R;
this.G = G;
this.B = B;
}
public int getR() {
return R;
}
public void setR(int R) {
this.R = R;
}
public int getG() {
return G;
}
public void setG(int G) {
this.G = G;
}
public int getB() {
return B;
}
public void setB(int B) {
this.B = B;
}
}
Решење
Сарадња
У овом задатку потребно је користити узорак Декоратер, а у изради се користио и узорак Шаблонски метод.
- Декоратер
- Учесници:
- Компонента (Picture)
- Субјекат (RawPicture)
- Допуна (Filter)
- КонкретнаДопуна (Greyscale, Inverse)
- Шаблонски метод
- Учесници:
- АпстрактнаКласа (Filter)
- КонкретнаКласа (Greyscale, Inverse)
Picture.java
package zad1;
import java.util.List;
public abstract class Picture {
protected List<Pixel> pixels;
public List<Pixel> getPixels() {
return pixels;
}
}
RawPicture.java
package zad1;
import java.util.List;
public class RawPicture extends Picture {
public RawPicture(List<Pixel> pixels) {
this.pixels = pixels;
}
}
Filter.java
package zad1;
import java.util.ArrayList;
import java.util.List;
public abstract class Filter extends Picture {
public Filter(Picture picture) {
pixels = new ArrayList<Pixel>();
for (Pixel pixel : picture.getPixels()) {
pixels.add(applyFilter(pixel));
}
}
public abstract Pixel applyFilter(Pixel pixel);
}
Greyscale.java
package zad1;
public class Greyscale extends Filter {
public Greyscale(Picture picture) {
super(picture);
}
@Override
public Pixel applyFilter(Pixel pixel) {
int color = (int) (pixel.getR() * 0.2 + pixel.getG() * 0.5 + pixel.getB() * 0.3);
return new Pixel(color, color, color);
}
}
Inverse.java
package zad1;
public class Inverse extends Filter {
public Inverse(Picture picture) {
super(picture);
}
@Override
public Pixel applyFilter(Pixel pixel) {
return new Pixel(255 - pixel.getR(), 255 - pixel.getG(), 255 - pixel.getB());
}
}
Main.java
package zad1;
import java.util.Arrays;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<Pixel> pixels = Arrays.asList(new Pixel(100, 0, 50), new Pixel(255, 255, 0), new Pixel(0, 255, 0));
Picture raw = new RawPicture(pixels);
Picture picture = new Greyscale(new Inverse(raw));
for (Pixel pixel : picture.getPixels()) {
System.out.println("R = " + pixel.getR() + "\tG = " + pixel.getG() + "\tB = " + pixel.getB());
}
}
}
2. задатак
- Овај задатак није решен. Помозите SI Wiki тако што ћете га решити.
Поставка
Посматра се део система који симулира карташку игру. Пре почетка игре, играчи могу да се пријаве делиоцу карата („крупијеу“) за учествовање у игри и могу да се одјаве након завршене игре. Игра се игра тако да у њој може учествовати различит број играча и током игре играчи не разговарају један са другим. Број играча је увек довољно мали да је са њима прихватљива синхрона комуникација. Након што се игра покрене, сваки играч од крупијеа добија по две насумичне карте (којих је само он свестан). Потом крупије открива једну од преосталих карата и сви играчи се обавештавају о карти која је откривена. На основу ових информација, сваки играч може да одлучи колико ће новца уложити. Неки играчи играју агресивно, а неки штедљиво; начин играња може да се конфигурише за сваког играча различито, при чему се предвиђа осмишљавање нових различитих начина игре, па различити играчи са истим информацијама улажу различиту количину новца. Након што сви играчи уложе свој новац, следи поново откривање нове карте око које се играчи обавештавају и након чега сваки може поново да уложи новац. Ово се понавља пет пута по игри, на крају чега играч са најбољом комбинацијом карата добија сав новац и игра се завршава. Логика одабира победника се такође може мењати од игре до игре, мада конкретна имплементација ове логике није од интереса за овај задатак.
Дорадити и исправити дату имплементацију система коришћењем одговарајућих пројектних образаца. Навести све примене пројектних образаца у систему са кратким образложењем у текстуалном фајлу z2.txt (једна до две реченице).