Projektovanje softvera/K1 2024

Izvor: SI Wiki
Pređi na navigaciju Pređi na pretragu

Prvi kolokvijum 2024. godine održan je 27. oktobra 2024. godine. Bile su dostupne prezentacije o svim projektnim obrascima, kao i Java dokumentacija. Vreme za izradu je bilo 120 minuta. Tekstovi zadataka nisu sa originalnog testa već su prepričani. Za svaki zadatak potrebno je dostaviti Java fajlove i tekstualni fajl koji sadrži opis projektnih uzoraka i uloga njihovih učesnika.

1. zadatak

Postavka

Napraviti program za rad sa slikama. Slika je definisana kao niz piksela, gde se svaki piksel sastoji od tri celobrojne vrednosti (R, G i B), s tim da su svi brojevi u opsegu od 0 do 255. Implementacija piksela prikazana je u sledećoj klasi:

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;
    }
}

Korisnik može čitati piksele sa slike i dodavati proizvoljan broj filtera slici, ali tako da razlika između obične slike i slike sa primenjenim filterima nije vidljiva korisniku. Potrebno je implementirati dva konkretna filtera:

Greyscale: R, G, B = 0.2 * R + 0.5 * G + 0.3 * B

Inverse: R = 255 - R, G = 255 - G, B = 255 - B

Potrebno je napisati primer saradnje ovih klasa. Na proizvoljnu sliku treba primeniti oba filtera, Greyscale i Inverse, i ispisati sve piksele nakon primene filtera.

Rešenje

Saradnja

U ovom zadatku potrebno je koristiti uzorak Dekorater, a u izradi se koristio i uzorak Šablonski metod.

Dekorater
Učesnici:
  • Komponenta (Picture)
  • Subjekat (RawPicture)
  • Dopuna (Filter)
  • KonkretnaDopuna (Greyscale, Inverse)
Šablonski metod
Učesnici:
  • ApstraktnaKlasa (Filter)
  • KonkretnaKlasa (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. zadatak

Ovaj zadatak nije rešen. Pomozite SI Wiki tako što ćete ga rešiti.

Postavka

Razmatra se kartaška igra sa sledećim pravilima: pre početka igre, igrači se mogu prijaviti, a po završetku igre mogu se odjaviti. Igrači ne komuniciraju međusobno, već samo sa krupijeom. Zbog malog broja igrača, sinhronizacija u komunikaciji im ne predstavlja problem. Kada igra započne, krupije deli svakom igraču po dve karte (koje vidi samo taj igrač). Zatim krupije otkriva jednu kartu koju svi igrači vide i, na osnovu te karte, ostali igrači polažu uloge. Neki igrači imaju agresivniji pristup, dok su drugi rezervisaniji. Ponašanje igrača može se prilagođavati.

Krupije potom otkriva još jednu kartu, a igrači ponovo ulažu. Ovaj proces se ponavlja ukupno pet puta, nakon čega se bira pobednik koji uzima sav novac. Način izbora pobednika takođe se može menjati, ali ta logika nije relevantna za ovu aplikaciju.

Rešenje