Пројектовање софтвера/К1 2024 — разлика између измена
| Ред 82: | Ред 82: | ||
package z1; | package z1; | ||
import java.util.ArrayList; | |||
import java.util.List; | import java.util.List; | ||
public class RawImage | public class RawImage implements Image { | ||
protected List<Pixel> pixels = new ArrayList<Pixel>(); | |||
public RawImage(List<Pixel> pixels) { | public RawImage(List<Pixel> pixels) { | ||
this.pixels = pixels; | this.pixels = pixels; | ||
} | |||
@Override | |||
public List<Pixel> getPixels() { | |||
return pixels; | |||
} | } | ||
} | } | ||
Верзија на датум 30. новембар 2025. у 13:11
Први колоквијум 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;
}
}
Решење
Сарадња
У овом задатку потребно је користити узорак Декоратер, а у изради се користио и узорак Шаблонски метод.
- Декоратер
- Учесници:
- Компонента (Image)
- Субјекат (RawImage)
- Допуна (Filter)
- КонкретнаДопуна (Greyscale, Inverse)
- Шаблонски метод
- Учесници:
- АпстрактнаКласа (Filter)
- КонкретнаКласа (Greyscale, Inverse)
Image.java
package z1;
import java.util.ArrayList;
import java.util.List;
public abstract class Image {
public List<Pixel> getPixels() {}
}
RawImage.java
package z1;
import java.util.ArrayList;
import java.util.List;
public class RawImage implements Image {
protected List<Pixel> pixels = new ArrayList<Pixel>();
public RawImage(List<Pixel> pixels) {
this.pixels = pixels;
}
@Override
public List<Pixel> getPixels() {
return pixels;
}
}
Filter.java
package z1;
import java.util.ArrayList;
import java.util.List;
public abstract class Filter extends Image{
private Image image; //image that we wrap/decorate
public Filter(Image image){
this.image = image;
}
protected abstract Pixel modifyPixel(Pixel p);
private List<Pixel> applyFilter(List<Pixel> pixels){
List<Pixel> modifiedPixels = new ArrayList<Pixel>();
for (Pixel pixel : pixels){
modifiedPixels.add(modifyPixel(pixel));
}
return modifiedPixels;
}
@Override
public List<Pixel> getPixels() {
return applyFilter(this.image.getPixels());
}
}
Greyscale.java
package z1;
public class Greyscale extends Filter{
public Greyscale(Image i) {
super(i);
}
@Override
protected Pixel modifyPixel(Pixel p){
int grey = (int) (p.getR()*0.3) + (int) (p.getG()*0.59) + (int) (p.getB()*0.11);
return new Pixel(grey, grey, grey
);
}
}
Invert.java
package z1;
public class Invert extends Filter {
public Invert(Image i) {
super(i);
}
private final int invertFactor = 255;
protected Pixel modifyPixel(Pixel p) {
return new Pixel(
invertFactor - p.getR(),
invertFactor - p.getG(),
invertFactor - p.getB()
);
}
}
Main.java
package z1;
import java.util.Arrays;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<Pixel> pixels = Arrays.asList(new Pixel(2, 2, 2), new Pixel(2, 3, 4), new Pixel(100, 200, 255));
Image myImage = new RawImage(pixels);
for (Pixel p : myImage.getPixels()) {
System.out.println(p.toString());
}
Image myFilteredImage = new Invert(new Greyscale(myImage));
for (Pixel p : myFilteredImage.getPixels()) {
System.out.println(p.toString());
}
}
}
2. задатак
- Овај задатак није решен. Помозите SI Wiki тако што ћете га решити.
Поставка
Посматра се део система који симулира карташку игру. Пре почетка игре, играчи могу да се пријаве делиоцу карата („крупијеу“) за учествовање у игри и могу да се одјаве након завршене игре. Игра се игра тако да у њој може учествовати различит број играча и током игре играчи не разговарају један са другим. Број играча је увек довољно мали да је са њима прихватљива синхрона комуникација. Након што се игра покрене, сваки играч од крупијеа добија по две насумичне карте (којих је само он свестан). Потом крупије открива једну од преосталих карата и сви играчи се обавештавају о карти која је откривена. На основу ових информација, сваки играч може да одлучи колико ће новца уложити. Неки играчи играју агресивно, а неки штедљиво; начин играња може да се конфигурише за сваког играча различито, при чему се предвиђа осмишљавање нових различитих начина игре, па различити играчи са истим информацијама улажу различиту количину новца. Након што сви играчи уложе свој новац, следи поново откривање нове карте око које се играчи обавештавају и након чега сваки може поново да уложи новац. Ово се понавља пет пута по игри, на крају чега играч са најбољом комбинацијом карата добија сав новац и игра се завршава. Логика одабира победника се такође може мењати од игре до игре, мада конкретна имплементација ове логике није од интереса за овај задатак.
Дорадити и исправити дату имплементацију система коришћењем одговарајућих пројектних образаца. Навести све примене пројектних образаца у систему са кратким образложењем у текстуалном фајлу z2.txt (једна до две реченице).