SIKPRO.rst

Sieci Komputerowe

PROJEKT

Sieciowa implementacja gry love letter

Projektem jest stworzenie serwera i klienta dla uproszczonej wersji gry love letter (pl. list miłosny).

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

Każdy gracz otrzymuje początkowo 1 kartę ze zbioru dostępnych kart. Na początku losowo wybierane są id dla graczy. Gracz o id równym 1 rozpoczyna rozgrywkę. Każdy gracz przed wykonaniem ruchu dobiera sobie 2 kartę. Gra podzielona jest na rundy, które podzielone są na tury. W każdej turze gracz który wykonuje ruch musi zagrać jedną z dwóch swoich kart. Następnie kolejka przechodzi do następnego gracza. W przypadku spełnienia określonych warunków gry gracz zostaje wyeliminowany z rozgrywki w danej rundzie. Runda jest kontynuowana do momentu gdy w grze pozostanie tylko jeden gracz lub skończą się karty. W przypadku, gdy w grze pozostaje tylko jeden gracz zostaje on zwycięzcą rundy i otrzymuje 1 punkt. Następnie następuje przetasowanie kart, wybór id na nowo i rozpoczyna się nowa runda. W przypadku gdy któryś z graczy zdobędzie 4 punkt zostaje on zwycięzcą i gra zostaje zakończona. Lista kart i ich działanie:

Karta

Moc

Liczba kart tego typu w talii

Działanie

Guard

1

10

Player designates another player and names a type of card. If that player's hand matches the type of card specified, that player is eliminated from the round. However, Guardcannot be named as the type of card.

Priest

2

3

Player skip next turn

Baron

3

5

Player will choose another player and privately compare hands. The player with the lower-strength

(moc karty) hand is eliminated from the round. In the case of draw none of the players is eliminated

Handmaiden

4

2

Player cannot be affected by any other player's card until the next turn.

Prince

5

2

Player can choose any player (including themself) to discard their hand and draw a new one.

If the discarded card is the Princess, the discarding player is eliminated.

King

6

1

Player trades hands with any other player.

Countess

7

1

If a player holds both this card and either the King or Prince card, this card must be played immediately.

Princess

8

1

If a player plays this card for any reason, they are eliminated from the round.

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ół:

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 - najlepiej numer indeksu)

C: LOGIN <login>

W momencie, gdy 5 osób włączy się do gry, gra zostaje uruchomiona a serwer przesyła do zawodników komunikat START z numerem gracza oraz nazwą karty z którą zaczyna grę.

S: START <player_ID> <card_name>

Zakładamy, że numery player_id to numery od 1 do 5 i gracze wykonują ruchy w kolejności 1,2,3,4,5,1,2,3,...

Użytkownik, który ma wykonać ruch otrzymuje od serwera komunikat

S: YOUR MOVE <card_name>

Na który w ciągu 2 sekund musi odpowiedzieć podając ruch, czyli wybór karty.

C: CHOOSE <card_name>

W przypadku karty GUARD komunikat wygląda następująco

C: CHOOSE GUARD <player_id> <card_name>

W przypadku karty PRIEST komunikat wygląda następująco

C: CHOOSE PRIEST <player_id>

W przypadku karty BARON komunikat wygląda następująco

C: CHOOSE BARON <player_id>

W przypadku karty HANDMAIDEN komunikat wygląda następująco

C: CHOOSE HANDMAIDEN

W przypadku karty PRINCE komunikat wygląda następująco

C: CHOOSE PRINCE <player_id>

Po zagraniu karty PRINCE serwer zanim przejdzie do następnego gracza wysyła do gracza , który musiał wyrzucić kartę (o ile nie odpadł on z gry) komunikat

S: NEW CARD <card_name> <player_id>

W przypadku karty KING komunikat wygląda następująco

C: CHOOSE KING <player_id>

Po zagraniu karty KING serwer zanim przejdzie do następnego gracza wysyła do gracza, który zagrał i na którego zagrano kartę komunikaty

S: TRADE <card_name>

W przypadku karty COUNTESS komunikat wygląda następująco

C: CHOOSE COUNTESS

W przypadku karty PRINCESS komunikat wygląda następująco

C: CHOOSE PRINCESS

Serwer wysyła wszystkim graczom wykonany ruch w postaci:

S: MOVE <powtórzona_składnia_z_choose>

I przechodzi do kolejnego gracza wysyłając mu komunikat YOUR MOVE.

W przypadku eliminacji jakiegoś gracza w wyniku ruchu po komunikacie MOVE wysyłany jest komunikat

S: ELIMINATED <player_ID>

Wyeliminowany gracz nie otrzymuje od serwera żadnego komunikatu aż do zakończenia rundy.

W przypadku końca rundy przesyłany jest wszystkim graczom komunikat

S: ROUND WINNER <player_ID>

Oraz aktualny stan rozgrywki, podając loginy graczy :

S: ROUND RESULTS <player_login> <nr_points> <player_login> <nr_points> <player_login> <nr_points> <player_login> <nr_points> <player_login> <nr_points>

Przechodząc do kolejnej rundy rozpoczynamy ją komunikatami START wysyłanymi do graczy.

Jeżeli któryś z graczy osiągnął 4 punkty zamiast komunikatu ROUND END wysyłany jest komunikat

S: GAME WINNER <player_login>

Oraz końcowy stan rozgrywki, podając loginy graczy:

S: FINAL RESULTS <player_login> <nr_points> <player_login> <nr_points> <player_login> <nr_points> <player_login> <nr_points> <player_login> <nr_points>

Serwer musi sprawdzać czy karty zagrywane są zgodnie z zasadami gry i jeżeli nie są zwracać komunikat ERROR. Nazwy kart przesyłane powinny być zawsze w postaci dużych liter.

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 pod rząd jest on wyrzucany z gry,

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ę 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: 31.01.2017. Jest to jedyny i ostateczny termin oddania projektu.

Update 05.12.2019 - Zmieniono protoków przy karcie Handmaiden - usunięto player_id,

  • Dodano opis pobierania kart co turę gracza,

  • Uwspólniono czas po, którym użytkownik ma być wyrzucany z gry na 2 sekundy (wcześniej pojawiało się 3 i 2 sekundy),

  • Dodano do opisu kart scenariusz gdy w odpowiedzi na kartę Baron otrzymamy remis w mocach kart.

Update 25.01.2020 - Dodano komunikat po karcie KING