SIKPRO.rst

Sieci Komputerowe

PROJEKT

Sieciowa implementacja uproszczonej wersji gry King Domino

Projektem jest stworzenie serwera i klienta dla uproszczonej wersji gry King Domino.

Uwaga!! Nasze zasady będą uproszczone.

Celem gry jest ułożenie płytek domina w taki sposób, aby stworzyć królestwo, który przyniesie ci najwięcej punktów prestiżu. Punkty prestiżu otrzymuje się poprzez tworzenie jak największych spójnych obszarów jednego z sześciu typów (las, pole, pustynia, bagno, woda, kopalnia). Liczba punktów jest sumą iloczynów rozmiarów spójnych obszarów jednego typu pomnożona przez (1 + liczba koronek w tym obszarze) (niektóre z domin zawierają także koronki). W każdej rundzie losujemy 4 płytki domina i gracze w kolejności decydują, które domino chcą dołączyć do swojego królestwa. Domina mają numery i są oferowane od najmniejszego do największego domina. W kolejnej rundzie osoba, która wybrała domino o najmniejszym numerze poprzednio zaczyna wybierać kolejne domino, druga jest osoba, która wybrała kolejne domino o najmniejszym numerze itd. Każdy gracz zaczyna z zajętym pole o współrzędnych (0,0) i może dokładać domino w dowolne miejsce, z zastrzeżeniem, że musi się ono stykać jedną ze ścian z istniejącym już królestwem (w naszej wersji nie ma innych ograniczeń). Gracze mogą dołożyć domino do istniejącego królestwa w ułożeniu wejściowym, obrócone o 90,180 lub 270 stopni. Gra kończy się po wyczerpaniu wszystkich domin (a jest ich 48), wtedy podliczane są punkty i wygrywa ten, który ma ich najwięcej.

W każdej grze brać udział ma dokładnie 4 graczy. Gra rozpoczyna się w momencie przesłania poprawnej komendy LOGIN do serwera przez 4 gracza.

Gra odbywa się w 12 rundach (aż do wyczerpania domin). W każdej z rund serwer losuje 4 domina ze zbioru nieużytych domin, a gracze wybierają je dla siebie układając swoje królestwa na zasadzie łączenia domin (ustawiania ich koło siebie).

Lista domin:

a1

Typy: f - forest(las), g - grass (pole), s - sand (pustynia), b - bog (bagno), w - water (woda), m - mine (kopalnia), numer oznacza liczbę koronek na dominie:

1: s s

2: s s

3: f f

4: f f

5: f f

6: f f

7: w w

8: w w

9: w w

10: g g

11: g g

12: b b

13: s f

14: s w

15: s g

16: s b

17: f w

18: f g

19: s1 f

20: s1 w

21: s1 g

22: s1 b

23: s1 m

24: f1 s

25: f1 s

26: f1 s

27: f1 s

28: f1 w

29: f1 g

30: w1 s

31: w1 s

32: w1 f

33: w1 f

34: w1 f

35: w1 f

36: s g1

37: w g1

38: s b1

39: g b1

40: m1 s

41: s g2

42: w g2

43: s b2

44: g b2

45: m2 s

46: b m2

47: b m2

48: s m3

Wyjaśnienie punktacji (rys. Adrian Antkowiak) :

a11

Wyjaśnienie orientacji, zakładamy, że wszędzie domino zostało położone na pole x=4, y=4, (rys. Adrian Antkowiak) :

a12

Komunikacja między serwerem a klientem gry odbywa się przy wykorzystaniu poniższego protokołu:

Serwer każdą poprawną komendę potwierdza komunikatem OK, każdą niepoprawną oznacza wysyłając komunikat ERROR.

Protokół:

Uwaga! oznaczenia S: i C: NIE stanowią części protokoły i mają na celu jedynie pokazanie która ze stron wysyła zadany komunikat.

W momencie ustanowienia nowego połączenia serwer przesyła do użytkownika komunikat (nie używamy polskich znaków!!).

S: CONNECT

Przed włączeniem się do gry każdy gracz musi się "zalogować" podając swój login (niepusty ciąg znaków, bez spacji - najlepiej numer indeksu)

C: LOGIN <login>

W momencie, gdy 4 osoby włączą się do gry, gra zostaje uruchomiona a serwer przesyła do zawodników komunikat START z numerem gracza oraz kolejnością graczy w pierwszej rundzie (wylosowaną przez siebie) oraz pierwszą czwórką wylosowanych domin.

S: START <your_Id> <players_order> <domino_numbers> (np. START 2 4 2 1 3 10 17 29 48)

Zakładamy, że numery player_id to zawsze numery od 1 do 4. Domina reprezentowane są przez numery od 1 do 48. Numery domin są posortowane rosnąco.

Użytkownik, który ma wybrać domino otrzymuje od serwera komunikat

S: YOUR CHOICE

Na który w ciągu 2 sekund musi odpowiedzieć podając numer jednego z dostępnych obecnie domin.

C: CHOOSE <domno_number>

Serwer przesyła wybór innym graczom (poza tym, który dokonał wyboru), informując ich, które domino nie jest dostępne

S: PLAYER CHOICE <player_number> <domino_number>

