projekt_2018UTF.rs

.. role:: todo

Sieci Komputerowe

Projekt

Projektem jest stworzenie serwera i automatycznego klienta dla uproszczonej wersji gry Kdice .

W grze brać będzie udział 5 graczy. Plansza, na której odbywa się gra ma być kwadratowa i mieć wymiary 5x5 pól. Pola uznajemy za sąsiadujące (i możemy przejść z jednego pola na drugie) gdy sąsiadują w pionie lub poziomie.

Gracze pojawiają się na planszy w losowych miejscach. Na początku gry każdy z graczy zajmuje dwa pola mając na nich do dyspozycji dwie kostki. Dodatkowo na pięciu losowych polach umieszczone zostaje losowo 5 nieaktywnych grup od 1 do 5 kostek (w przypadku niezrozumienia zagraj na kdice.com).

W każdej rundzie gracz może przesuwać się z miejsc, w których posiada więcej niż jedną na sąsiednie pola, zostawiając za sobą jedną kostkę. tzn. przemieszczając się z pola (1,1) na pole (1,2) mając na polu (1,1) dwie kostki "atakujemy" pole przeciwnika dwoma kostkami. W przypadku zwycięstwa zostawiamy jedną kostkę na polu (1,1) a resztę kostek (minus jeden) przenosimy na pole (1,2).

Atak : podczas przemieszczania się z pola na pole wykonujemy atak. Moc ataku liczona jest jako suma losowo wylosowanych oczek na kostkach, którymi dokonujemy ataku. Jeżeli na polu znajdują się kostki przeciwnika, lub kostki grup nieaktywnych, przeciwnik się broni także dokonując losowania taką liczbą kostek jaką posiada na danym polu. W przypadku, gdy nasz wynik jest wyższy niż wynik przeciwnika atak kończy się sukcesem w przeciwnym wypadku atak kończy się niepowodzeniem.

W przypadku sukcesu na polu z którego wychodziliśmy zostawiamy jedną kostkę a pozostałe przenosimy na pole na które dokonywaliśmy ataku. Uwaga! Ataku zawsze dokonujemy wszystkimi kośćmi z danego pola i zawsze przenosimy na atakowane pole wszystkie poza jedną kości!

W przypadku niepowodzenia tracimy wszystkie poza jedną kostką, która pozostaje na polu, z którego dokonywaliśmy ataku.

Na początku gry serwer przesyła do wszystkich graczy ich numer ID oraz listę początkowych ustawień graczy i liczbę kostek na polach.

Plansza jest numerowana od pola (1,1) lewe górne pole do (5,5) prawe dolne pole.

Zadaniem Państwa serwera jest przeprowadzanie ww gry, a zadaniem programu klienta jest gra w grę bez ingerencji człowieka - inaczej mówiąc trzeba napisać bota grającego w wyżej wymienioną grę. Programy osiągające dobre wyniki będą premiowane dodatkowymi punktami.

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

OPIS PROTOKOŁU KOMUNIKACJI:

W momencie połączenia serwer przesyła do użytkownika komunikat

POLACZONO

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

LOGIN <login>

W momencie, gdy 5 osób włączy się do gry, gra zostaje natychmiast uruchomiona a serwer przesyła do zawodników komunikat START wraz z numerem danego gracza i numerem zawodnika zaczynającego grę. Gracz nieaktywny otrzymuje id 0, gracze aktywni id od 1 do 5.

START <twój ID> <id_zawodnika_zaczynającego grę>

Następnie każdy użytkownik otrzymuje informacje o ustawieniu początkowym otrzymując 25 razy komunikat (raz dla każdego z pól).

PLANSZA <współrzędna X> <współrzędna Y> <id_gracza> <liczba kostek> np. 2 1 2 2

Pola niezajęte lub zajęte przez nieaktywnych graczy otrzymują id_gracza równe 0.

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

TWOJ RUCH

Na który w ciągu 2 sekund musi odpowiedzieć podając ruch albo komendę

PASS

Ruch polega na podaniu komunikatu ATAK i współrzędnych początku i końca ruchu

