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 |
|
Handmaiden |
4 |
2 |
Player cannot be affected by any other player's card until the next turn. |
Prince |
5 |
2 |
|
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