Úvod do počítačových sítí Jméno a příjmení: Jan Tichava Osobní číslo: Studijní skupina: středa, 3 4 Obor: INIB INF E-mail: jtichava@students.zcu.cz Datum odevzdání: 19.12.06
Základní charakteristika Jednoduchá desková hra pro dva až čtyři hráče s možností hraní po síti s dedicated serverem, který může být spuštěn na libovolném počítači, na který vidí všichni klienti, kteří chtejí hrát při hraní po Internetu by tedy měl mít server veřejnou IP adresu, klienti mohou být za routerem s privátní IP, komunikace probíhá přes TCP protokol. Celá aplikace je napsná v Javě, pro chod je nutná minimálně ve verzi 1.5, vyvýjeno bylo na verzi 1.5.0_09-b01, testováno i na verzi 1.6. Aplikace je zároveň klient i server, spuštění vybrané části je rozhoduje při spuštění aplikace příslušným parametrem příkazové řádky (viz uživatelská dokumentace). Klient je řešen jako tří vrstvá architektura, která nebyla v tomto případě až tak nutná, prože věškeré výpočty provádí server a klient jen zobrazuje, co server pošle. Server je dvou vrstvá architektura, protože odpadá nutnost zobrazování výsledků uživateli. Server package: třídy: ups.server Bod.java Clovece.java Server.java ServerVlakno.java ZpracovaniDat.java třída Bod Reprezentuje souřadníce ve 2D prostoru. třída Clovece Pohybuje s figurkou po hrací ploše. V konstruktoru třídy se předává aktuální stav hrací plochy, hod kostkou, figurka, se kterou chce hráč hýbat a pro zjednodušení ještě barva figurky. Nejprve se zjistí, jestli je figurka na startu a bude třeba jí nasadit nebo jestli je v cíli, kde se končí. Pokud je na startu, zkontroluje se, jeslti padla na kostce šestka, pokud ano, provede se pokus o nasazení, při kterém se případně vyhodí figurka, která by překážela. Vyhazují se i figurky stejné barvy. 1
V případě pohybu v cílovém doměčku se zjistí, jeslti je možný pohyb a jestli není pole obsazené, pokud jsou obě podmínky splněny, figurka se přesune. Obecný pohyb je rozfázován do pohybu vždy o jedno políčko, je to z důvodu, ze si figurka hledá cestu, jakou se dá. Vždy před posunem se podívá kam má jít a popojde, takto je to řešené z důvodu konce hry, kdy po oběhnutí celé hrací plochy jde figurka do cílového doměčku, který je jedinečný pro každou barvu. Pokud je na cílovém políčku jiná figurka je vyhozena, bez ohledu na barvu, jedinou vyjímkou je, pokud jde figurka do doměčku, tak sama sebe nevyhodí a tah není možný. Každá akce nad figurkou je brána jak tah, i v případě, že není možné ten tah provést, pak musí hráč čekat na další kolo. Hození číslice 6 je ekvivaletní s libovolnou jinou číslicí, hráč nehraje vícekrát. Třída obsahuje public metodu na zjištění výherce. třída Server Volá se při spušění serveru. Nejprve vytvoří instanci třídy ZpracovaniDat a spustí jí jako samostatné vlákno, pak začne naslouchat na všech sítových rozhraních počítače na zvoleném portu. V cyklu stále čeká na příchozí spojení, pokud se vyskytne, vytvoří novou instanci třídy ServerVlakno, propojí jí pomocí observer-observable s třídou ZpracovaniDat a spustí jí jako samostatné vlákno. Stejně postupuje pro každý požadavek na připojení, až do maximálního počtu čtyř, což je maximum hráčů, ostatní požadavky o připojení jsou ignorovány. třída ServerVlakno Každá instance této třídy je jeden připojený klient k serveru. Zprostředkovává spojení mezi klientem a třídou ZpracovaniDat, které předává přijatá data a následně data od této třídy zase odesílá, rozlišuje se, jeslti se má odeslat všem klientům nebo pouze jednomu z nich. třída ZpracovaniDat Přes předávání zpráv přijme data od ServerVlakno a podle příslušného číselného kódu rozhodne, jestli chce uživatel chatovat, začít hrát nebo táhnout figurkou. Kódy jsou definovány v balíku ups, ve tříde Sit.java. Podle charakteru požadavku ho buď vyřídí (například chat jednoduše rozešle) nebo předá k vyhodnoce tříde Clovece, která se stará o pohyby figurek. 2
Klient package: třídy: ups.klient GenerujPlochu.java Klient.java KlientData.java KlientGUI.java KlientPrijimani.java KlientSit.java třída GenerujPlochu Generuje hrací plochu pro zobrazeni. Je složena z jednotlivých JLabel, na kterých je zobrazen příslušný obrázek, každý, JLabel, který může být aktivní obsahuje MouseListener, který reaguje na událost mouseclicked a předává infomace o tom, na jaké políčko bylo kliknuto pomocí zpráv. třída Klient Vytvoří instance tříd KlientGUI, KlientSit, a KlientData, podle potřeby je propojí pomocí observer-observable a spustí kždou třídu ve vlastním vlákně. třída KlientData Pouze spojuje KlientGUI a KlientSit, v tomto případe pouze přijme zprávu od KlientSit, změní příjemnce a pošle jí dál (nebo naopak). třída KlientGUI Téměr celý kód je vygenerovám pomocí Visual Editoru, což je plugin do Eclipse pro grafický návrh aplikace. Data jsou získávána a předávána pomocí zpráv do/z KlientData. třída KlientPrijimani Třída přijme data ze sítě a pomocí zprávy je předá dál. třída KlientSit Třída navazuje spojení a odesílá data. Veškerá komunikace s okolím je opět vyřešena pomocí zpráv. 3
Uživatelská dokumentace Spuštění serveru Server využívá pouze rozhraní příkazové řádky, je možné ho spustit i vzdáleně na serveru. Spuštění na defaultním portu: java -jar Clovece.jar -s java -jar Clovece.jar --server Spuštění na portu, jaký chce uživatel: java -jar Clovece.jar -s -p 12345 java -jar Clovece.jar --server --port 12345 Oba způsoby spuštění jsou naprosto ekvivalentní. Ovládání klienta Jsou tři mořnosti, jak spustit vlastní hru: java -jar Clovece.jar java -jar Clovece.jar -k java -jar Clovece.jar klient Všechny tři možnosti vedou ke stejnému výsledku: 4
Připojení k serveru Po kliknutí na tlačítko Připojit k serveru se vám zobrazí následující dialog Tetová pole vyplňte podobně jako na obrázky, jen za ně dosaďte hodnoty, na kterých skutečně běží server. Spuštění hry V okamžiku, kdy jsou připojeni všichni hráči, jeden z hráčů klikne na tlačítko Spustit hru a hra se spustí. Začíná červený hráč, nejprve musí hodit kostkou, to se provede tak, že klikne na obrázek kostky vpravo nahoře a násldně klikne na figurku, se kterou chce hrát. musí kliknout i v případě, ze nemůže hrát (nezáleží na tom, na jakou klikne). Hra Hráči se postupně střídají ve směru hodinových ručiček počínaje červeným, ve stavovém řádku se vždy objeví, kdo co má daný hráč dělat (házet, táhnout, čekat). Hra končí v okamžiku, kdy má jeden z hráčů všechny figurky v cílovém domečku nebo v případě odpojení jednoho z hráčů. Novou hru ve stejném složení jako byla ta, která pravá skončila výhrou je možné zahájit ihned po dohrání, pokud by bylo potřeba zmenit hráče, je nutné restartovat klienty i server a znovu se připojit. Ostatní Program je možné také ovládat pomocí horního menu, ve kterém jsou ekvivalenty k některým tlačítkům. Informace o autorovi se zobrazí po stisknutí příslušného tlačítka. Záver Po nastudování síťové komunikace a vymyšlení algorimu na chození po hracím poli bylo naprogramování sítové hry jednoduchou a zábavnou záležitostí, práce mě bavila a naučil jsem se i něco nového, co se mi určitě může hodit. 5