Assignment 1

Your task is to develop the core of a simplified "Sleeping Queens" game. You can find the rules of the game here. To make things a bit easier, we modify rules as follows:
  1. No "Jester" card.
  2. No queen special effects.
  3. Upon playing "Knight" or "Sleeping potion", if targeted player has the corresponding defensive card, then the game plays it automatically. This makes the game state machine much more simple.
I prepared a design outline (previous iteration). Note that this is not a full design. The point is to specify what are the responsibilities of each class. It is up to you add all necessary constructors, interfaces, etc. to make the design good for the purpose. Note also, that there are probably some flaws, I have done only limited amount of exploratory testing of the design as of now. If you encounter some issue, write me a message (use the ordinary address, not the one used to submit solutions).

To implement the solution you can use Java or Python. If you use Python, YOU HAVE TO USE TYPE ANNOTATIONS (integrate mypy into your development). Use last year assignment 1 materials as a template for your project.


Further requirements Send your solution to lukotka.pts@gmail.com. The first deadline is 6.12.2022 23:59:59. The deadline for reviewed solution is 9.12.2022 23:59:59. The solutions sent later will be accepted, however the number of points awarded may be reduced.

The following paragraph is only a recommendation:

The assignment is of a larger scope that the ones that you are used to. Do not expect to finish it in a single evening. Try to work in an organised manner. The task is not hard at all, try to adjust your working habits to make the work as easy as possible. The design allow for easy division of labour (provided that you separate certain dependencies with an interface). Use this to divide your work into multiple smaller time slots. Explore habits that allow you to split your work without too much overhead.
>   1.  Má trieda Position byť tagged union?
Ma to byt zjednotenie dvoch troch typov (idealne typovo bezpecne.)
V Pythone to najlahsie dosiahnete typovou anotaciou typing.Union. V Jave ... pozeram, ze Java sa k takymto veciam este nedostala (nie je to prilis OO konstrukt). Osobne by som napisal vlastnu malu triedu s private atributami Optional[HandPosition], Optional[SleepingQueenPosition], Optional[AwokenQueenPosition], troma konstruktormi, a troma gettermi. Urcite sa da nieco poriesit aj pomocou castenia a instanceof.

>   2.  Majú byť pri vyhadzovaní rovníc kariet akceptované iba karty v
> správnom poradí alebo v ľubovoľnom? (e. g. majú byť karty v poradí 2, 3,
> 1 akceptované alebo nie?)
Myslene to bolo v lubovolnom. Nie je to obzvlast dolezite.

>   3.  Môžu hráči vytvárať rovnicu s viac ako jedným členom na pravej
> strane? (e. g. 2 + 3  = 1 + 4)
Nie.

>   4.  V triede GameObservable je funkcia addPlayer(), ale nikde nie je
> uvedené, čo má s hráčmi  robiť. V čom je to iné ako použiť funkciu
> add()?
Hra vie, ze je to hrac. Ked vsetkych notifikuje, observer, ktory su hraci 
vidia to co maju vidiet (svoje karty ano, superove nie).

>   5.  Na čo presne slúžia GameObserver a GameObservable? Je to iba na
> výpisy hodnôt?
Implementuje to observer pattern. Sluzi to na to, aby sa klientsky
komponent vedel dostavat notifikacie ked napr. iny hrac zahra kartu.

>   6.  Kvôli čomu je vo funkcii play v GamePlayerInterface argument String
> player?
Separacia interfacu a implementacie. Z vonku moze prist hrac
identifikovany inak ako je vo vnutri systemu (vo vnutri sistemu je hrac
idetifikovany svojim indexom). Navonok, moze byt hrac nieco ine. Moze tam
bit nejaky session token, login, a podobne. Trieda na hranici tohoto
podsystemu pretransformuje externu reprezentaciu na internu reprezentaciu
(Adaptor pattern)

>   7.  Môžem predpokladať, že pozície spiacich kráľovien sú 1-12, kariet na
> ruke hráča 1-5 a podobne alebo musím rátať s možnosťou, že tieto pozície
> sú ľubovoľné?
Ano.

>   8.  Nie je mi jasný celý mechanizmus okolo používania útočných kariet a
> presúvania kráľovien. Môže Game zavolať play() aj viackrát za jeden ťah?
> Ak nie a ktorého hráča referuje argument playerIdx?
Hrac ktory je na tahu a chce zahrat utocu kartu zavola play s argumentom
cards napr: h5 a12. Piata karta z jeho ruky je napr rytier a cieli na
druhu princeznu prveho hraca. Hra skontroluje, ci prvy hrac ma druhu
princeznu, ak ano, pozre sa do ruky prveho hraca, ci ma obrannu kartu
(Draka). Ak ma,utocna aj obranna karta budu zahodene a hraci si dotiahnu
karty do 5, ak nema utocna karta bude zahodena, kralovna sa presunie
utociacemu hracovi a hrac dotiahne kartu.

>   9.  Ako získavajú EvaluateAttack a triedy implementujúce
> AttackEffectStrategy prístup k potrebným triedam iných hráčov?
Tu som opravil issues v dizajne. Potom sa to cele aj pekne zjednodusilo.
okrem toho, ze som zabudol na EvaluateKing, pomixoval som dva cca funkcne 
pristupy do jedneho nefunkcneho.

>   10. Ako prebieha presúvanie kráľovny po použití kráľa/útočnej karty?
Upravil som dizajn. Player je zodpovedny za karty z ruky. O kralovne sa 
postaraju vyhodnocovacie triedy.