Następnie prosi kolejnego gracza o wybór domina.

Po wyborze ostatniego domina przez 4 gracza, serwer losuje kolejne 4 domina i informuje graczy o wyniku losowania. Uwaga! W przypadku ostatniej rundy, gdy nie ma już domin do losowania przesyłany jest pusty komunikat ROUND.

S: ROUND <domino_numbers> (np. ROUND 4 14 22 33)

Po czym przesyła do gracza, który wybrał najmniejsze domino w poprzedniej rundzie komunikat

S: YOUR MOVE

Gracz wybiera miejsce położenia domina przez podanie współrzędnych oraz orientacji

C: MOVE <x_coordinate> <y_coordinate> <orientation>

Gdzie x_coordinate i y_coordinate to liczby z zakresy -100..100, a orientation to jedna z czterech wartości 0,90,180,270 oznaczająca w stopniach obrót domina przed ułożeniem na planszy. Współrzędne określają zawsze ułożenie lewej części domina w orientacji neutralnej (zerowej - zgodnie ze spisem domin).

Uwaga! W przypadku, gdy domino nie styka się z istniejącym królestwem danego gracza, lub nachodzi na istniejące już domino, lub podane wartości nie spełniają wyżej wymienionych reguł serwer odpowiada graczowi komunikatem ERROR.

Serwer przesyła ruch innym graczom (poza tym, który dokonał wyboru), informując ich o ruchu gracz

S: PLAYER MOVE <player_number> <x_coordinate> <y_coordinate> <orientation>

Następnie serwer pyta gracza o jego ruch, wysyłając podobnie jak wcześniej komunikat

S: YOUR CHOICE

(scenariusz podobny jak opisano wyżej). Uwaga! w ostatniej rundzie, gdy nie ma już domin do wyboru serwer pomija komunikat YOUR CHOICE.

Następnie serwer pyta kolejnego gracza (zgodnie z kolejnością wg zasad gry) o dokonanie ruchu wysyłając do niego komunikat

S: YOUR MOVE

Następnie sekwencja ta jest powtarzana dla kolejnych graczy aż każdy wykona ruch i wybierze domino. Po czym rozpoczyna się kolejna runda (kolejny komunikat ROUND). Gra kończy się po 12 rundzie.

W przypadku końca gry przesyłany jest wszystkim graczom komunikat z wynikami uszeregowanymi w kolejności od gracza o największej, do gracza o najmniejszej liczbie punktów.

S: GAME OVER RESULTS <player_login> <nr_points> <player_login> <nr_points> <player_login> <nr_points> <player_login> <nr_points>

Uwaga! Wszystkie komunikaty składają się z dużych liter i cyfr.

Dodatkowe założenia:

  • w przypadku, gdy klient nie odpowiada przez 2 sekundy jest wyrzucany z gry,

  • w przypadku gdy klient wyśle powyżej 100 złych komunikatów (na które serwer odpowiedział ERROR) pod rząd jest on wyrzucany z gry,

  • w przypadku gdy wiadomość zawiera ponad 250 znaków zostaje odrzucana przez serwer jako niepoprawna,

W przypadku gry gracz zostanie wyrzucony z gry tylko 3 graczy dobiera i wykonuje ruch, w dalszej kolejności 2, lub 1. Gdy w grze nie zostanie żaden z graczy serwer powinien wypisać aktualny wynik i zakończyć grę.

Państwa serwer i klient musi implementować powyższy protokół komunikacji. Dodatkowo mają Państwo za zadanie stworzyć drugi program kliencki, którego celem jest wywołanie błędu, oszukanie, lub spowodowanie błędu serwera. Wszelkie sposoby (dozwolone prawnie), w tym ataki na serwer są akceptowane. Program ten jednak musi się najpierw z sukcesem zalogować na serwerze (wysłać poprawnie przynajmniej komunikat LOGIN i odebrać od serwera komunikaty CONNECT i OK).

Serwer musi logować całą komunikację między nim a clientami do pliku, co sprawi, że w przypadku sytuacji konfliktowych będziemy w stanie rozstrzygnąć kto popełnił błąd (serwer, czy aplikacja klienta).

Każdy komunikat musi być zakończony znakiem końca linii - \n!

Program może być wykonany w dowolnym języku programowania, ale musi wykorzystywać do komunikacji protokół TCP. Termin wykonania zadania: 08.02.2020. Jest to jedyny i ostateczny termin oddania projektu.

23.XII.2020 Update : Dodano limit na znaki dla pojedynczej wiadomości.

23.XII.2020 Update : Poprawiono opis dokonywania ruchów i wyboru domin przez graczy.

23.XII.2020 Update : Dodano pusty komunikat ROUND dla ostatniej rundy.

23.XII.2020 Update : Dodano ograniczenie - login nie może posiadać spacji.

23.XII.2020 Update : Dodano pytanie do sekcji FAQ

23.XII.2020 Update : Dodano rysunki objaśniające punktacje i orientacje stworzone przez Adriana Antkowiaka

24.I.2021 Update : Uszczegółowiono, że serwer podaje losową kolejność jako kolejność 1 rundy

24.I.2021 Dodano pytanie do FAQ

01.II.2021 Dodano <player_number> do komunikatu PLAYER MOVE