Пројектовање софтвера/К1 2024
Први колоквијум 2024. године одржан је 27. октобра 2024. године. Биле су доступне презентације о свим пројектним обрасцима, као и Java документација. Време за израду је било 120 минута. Текстови задатака нису са оригиналног теста већ су препричани. За сваки задатак потребно је доставити Java фајлове и текстуални фајл који садржи опис пројектних узорака и улога њихових учесника.
1. задатак
Поставка
Направити програм за рад са сликама. Слика је дефинисана као низ пиксела, где се сваки пиксел састоји од три целобројне вредности (R, G и B), с тим да су сви бројеви у опсегу од 0 до 255. Имплементација пиксела приказана је у следећој класи:
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;
}
}
Kорисник може читати пикселе са слике и додавати произвољан број филтера слици, али тако да разлика између обичне слике и слике са примењеним филтерима није видљива кориснику. Потребно је имплементирати два конкретна филтера:
Greyscale: R, G, B = 0.2 * R + 0.5 * G + 0.3 * B
Inverse: R = 255 - R, G = 255 - G, B = 255 - B
Потребно је написати пример сарадње ових класа. На произвољну слику треба применити оба филтера, Greyscale и Inverse, и исписати све пикселе након примене филтера.
Решење
Сарадња
У овом задатку потребно је користити узорак Декоратер, а у изради се користио и узорак Шаблонски метод.
- Декоратер
- Учесници:
- Компонента (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 тако што ћете га решити.
Поставка
Разматра се карташка игра са следећим правилима: пре почетка игре, играчи се могу пријавити, а по завршетку игре могу се одјавити. Играчи не комуницирају међусобно, већ само са крупијеом. Због малог броја играча, синхронизација у комуникацији им не представља проблем. Када игра започне, крупије дели сваком играчу по две карте (које види само тај играч). Затим крупије открива једну карту коју сви играчи виде и, на основу те карте, остали играчи полажу улоге. Неки играчи имају агресивнији приступ, док су други резервисанији. Понашање играча може се прилагођавати.
Крупије потом открива још једну карту, а играчи поново улажу. Овај процес се понавља укупно пет пута, након чега се бира победник који узима сав новац. Начин избора победника такође се може мењати, али та логика није релевантна за ову апликацију.