ATAK <współrzędna X> <współrzędna Y> <współrzędna X> <współrzędna Y> np. ATAK 1 1 1 2

Serwer musi sprawdzać, czy ruch jest poprawny, tzn. czy ruszamy się z zajętego przez nas pola, czy na zajętym przez nas polu mamy więcej niż jedną kostkę, czy podane jako drugie pole jest polem sąsiadującym z naszym polem.

Uwaga! w przypadku ataku zakończonego sukcesem możemy kontynuować atak tą samą grupą na kolejne pola.

Uwaga! Nie możemy atakować własnych pól!

Komunikat ATAK i wynik ATAKU są przesyłane przez SERWER do wszystkich graczy. Jako wynik ataku serwer podaje komunikat WYNIK listę wyników losowań kostek gracza atakującego i obrońcy

WYNIK <id atakujacego> <lista kostek atakującego> <wyniki losowań> ... <id_broniącego> <lista kostek broniącego> <wyniki losowań> <id_zwyciezcy> np. WYNIK 1 2 5 6 0 3 2 1 2 1

Po wykonaniu wszystkich ruchów gracz wysyła na serwer komunikat końca ruchu

PASS

Serwer kończy rundę wysyłając wszystkim graczom komunikat

KONIEC RUNDY

Po wykonaniu ruchów przez wszystkich graczy kończy się runda. Przed przejściem do kolejnej rundy serwer dodaje losowo każdemu z graczy kostki na zajęte przez nich pola. Liczba dodanych kostek jest równa liczbie pól, które są okupowane przez gracza. Kostki dodawane są losowo na pola zajęte przez gracza, z zachowaniem zasady, że na jednym polu nie może być więcej niż 8 kostek. W przypadku, gdy wszystkie pola gracza mają po 8 kostek nowe kostki nie dodają się.

Po komunikacie KONIEC RUNDY następuje komunikat PLANSZA i odbywa się nowa runda gry.

W przypadku, gdy na planszy pozostał tylko jeden gracz lub rozegrano 100 rund tura się kończy. Turę wygrywa ten gracz, który ma na końcu gry najwięcej kostek. W przypadku gdy gracze zostają wcześniej pokonani, w momencie przegranej otrzymują miejsca 5,4,3,2 i czekają na kolejną grę.

W przypadku wyeliminowania z gry w danej rundzie (pozbawienia wszystkich kostek) lub na końcu tury (po 100 rundach) gracz otrzymuje komunikat z numerem tury oraz osiągniętym miejscem.

TURA <nr tury> <miejsce>

Po komunikacie tura serwer niezwłocznie przesyła komunikat PLANSZA (zdefiniowany wyżej).

Po rozegraniu 10 tur następuje koniec gry, serwer podsumowuje miejsca graczy w poszczególnych grach, gdzie pierwsze miejsce to 1 pkt, drugie 2pkt itd. Grę wygrywa gracz który zebrał najmniej punktów. W przypadku remisów wygrywa gracz o mniejszym ID.

KONIEC <uszerwegowane_loginy_graczy_od wygranego do ostatniego miejsca wraz z punktacją> np KONIEC s123456 10 s654321 20 s123987 30 s12392 40 s223987 50

Dodatkowe założenia:

  • każdy komunikat musi kończyć się znakiem końca linii 'n'

  • w przypadku, gdy klient nie odpowiada przez 2 sekundy jest wyrzucany z gry, tzn. staje się nieaktywnym graczem.

  • w przypadku gdy klient wyśle powyżej 50 złych komunikatów, jako pojedyncza odpowiedź jest on wyrzucany z gry, tzn. staje się nieaktywnym graczem.

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 zalogować w serwerze (wysłać poprawnie przynajmniej komunikat LOGIN).

Programu powinny logować informacje, które sprawią, że w przypadku sytuacji konfliktowych będziemy w stanie rozstrzygnąć kto popełnił błąd (serwer, czy aplikacja klienta).

Serwer musi zapisywać (logować) do pliku cala komunikacje pomiędzy nim a klientami.

Program może być wykonany w dowolnym języku programowania ale musi wykorzystywać do komunikacji protokół TCP. Termin wykonania zadania: 28.01.2019