České vysoké učení technické v Praze Fakulta elektrotechnická
Bakalářská práce
Síťová hra Člověče nezlob se David Kubát
Vedoucí práce: Ing. Jan Janoušek, Ph.D.
Studijní program: Elektrotechnika a informatika strukturovaný bakalářský Obor: Informatika a výpočetní technika květen 2008
Poděkování Rád bych poděkoval vedoucímu mé bakalářské práce Ing. Janu Janouškovi, Ph.D. za poskytnutí konzultací a připomínek v rámci tvorby bakalářské práce.
Prohlášení Prohlašuji, že jsem svou bakalářskou práci vypracoval samostatně a použil jsem pouze podklady uvedené v přiloženém seznamu. Nemám závažný důvod proti užití tohoto školního díla ve smyslu 60 Zákona č. 121/2000 Sb., o právu autorském, o právech souvisejících s právem autorským a o změně některých zákonů
(autorský zákon).
V Praze dne 4.6.2008
………………………………………….
Abstract The goal of this work is to implement multiplayer game Ludo with support of chat and ability to save, load and replay a game. The game is realized in Microsoft Visual C++. For network communication is used TCP/IP protocol and graphical interface is realized with use of SDL library.
Abstrakt Cílem práce je implementace síťové hry „Člověče nezlob se“ s podporou chatu, ukládání a nahrávání rozehrané hry. Dále umožňuje přehrát zahrané tahy. Hra je realizována v prostředí Microsoft Visual Studio C++. Pro síťovou komunikaci je použit protokol TCP/IP a grafické rozhraní je realizováno za pomoci knihovny SDL.
OBSAH OBSAH........................................................................................................................ I SEZNAM OBRÁZKŮ................................................................................................. IV SEZNAM TABULEK ................................................................................................. VI 1 1.1
ÚVOD................................................................................................................... 1 Koncepce hry ............................................................................................................................................ 1
1.2 Pravidla ..................................................................................................................................................... 1 1.2.1 Zahajovací pozice .................................................................................................................................. 1 1.2.2 Cíl hry .................................................................................................................................................... 1 1.2.3 Tahy ....................................................................................................................................................... 1 1.2.4 Zakončení hry ........................................................................................................................................ 2 1.2.5 Taktické rady ......................................................................................................................................... 2 1.3 Ovládání hry ............................................................................................................................................. 3 1.3.1 Spuštění hry ........................................................................................................................................... 3 1.3.2 Hra ......................................................................................................................................................... 4
2 2.1
ZÁKLADNÍ POJMY A SOUČASNÉ REALIZACE ............................................... 5 Definice základních pojmů ...................................................................................................................... 5
2.2 Architektura TCP/IP ............................................................................................................................... 6 2.2.1 Vrstvy TCP/IP ....................................................................................................................................... 6 2.2.2 Protokol IP ............................................................................................................................................. 7 2.2.3 TCP protocol ......................................................................................................................................... 8 2.3
Člověče 3D - Člověče nezlob se na PC, hra ............................................................................................ 9
2.4
Člověče nezlob se (hry.divoch.cz) ........................................................................................................... 9
2.5
Člověče nezlob se! (http://www.hrajonline.cz/) ................................................................................... 10
2.6
Shrnutí .................................................................................................................................................... 10
3
ANALÝZA A NÁVRH ŘEŠENÍ .......................................................................... 11
3.1 Analýza ................................................................................................................................................... 11 3.1.1 Hraní s ostatními hráči na stejném počítači ......................................................................................... 11 3.1.2 Možnost doplnit zbývající hráče počítačem ........................................................................................ 11 3.1.3 Síťová hra ............................................................................................................................................ 11 3.1.4 Ukládání hry ........................................................................................................................................ 11
i
3.1.5 3.1.6 3.1.7 3.1.8
Načtení rozehrané hry .......................................................................................................................... 11 Přehrání zahraných tahů ...................................................................................................................... 11 Chat ..................................................................................................................................................... 12 Dobré grafické zpracování ................................................................................................................... 12
3.2 :ávrh řešení ........................................................................................................................................... 12 3.2.1 Volba operačního systému ................................................................................................................... 12 3.2.2 Volba vývojového prostředí ................................................................................................................ 12 3.2.3 Objektový model ................................................................................................................................. 12 3.2.4 Význam tříd ......................................................................................................................................... 13 3.2.5 Class diagram klienta........................................................................................................................... 14
4 4.1
REALIZACE ...................................................................................................... 15 Data ......................................................................................................................................................... 15
4.2 Grafické rozhraní................................................................................................................................... 15 4.2.1 Obrázky ............................................................................................................................................... 15 4.2.2 Uživatelské vstupy aneb klávesnice a myš .......................................................................................... 16 4.2.3 Dialogy ................................................................................................................................................ 17 4.3
Umělá inteligence ................................................................................................................................... 18
4.4
Formát updatu ....................................................................................................................................... 18
4.5
Chat ......................................................................................................................................................... 18
4.6
Synchronizace vláken serveru ............................................................................................................... 18
5
TESTOVÁNÍ ...................................................................................................... 21
6
ZÁVĚR ............................................................................................................... 23
7
LITERATURA .................................................................................................... 25
PŘÍLOHA A - OBSAH PŘILOŽENÉHO CD ............................................................. 27
ii
iii
SEZNAM OBRÁZKŮ Obrázek 1 - Obrazovka s výběrem hráčů ................................................................................................ 3 Obrázek 2 - Class diagram klienta......................................................................................................... 14 Obrázek 3 - kostka ................................................................................................................................. 16 Obrázek 4 - Synchronizace vláken serveru ........................................................................................... 19
iv
v
SEZNAM TABULEK Tabulka 1 - TCP hlavička ........................................................................................................................ 8
vi
KAPITOLA: Úvod
~1~
1 Úvod 1.1 Koncepce hry Bakalářská práce se zabývá implementací síťové hry Člověče nezlob se. Pro komunikaci serveru s klientem používá protokol TCP/IP a grafickou část obstarává knihovna SDL. Server je tvořen samostatnou vícevláknovou aplikací, kterou si první klient spouští při startu hry. K tomuto serveru se následně připojí ostatní hráči. Pouze u síťové hry lze komunikovat pomocí chatu. Hru je možné spustit také v módu pro jednoho hráče. V tomto módu je hra zcela nezávislá na síťovém rozhraní a je možné ji hrát i na počítačích bez síťového adaptéru. Během hraní je možné hru kdykoliv uložit stiskem klávesy F2, nebo nahrát klávesou F3. Pokud se v průběhu hry stiskne klávesa F4, přehrají se všechny až doposud odehrané tahy. Samozřejmě je možné nechat si zobrazit průběh i po dohrání.
1.2 Pravidla 1.2.1 Zahajovací pozice • • •
Každému hráči patří jeden startovní domeček (domeček) a jeden cílový domeček (chlíveček) stejné barvy. V každém startovním domečku stojí 4 figurky, z nichž každá má jinou barvu. Hráče lze označit podle barvy jejich domečků, nikoli podle barvy figurek.
1.2.2 Cíl hry Dovést do svého chlívečku po jedné figurce od každé barvy. 1.2.3 Tahy • • •
•
Každý hráč jednou hodí kostkou. Hráč, kterému padne nejvyšší počet ok, začíná. Dále se hráči na tahu pravidelně střídají ve směru chodu hodinových ručiček. Části tahu - Hráč, který je na řadě, hodí kostkou. Pokud padne šestka, může hod opakovat tak dlouho, dokud mu padají šestky. Hody musí použít ve správném pořadí, čili nejdříve použije všechny šestky a teprve nakonec zbylé číslo. Tahy jsou povinné. Nemůže-li hráč hod provést, musí se jej vzdát. Podobně padne-li mu několik šestek a nemůže-li je všechny využít, musí se přebytečných hodů vzdát.
1.2.3.1 Pohyb kamenů •
•
•
Nasazení - Pokud hráči padne šestka, může ji využít k nasazení. Vezme ze svého domečku figurku libovolné barvy a postaví ji na své startovní políčko na hracím plánu. Nasazování figurek není povinné. Posun - Hráč může posunout kteroukoli figurku na hracím plánu takové barvy, jakou nemá ve svém domečku ani ve chlívečku. Figurku posune o tolik políček, kolik ok padlo na kostce. Pokud hráči padly nějaké šestky a on je nepoužil všechny k nasazení, může pohnout i více figurkami. Směr pohybu - Každý hráč pohybuje figurkami ve směru chodu hodinových ručiček od svého startovního políčka směrem ke svému chlívečku. Pokud má figurku před chlívečkem, zajede s ní dovnitř. Od této chvíle již nemůže hrát žádnou figurkou této barvy.
~2~
KAPITOLA: ÚVOD
•
Figurky v chlívečku se mohou přeskakovat stejně jako na hracím plánu. Také jimi lze v chlívečku pohybovat, čímž hráč může využít hody, kdy nemůže táhnout figurkou na plánu.
1.2.3.2 Vyhazování Pokud hráč ukončí postup s figurkou (v daném tahu už s ní nebude pohybovat) na políčku, kde stojí jiná figurka, pak ji odstraní z plánu a dá do domečku kterémukoli hráči, který s ní může hrát. Jinými slovy - dá ji tomu hráči, který nemá figurku stejné barvy ani v domečku, ani v chlívečku. Nemůže se stát, že by některý z hráčů měl ve svých domečcích více figurek stejné barvy. Pozor na vyhození figurky, kterou může hrát jen hráč na tahu - musel by ji "darovat" sám sobě. 1.2.4 Zakončení hry Zvítězí hráč, kterému se jako prvnímu podaří dovést do chlívečku figurky všech čtyř barev. Zbylí hráči mohou pokračovat v boji o další pořadí, ale hra už není příliš zajímavá, zejména pro vítěze. Proto doporučujeme začít novou partii. 1.2.5 Taktické rady • •
•
Více šestek - Pokud padne hráči několik šestek najednou, může je využít k nasazení a zároveň i k vyhazování. Nasadí první figurku, potom druhou, čímž vyhodí tu první atd. Pokud hráč nasazuje figurku, měl by si vybrat takovou barvu, aby na plánu byla figurka stejné barvy pokud možno co nejblíže k jeho chlívečku. V ideálním případě hráč na šestku figurku nasadí a ve stejném tahu si zajede do svého chlívečku jinou figurkou stejné barvy. Má-li některý hráč nachystanou figurku před svým chlívečkem a na tahu je jiný hráč, který s ní může hrát, měl by svůj tah provést touto figurkou tak, aby "přejel" soupeřův chlíveček a tím mu snížil šance na vítězství.
KAPITOLA: ÚVOD
~3~
1.3 Ovládání hry 1.3.1 Spuštění hry
Obrázek 1 - Obrazovka s výběrem hráčů
1.3.1.1 Výběr figurek • •
Smějící se figurky, přeškrtnuté zelenou fajfkou, označují hráče, kteří se budou účastnit hry. Zbylé figurky se hry neúčastní. Barvy hráčů účastnící se hry se změní po klepnutí levým tlačítkem myši.
1.3.1.2 Kdo s čím hraje Vedle každé figurky na úvodní obrazovce (Obrázek 1 - Obrazovka s výběrem hráčů) je uvedeno, zda za danou barvu hraje hráč, počítač, nebo síťový hráč. 1.3.1.3 Start hry 1.3.1.3.1 Start hry pro jednoho hráče Klepnutím na tlačítko Start zahájíte hru pro jednoho hráče. V případě, že je počet účastnících se hráčů méně než dva, hra upozorní na tento nedostatek a požádá hráče o výběr alespoň dvou hráčů. Této verze hry se nesmí účastnit síťový hráč.
~4~
KAPITOLA: ÚVOD
1.3.1.3.2 Start serveru pro více hráčů Klepnutím na tlačítko Síťová hra se založí server, ke kterému se ihned připojí klient, ze kterého byla síťová hra spuštěna. Zobrazí se obrazovka se stavem připojení klientů. Smějící se figurky přeškrtnuté zelenou fajfkou znamenají hráče účastnící se hry. Nezaškrtnutá barva se hry nezúčastní. Vedle tohoto obrázku se nachází jeden z těchto stavů: • • •
Nehraje – hráč se hry neúčastní Připojen – hráč je již připojen (hráči na serveru se připojí automaticky při startu) Čekám na připojení… – čeká se na připojení síťového hráče
1.3.1.3.3 Připojení klienta Stiskem tlačítka Připojit ke hře se hra uživatele zeptá na IP adresu serveru. Jakmile je IP adresa zadána, hra se připojí k serveru. Pokud jsou již všichni hráči připojeni, hra se spustí. V opačném případě se objeví obrazovka s upozorněním, že hra čeká na ostatní hráče. 1.3.2 Hra Hra se skládá z kol. 1.3.2.1 Průběh Kola a) Na začátku každého kola čeká hra na stisk levého tlačítka myši. Jakmile je tlačítko stlačeno, hodí se kostkou. b) Tah figurkou podle jednoho z následujících scénářů: • Pokud je na tahu počítač, počká na klepnutí levým tlačítkem myši a následně provede svůj tah. • Je-li na tahu síťový hráč, zobrazí se na hrací ploše zpráva „Počkejte na tah hráče“ a hra čeká, dokud síťový hráč nezahraje svůj tah. • V případě, že je na řadě hráč, hra čeká, dokud neklepne na figurku, se kterou chce táhnout. • Nemá-li hráč možnost tahu, hra jej o tomto faktu informuje a čeká na klepnutí levého tlačítka myši. c) Pokud hráč vyhodil figurku, postupuje dle bodu 1.3.2.3. d) Konec kola, začíná nové kolo (bod a). 1.3.2.2 • • • •
Pohyb figurkou Pohybovat s figurkami lze v případě, že hraje hráč a ne počítač. Lze pohybovat jen s některými figurkami (viz. Pravidla). Figurku posunete klepnutím levým tlačítkem myši. Najetí na figurku znamená najet na políčko, na kterém stojí, ne na samotnou figurku (kvůli překrývání figurek by bylo obtížné najet na figurku, která je v zákrytu).
1.3.2.3 Vyhození figurky • Při vyhození figurky se objeví na kurzoru figurka vyhozené barvy. • Figurka se musí umístit do domečku, a to do takového, kam ji umístit lze (Hráč oné barvy nemá vyhozenou figurku ani v domečku, ani v chlívečku). • Figurku umístíte klepnutím levého tlačítka myši na políčko v domečku.
KAPITOLA: ZÁKLADNÍ POJMY A SOUČASNÉ REALIZACE
2 Základní pojmy a Současné realizace Na internetu lze nalézt velké množství implementací hry Člověče nezlob se. Většina z nich neumožňuje hru po síti, a pokud ano, tak chybí chat, nebo nelze ukládat rozehranou hru. Možnost přehrát si zahrané tahy neumí žádná z nich. Hlavní důvod pro psaní této práce je, že doposud neexistovala verze, ve které by se hrálo podle jiných než standardních pravidel.
2.1 Definice základních pojmů •
•
•
• •
•
• •
•
Simple DirectMedia Layer (SDL) je multiplatformní multimediální knihovna poskytující nízkoúrovňový přístup na audio, klávesnici, joystick, 2D počítačovou grafiku a 3D hardware přes OpenGL. Napsaná je v jazyku C, nicméně existuje řada wrapperů například pro jazyky Java, Delphi, Python, Perl a další. Její verze pro Microsoft Windows využívá knihovnu DirectX verze 6. Samotná knihovna obsahuje jen základní věci, na vše ostatní jsou potřebné doplňující knihovny (SDL_image, SDL_ttf, SDL_net, SDL_Sound, SDL_Mixer, smpeg a další). protokol TCP/IP je definován sadou protokolů pro komunikaci v počítačové síti. Komunikační protokol je množina pravidel, které určují syntax a význam jednotlivých zpráv při komunikaci. Viz 2.2 Architektura TCP/IP. TCP protokol (Transmission Control Protocol) je jedním ze základních protokolů sady protokolů Internetu, konkrétně představuje transportní vrstvu. Použitím TCP mohou aplikace na počítačích propojených do sítě vytvořit mezi sebou spojení, přes které mohou přenášet data. Protokol garantuje spolehlivé doručování a doručování ve správném pořadí. TCP také rozlišuje data pro vícenásobné, současně běžící aplikace (například webový server a emailový server), spuštěné na stejném počítači. IP (anglicky Internet Protocol) je datový protokol používaný pro přenos dat přes paketové sítě. Tvoří základní protokol dnešního Internetu. Server je v informatice obecné označení pro počítač (tedy hardware) nebo software, který poskytuje nějakou službu dalším počítačům nebo programům. Ve světě Unixu se softwarový server nazývá „démon“ (anglicky „daemon“), v Microsoft Windows se nazývá „služba“ (anglicky „service“). Služba může být nabízena v rámci jednoho počítače (obsluha připojené tiskárny, správa automatických aktualizací apod.) nebo i počítačové sítě (sdílené disky, síťová tiskárna, WWW server, autentizační server a další). Poskytování služby je pak realizováno pomocí aplikačního síťového protokolu, například HTTP pro webový server, LPT pro tiskový server, SMB pro sdílení disků a tiskáren ve Windows. Síťová hra je počítačová hra, která umožňuje hraní po internetu. Buď je hra specificky pro takové hraní více hráčů navržena, nebo nabízí online hru jako druhou možnost vedle hry pro jednoho hráče bez potřeby připojení k síti. Síťový hráč je hráč, který hraje ze vzdáleného počítače. Grafické uživatelské rozhraní (anglicky Graphical User Interface, známe pod zkratkou GUI) je druh komunikace s počítačem mající podobu interaktivních grafických prvků. V dnešní době se nejčastěji skládá z oken zabírajících větší či menší část počítačového monitoru. Operační systém je sada programů (software) sloužících především k tomu, aby byly aplikačním programům transparentním způsobem zpřístupněny prostředky (hardware) počítače tak, aby vytvářel potřebné operační prostředí pro chod aplikací. Operační systém patří mezi tzv. systémový software. Mezi jeho základní funkce patří rozdělení systémových prostředků aplikacím. Systémovými prostředky je míněn nejen hardware (operační paměť, disk, periferní zařízení), ale také strojový čas a přístup ke komunikačním tokům, dále pak systémové prostředky nehmotné povahy (například sada fontů).
~5~
~6~
KAPITOLA: ZÁKLADNÍ POJMY A SOUČASNÉ REALIZACE
•
Programovací jazyk je prostředek pro zápis algoritmů, jež mohou být provedeny na počítači. Zápis algoritmu ve zvoleném programovacím jazyce se nazývá program. Třída je základní konstrukční prvek objektově orientovaného programování sloužící jako továrna na objekty. Definuje jejich vlastnosti a metody. Vlastnosti mohou odlišovat jednotlivé objekty, např. u objektu člověk to mohou být jméno, věk, výška, pohlaví aj. Metody určují chování objektu, to, čeho je schopný, např. udělej úkoly, zavři okno aj. Objekt je konkrétní datový objekt v paměti odvozený z nějakého vzoru (třídy), používaný v objektově orientovaných programovacích jazycích (Java, C++, Simula 67, atd.). Objekt představuje základní stavební prvek objektově orientovaného programování. Class diagram je typ diagramu, který popisuje strukturu aplikace. Obsahuje třídy, jejich atributy a vztahy mezi třídami. Loopback (logická smyčka) odkazuje na speciálně vyhrazenou IP adresu 127.0.0.1 v protokolu IPv4, nebo ::1 v protokolu IPv6, která může být použita aplikacemi používajícími protokol TCP/IP, které mohou tuto smyčku použít pro komunikaci se sebou samými, pokud je to potřeba. Barevný model RGB neboli červená-zelená-modrá je aditivní způsob míchání barev používaný ve všech monitorech a projektorech (jde o míchání vyzařovaného světla), tudíž nepotřebuje vnější světlo (monitor zobrazuje i v naprosté tmě), na rozdíl např. od CMYK modelu. Handler okna jednoznačně identifikuje okno v systému.
•
•
• •
•
•
2.2 Architektura TCP/IP Vzhledem ke složitosti problémů je síťová komunikace rozdělena do tzv. vrstev, které znázorňují hierarchii činností. Výměna informací mezi vrstvami je přesně definována. Každá vrstva využívá služeb vrstvy nižší a poskytuje své služby vrstvě vyšší. Celý význam slova TCP/IP je Transmission Control Protocol/Internet Protocol (česky primární transportní protokol - TCP/protokol síťové vrstvy IP). Komunikace mezi stejnými vrstvami dvou různých systémů je řízena komunikačním protokolem za použití spojení vytvořeného sousední nižší vrstvou. Architektura umožňuje výměnu protokolů jedné vrstvy bez dopadu na ostatní. Příkladem může být možnost komunikace pomocí různých fyzických médií - ethernet, token ring, sériová linka. 2.2.1 Vrstvy TCP/IP Architektura TCP/IP je členěna do čtyř vrstev (na rozdíl od referenčního modelu OSI se sedmi vrstvami): • • • •
aplikační vrstva (application layer) transportní vrstva (transport layer) síťová vrstva (network layer) vrstva síťového rozhraní (network interface)
2.2.1.1 Vrstva síťového rozhraní Nejnižší vrstva umožňuje přístup k fyzickému přenosovému médiu. Je specifická pro každou síť v závislosti na její implementaci. Příklady sítí: Ethernet, Token ring, FDDI, X.25, SMDS. 2.2.1.2 Síťová vrstva
KAPITOLA: ZÁKLADNÍ POJMY A SOUČASNÉ REALIZACE Vrstva zajišťuje především síťovou adresaci, směrování a předávání datagramů. Protokoly: IP, ARP, RARP, ICMP, IGMP, IGRP, IPSEC. Je implementována ve všech prvcích sítě - směrovačích i koncových zařízeních. 2.2.1.3 Transportní vrstva Transportní vrstva je implementována až v koncových zařízeních (počítačích), a umožňuje proto přizpůsobit chování sítě potřebám aplikace. Poskytuje spojované (protokol TCP, spolehlivý) či nespojované (UDP, nespolehlivý) transportní služby. 2.2.1.4 Aplikační vrstva Vrstva aplikací. To jsou programy (procesy), které využívají přenosu dat po síti ke konkrétním službám pro uživatele. Příklady: Telnet, FTP, HTTP, DHCP, DNS. Aplikační protokoly používají vždy jednu ze dvou základních služeb transportní vrstvy: TCP nebo UDP, případně obě dvě (např. DNS). Pro rozlišení aplikačních protokolů se používají tzv. porty, což jsou domluvená číselná označení aplikací. Každé síťové spojení aplikace je jednoznačně určeno číslem portu a transportním protokolem (a samozřejmě adresou počítače). 2.2.2 Protokol IP 2.2.2.1 Funkce protokolu Data se v IP síti posílají po blocích nazývaných datagramy. Jednotlivé datagramy putují sítí zcela nezávisle, na začátku komunikace není potřeba navazovat spojení či jinak „připravovat cestu“ datům, přestože spolu třeba příslušné stroje nikdy předtím nekomunikovaly. IP v doručování datagramů poskytuje nespolehlivou službu, označuje se také jako best effort – „nejlepší úsilí“. Tj. všechny stroje na trase se datagram snaží podle svých možností poslat blíže k cíli, ale nezaručují prakticky nic. Datagram vůbec nemusí dorazit, může být naopak doručen několikrát a neručí se ani za pořadí doručených paketů. Pokud aplikace potřebuje spolehlivost, je potřeba ji implementovat v jiné vrstvě síťové architektury, typicky protokoly bezprostředně nad IP (viz 2.2.3 TCP protocol). Pokud by síť často ztrácela pakety, měnila jejich pořadí nebo je poškozovala, výkon sítě pozorovaný uživatelem by byl malý. Na druhou stranu příležitostná chyba nemívá pozorovatelný efekt. Navíc se obvykle používá vyšší vrstva, která ji automaticky opraví. 2.2.2.2 Adresování a směrování Každé síťové rozhraní komunikující prostřednictvím IP má přiřazeno jednoznačný identifikátor, tzv. IP adresu. V každém datagramu je pak uvedena IP adresa odesilatele i příjemce. Na základě IP adresy příjemce pak každý počítač na trase provádí rozhodnutí, jakým směrem paket odeslat, tzv. směrování (routing). Na starosti to mají hlavně specializované stroje označované jako směrovače (routery). 2.2.2.3 Verze IP Dnes se nejčastěji používá verze označovaná číslem 4, nazývaná IPv4. IPv6 je navrhovaný a chystaný nástupce IPv4. Internetu pozvolna docházejí adresy (přesněji - nebýt NATu a organizačních opatřeních zpřísňujících přidělování adres, zavedených v polovině 90. let, už by došly) a IPv6 má kromě jiného adresy 128bitové, které poskytují větší adresní prostor než 32bitové adresy v IPv4 (IPv4 má miliardy adres, IPv6 stovky sextiliónů). Verze 0 až 3 jsou buď rezervované, nebo nepoužité. Verze 5 (IPv5) byla použita pro experimentální proudový protokol (stream protocol). Některá další čísla verzí byla přiřazena pro experimentální
~7~
~8~
KAPITOLA: ZÁKLADNÍ POJMY A SOUČASNÉ REALIZACE
protokoly, které se v praxi neobjevují. Nejnovější verze IPv6 nahradí stávající vzhledem k faktu, že adresy IPv4 i přes provedená úsporná opatření díky rozvoji internetu stále ubývají a mezi lety 2010 až 2011 by se mohly všechny vyčerpat. Nový protokol bude klást určité nároky směrem na vybavenost osobních počítačů i jiných zařízení. Moderní operační systémy (Windows XP, Windows Vista, Mac OS X, Linux) jsou již na implementaci připravené, upravit je ale nutné i všechny síťové aplikace. 2.2.3
TCP protocol
2.2.3.1 Technický přehled TCP je spojově orientovaný protokol pro přenos toku bajtů na transportní vrstvě se spolehlivým doručováním. V současnosti je zdokumentován v IETF RFC 793. V sadě protokolů Internetu je TCP prostřední vrstvou mezi IP protokolem pod ním a aplikací nad ním. Aplikace ke vzájemné komunikaci využívají spolehlivé spojení na způsob roury, zatímco IP protokol neposkytuje takové streamy, ale jen nespolehlivé pakety. TCP používá služby IP protokolu, opakovaným odesíláním nespolehlivých paketů při ztrátě paketu zajišťuje spolehlivost a přeuspořádáváním přijatých paketů zajišťuje správné pořadí. Tím TCP plní úlohu transportní vrstvy ve zjednodušeném modelu ISO/OSI počítačové sítě. Bity 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 zdrojový port
0
cílový port
32
číslo sekvence
64
potvrzený bajt
96 128 160 192
224
offset dat
rezervováno
příznaky
okénko
kontrolní součet
Urgent Pointer volby (volitelné)
volby (pokračování)
výplň (do 32)
data
Tabulka 1 - TCP hlavička
Aplikace posílá proud (stream) 8bitových bajtů TCP protokolu k doručení sítí, TCP rozděluje proud bajtů do přiměřeně velkých segmentů (velikost segmentů je určena parametrem MTU (maximum transmission unit) linkové vrstvy sítě, ke které je počítač připojen). TCP pak předá takto vzniklé pakety IP protokolu k přepravě internetem do TCP modulu na druhé straně TCP spojení. TCP ověří, že se pakety neztratily tím, že každému paketu přidělil číslo sekvence, které se také použije k ověření, že data byla přijata ve správném pořadí.
KAPITOLA: ZÁKLADNÍ POJMY A SOUČASNÉ REALIZACE TCP modul na straně příjemce posílá zpět potvrzení pro pakety, které byly úspěšně přijaty. Pokud by se odesilateli potvrzení nevrátilo do rozumné doby (round-trip time, RTT), vypršel by odesilatelův časovač a (pravděpodobně ztracená) data by vyslal znovu. TCP protokol ověřuje, zda přenesená data nebyla poškozena šumem tím, že před odesláním spočte kontrolní součet, uloží jej do odesílaného paketu a příjemce kontrolní součet vypočte znovu a ověří, že se shodují. 2.2.3.2 TCP porty K rozlišení komunikujících aplikací používá TCP protokol čísla portů. Každá strana TCP spojení má přidruženo 16bitové bezznaménkové číslo portu (existuje 65535 portů) přidělené aplikaci. Porty jsou rozčleněny do třech skupin: dobře známé, registrované a dynamické/privátní. Seznam dobře známých portů je přiřazován organizací Internet Assigned Numbers Authority (IANA) a jsou to typicky používané systémovými procesy. Dobře známé aplikace běžící jako servery a pasivně přijímající spojení typicky používají tyto porty. Několik příkladů: FTP (port 21 a 20), SMTP (port 25), DNS (port 53) a HTTP (port 80). Registrované porty jsou typicky používané aplikacemi koncových uživatelů při otevírání spojení k serverům jako libovolná čísla zdrojových portů, ale také mohou identifikovat služby. Dynamické/privátní porty mohou být také používány koncovými aplikacemi, není to ale obvyklé.
2.3 Člověče 3D - Člověče nezlob se na PC, hra Hra je zpracovaná v pěkném 3D provedení, umožňuje hrát s dalšími hráči nebo proti počítači. Za zbývající hráče může hrát počítač. Výhodou je, že je možno hrát ve dvou a zbývající pozice zaplnit počítačem. Dál se již hraje podle standardních pravidel Člověče nezlob se. Klady • Povedené grafické zpracování • Výborná podpora síťové hry • Různé úrovně inteligence PC hráče • Chat Zápory • Nemožnost uložit rozehranou hru • Chybí přehrání Tahů Hodnocení: 9/10 Domovská stránka hry: http://clovece3d.nf-soft.com/
2.4 Člověče nezlob se (hry.divoch.cz) K hlavním přednostem této verze hry patří pěkné grafické zpracování a implementace ve flashi. Díky tomu je možné si hru zahrát kdekoliv z internetového prohlížeče. Kromě výše uvedeného není hra ničím zajímavá. Nelze hrát po síti ani ukládat rozehranou hru. Klady • •
Grafické zpracování Flash
Zápory • •
Nelze hrát po síti Nelze ukládat hru
~9~
~ 10 ~
KAPITOLA: ZÁKLADNÍ POJMY A SOUČASNÉ REALIZACE
• Chybí přehrání Tahů Hodnocení: 6/10 Stránka hry: http://hry.divoch.cz/flashludo/flashludo.php
2.5 Člověče nezlob se! (http://www.hrajonline.cz/) Online flashová hra, jejímž grafickým zpracováním je inspirována tato práce. Kromě možnosti hrát proti počítači nebo proti jinému hráči na stejném počítači nemá hra nic navíc. Klady • •
Grafické zpracování Flash
Zápory • Nelze hrát po síti • Nelze ukládat hru • Chybí přehrání Tahů Hodnocení: 4/10 Stránka hry: http://www.hrajonline.cz/clovece-nezlob-se/
2.6 Shrnutí Popsány jsou jen někteří zástupci hry Člověče nezlob se. Je jich samozřejmě mnohem víc, ale jejich zpracování nestojí za zmínku. Dá se najít hra, kterou je možné hrát přes Internet, ale nemá možnost uložit hru, případně lze najít hru, která podporuje ukládání, ale nepodporuje síťovou hru. V této práci jsou spojeny všechny výhody do jedné hry.
KAPITOLA: ANALÝZA A NÁVRH ŘEŠENÍ
~ 11 ~
3 Analýza a návrh řešení 3.1 Analýza Seznam požadavků je následující: • • • • • • • •
Hraní s ostatními hráči na stejném počítači Možnost doplnit zbývající hráče počítačem Síťová hra Ukládání hry Načtení rozehrané hry Přehrání zahraných tahů Chat Dobré grafické zpracování
3.1.1 Hraní s ostatními hráči na stejném počítači Na začátku se nastaví, že za určitý počet barev budou hrát hráči. Zbytek hráčů se nemusí hry účastnit, případně se doplní buďto počítačem, nebo síťovými hráči. Každý hráč si pamatuje, za kterou barvu táhne, a v okamžiku, kdy je na tahu, zahraje svůj tah. V případě síťové hry toto probíhá na stanici se serverem. 3.1.2 Možnost doplnit zbývající hráče počítačem Pokud nemá hráč s kým hrát, případně chce-li hrát s větším počtem hráčů a není dostatek lidí, mělo by být možné nechat za nějakou barvu tahat počítač. Počítač by měl být schopen hrát co možná nejinteligentněji a pro hráče by nemělo být snadné ho porazit. 3.1.3 Síťová hra Hra by měla podporovat hraní po síti. Sítí se rozumí nejen lokální síť, ale i internet. Jeden z hráčů založí hru na jednom počítači. Po založení hry se čeká na připojení ostatních hráčů. Klient, tj. hráč, který se připojuje na server, se připojí zadáním IP adresy. Nastane-li situace, kdy ještě nejsou připojeni všichni hráči, vypíše se uživateli zpráva, že se čeká na připojení ostatních hráčů. Hráč hrající na serveru se připojuje automaticky ihned po založení hry. 3.1.4 Ukládání hry Hra by měla být schopna uložení pozice všech figurek na hrací ploše. Dále by se měla uložit hodnota hozená na kostce, kdo je na tahu a kteří hráči se účastní hry. Historie chatu by taktéž měla být zahrnuta v ukládání. Bude se ukládat do souboru. Není možné ukládat síťovou hru. 3.1.5 Načtení rozehrané hry Hráč si vybere soubor s uloženou hrou a po potvrzení se načtou data ze souboru. Jakmile jsou data načtena, mělo by být vidět uložené rozmístění figurek, správně nastavená kostka, hrající hráč i texty. Není možné načítat síťovou hru. 3.1.6 Přehrání zahraných tahů Hra si musí pamatovat všechny zahrané tahy od začátku hry až do současného okamžiku a musí na pokyn hráče tahy s nějakým rozumným časovým intervalem přehrát.
~ 12 ~
KAPITOLA: ANALÝZA A NÁVRH ŘEŠENÍ
3.1.7 Chat Při hraní po síti spolu hráči potřebují komunikovat, proto by hra měla obsahovat chat. To co jeden hráč napíše, by se mělo zobrazit všem ostatním. Chat je přístupný pouze u síťové hry. U hry pro jednoho hráče postrádá svůj význam. 3.1.8 Dobré grafické zpracování Grafické prostředí by mělo být příjemné a intuitivní. Uživatel by měl stále vědět, kdo je na tahu, a pokud je na tahu on, měl by vědět, co dělat (např. hodit kostkou).
3.2 Návrh řešení 3.2.1 Volba operačního systému Prvním krokem je volba operačního systému. V úvahu přicházejí následující operační systémy: • • •
Microsoft Windows Unix MAC
MAC je operační systém pouze pro osobní počítače Apple a jejich zastoupení je příliš malé. Unix je na tom mnohem lépe, ale není hráči používán. Jak je již patrné, zvolil jsem systém Microsoft Windows. Má velkou podporu her a existuje do něj nepřeberné množství knihoven. Navíc práce s vlákny je v tomto operačním systému mnohem přátelštější. Aby se dalo hrát na co největším počtu verzí MS Windows, volím jeho v současnosti nejnovější verzi, tj. Windows Vista. Volím ho i z toho důvodu, že časem budou hráči donuceni na tento OS přejít. 3.2.2 Volba vývojového prostředí Programovací jazyk byl v zadání určen jako C++. Dala by se použít i Java, C# nebo Delphi. Ostatní nestojí za zmínku. Vývojových prostředí pro C++ je několik, např. Dev-C++, C++Builder, Microsoft Visual Studio a další. Všechny jmenované jsou dobré a použitelné, ale co se debutování týče, tak MS Visual Studiu nemohou konkurovat. Jako verzi jsem zvolil Visual Studio 2005. Důvodů je několik, zaprvé je zdarma k dispozici pro studijní účely a zadruhé s ním mám osobně řadu zkušeností. 3.2.3 Objektový model Jazyk C++ podporuje objektové programování, díky tomu je možné vytvořit modulární aplikaci. Aplikace je složena z několika modulů, kde každý z modulů je realizován třídou. Třídy jsou následující: Pro klienta • • • • • • • •
Pravidla GUI o MsgList AI Timer Policko CInputBox Data Game
KAPITOLA: ANALÝZA A NÁVRH ŘEŠENÍ •
~ 13 ~
Server
Pro server •
Server
Každá třída je specializovaná na svůj účel. Tím pádem pokud budu chtít např. změnit grafický vzhled hry, stačí napsat třídu, která bude mít stejné rozhraní jako současná třída GUI, a místo v SDL se může vykreslovat třeba v OpenGL. 3.2.4 Význam tříd 3.2.4.1 Pravidla Obsahuje pravidla hry. Z potomků by se daly vytvořit různé varianty hry, např. klasické Člověče nezlob se, nebo by bylo možné přidat nějaké pravidlo, například, že se smí táhnout v protisměru, ale ne přes své startovací pole apod. 3.2.4.2 GUI (Graphical User Interface) Obsahuje prostředky pro práci s grafickým rozhraním hry. Zajišťuje veškeré prostředky pro komunikaci s hráčem: výpis zpráv, animace hodu kostkou, pohyb figurek, odchytávání událostí myši a klávesnice atd. Potomci by mohli být uplatněni pro různé herní plány, vzhled figurek apod. 3.2.4.2.1 MsgList Podtřída GUI. Jedná se o strukturu uchovávající informaci o zprávě. Každá zpráva obsahuje text zprávy, souřadnici X a Y. 3.2.4.3 AI (Artificial intelligence) „Umělá inteligence“ vyhodnocuje situaci na herním plánu a provádí tah počítače. Potomci by mohli představovat různou obtížnost 3.2.4.4 Timer Časovač – slouží k vkládání prodlevy mezi jednotlivými akcemi 3.2.4.5 Policko Ovládá jednotlivá políčka na herním plánu, pamatuje si jejich pozici, kdo na ní stojí, nebo nestojí atd. 3.2.4.6 CInputBox Dialogové okno s polem pro vstup uživatele. Ve hře použito pro zadání IP adresy. 3.2.4.7 Data Tato třída obsahuje společné informace pro všechny třídy. 3.2.4.8 Server u klienta Kontroluje komunikaci se serverem. Veškerá síťová komunikace je spravována touto třídou. 3.2.4.9 Server u serveru Obstarává funkci serveru. Spravuje všechna vlákna a stará se o jejich synchronizaci. Funguje jako hub na síti. Ke každému vláknu je připojen klient. Vlákno přijme update a pošle ho na všechny ostatní vlákna kromě toho, ze kterého update přišel.
~ 14 ~
KAPITOLA: ANALÝZA A NÁVRH ŘEŠENÍ
3.2.5 Class diagram klienta class Clov ece
EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version Prav idla «enumeratio...
CInputBox
-
debug: bool
- m_hFont: HFONT EA prazdno 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version - m_hInst: HINSTANCE zelena cervena zluta modra
+
m_hWndCancel: HWND m_hWndEdit: HWND m_hWndInputBox: HWND m_hWndOK: HWND m_hWndParent: HWND m_hWndPrompt: HWND Text: LPTSTR
+ + + + + + + + + -pravidla + + + +
cilovePole(int) : int dalsiHrac() : void jeKonec() : int lzeTahnout(int) : bool lzeTahnout() : bool lzeVyhodit(int, int) : bool netReady() : bool pocetHracu() : int Pravidla() ~Pravidla() resetujHraciPlochu() : void spReady() : bool vypisKdoJeNaTahu() : char*
EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version Policko
EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version - barva:Version int «enumeratio...
-
sirka: int vyska: int
-
y: int
+ CInputBox(HWND) EA Nehraje 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version - x: intVersion + + -
PC Hrac
~CInputBox() DoModal(LPCTSTR, LPCTST R) : BOOL WndProc(HWND, UINT, WPARAM, LPARAM) : LRESULT
+ getbarva() : int EA Net 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version + +
getSirku() : int getVysku() : int
-pravidla
+ getx()Version : int EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version -hraciPlocha + gety() : int +
Data
nastav(int, int, int, int, int) : void
+ Policko(int, int, int, int, int) EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version -m_poInstance + Policko() - cdepth: int +
+ +
connected: int ([4])
pridejFigurku(int) : void zmenBarvu(int) : void
+ dalsi: int AI EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version + FRAMES_PER_SECOND: int = 60 {readOnly} -
hraci: int ([5]) hraciPlocha: Policko ([pocetPoli])
+ +
chatRcvdMsg: char ([BUFSIZE]) ipServeru: char ([20])
-
m_poInstance: Data* naTahu: int
-
pravidla: Pravidla*
EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version + chatMsg: std::string + AI(Pravidla*) Game
+ +
~AI() getTah() : int
kamVyhodit(Pravidla) : int kamVyhodit(int) : int
- kostka: int EA 7.0 Unregistered Trial Version EA 7.0- Unregistered Trial Version EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version - jenKsobe(int) : bool ai: AI* -
gui: GUI* hThread: HANDLE
+
-
MP: bool pi: PROCESS_INFORMATION
-
+ pocetPoli: int = 72 {readOnly}Trial Version - najdiMax(int) : int Version hThreadChat: HANDLE EA 7.0 Unregistered EA 7.0- Unregistered Trial Version EA 7.0 Unregistered Trial EA 7.0 Unregistered Trial Version -
resx: int resy: int
nasadi(Policko*, int, int) : bool pfch(int) : int
- pmd(Pravidla, int) : int pravidla: Pravidla* Trial Version EA 7.0 Unregistered Trial Version EA 7.0-- Unregistered EA 7.0 Unregistered Version EA 7.0 Unregistered Trial Version -ai - projde(int)Trial - Data() : bool server: Server* +
~Data() Delete() : void
+ +
getHraci() : int* getHraciPlocha() : Policko*
+ + + + + + + + +
getKostka() : int getNaTahu() : int getResx() : int getResy() : int setCdepth(int) : void setKostka(int) : void setNaTahu(int) : void setResx(int) : void setResy(int) : void
-
-
si: STARTUPINFO
ukchs(int) : int
- zaPolovinou(int) : bool update: int EA 7.0 Unregistered Trial Version EA 7.0-- Unregistered Trial Version EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version + getCdepth() : int vyhodil: int -
DomFromCOM() : IXMLDOMDocument*
+ + + + + -
exit() : void ~Game()
+ GetInstance() : Data* EA 7.0 Unregistered Trial Version EA 7.0- Unregistered EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version dprintf(char*, ...) : voidTrial Version GUI
- event: SDL_Event Game(Pravidla*) EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version - figurky: SDL_Surface* ([4]) hodKoskou(bool) : bool hrajePc() : bool
-
font: TTF_Font* hod_kostkou: SDL_Rect ([9])
-
hrac: SDL_Rect kostka: SDL_Rect ([ 6 ])
-
pocetZprav: int pocitac: SDL_Rect
ChatRcv(LPVOID) : DWORD EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version EA 7.0 Unregistered EA 7.0 Unregistered Trial Version - hPuntik: intTrial Version checkKeys() : void joinAndWait() : bool
kamVyhodit() : int EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version - kostky: SDL_Surface* loadGame(LPWSTR) : int MyT hreadFunction(LPVOID) : DWORD play(bool) : int
- pozadi: SDL_Surface* EA 7.0 Unregistered Trial Version EA 7.0 Unregistered EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version provedTah(int) : int Trial Version -
restart() : void saveGame(LPWSTR) : int
puntik: SDL_Surface* scoreSurface: SDL_Surface*
Serv er - screen: SDL_Surface* EA 7.0 Unregistered Trial Version EA 7.0 Unregistered start() : bool Trial Version EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version - SCREEN_BPP: int -
buf: char ([BUFSIZE]) data: WSADATA
+ -
host: hostent* hostname: char ([MAXLEN]) chatBuf: char ([BUFSIZE]) chatData: WSADATA chatPort: int chatSock: sockaddr_in chatSocket: SOCKET mySocket: SOCKET port: int pos: size_t serverSock: sockaddr_in wVersionRequested: WORD
+ + + + + + + + + + + + + -
allConnected() : DWORD close() : bool getNextClient(LPVOID) : DWORD getNextNumber() : int getString(int) : char* chatConnect(GUI*) : bool chatSendMsg(char*) : int checkUpdate(char*) : bool recvHrace() : void recvChatMsg() : bool recvUpdate() : int sConnect(GUI*) : bool sendMsg(char*) : int sendUpdate() : int ~Server() Server() WSAPrintError(int) : void
startServer(int) : void tah() : int
-gui
-
SCREEN_HEIGHT: int
- SCREEN_WIDTH: int - debug: bool vyhod(int) : void EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version - shod: SDL_Surface* waitForClients() : bool zobrazJoinMenu() : void
-
shrac: SDL_Rect sirkaFigury: int
-
spridat: SDL_Rect sstart: SDL_Rect
-
start_fig: SDL_Surface* start_figurky: SDL_Rect ([9])
-server EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version - sirkaPole: int Timer
bool - start: SDL_Rect EA 7.0 Unregistered Trial Version --EApaused: 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version pausedTicks: int «struct» GUI::MsgList
-
started: bool startT icks: int
+ +
get_ticks() : int is_paused() : bool
+ + + + +
pause() : void start() : void stop() : void T imer() unpause() : void
- textColor: SDL_Color EA 7.0 Unregistered Trial Version EA 7.0 Unregistered+ Trial Version EA-zpravy 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version x: int - vyskaFigury: int + +
y: int zprava: char ([BUFSIZE])
-
vyskaPole: int
- wPuntik: int : bool EA 7.0 Unregistered Trial Version +EAis_started() 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version - zprava: SDL_Surface* -
zpravy: MsgList ([10])
EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trialint,Version 7.0 Unregistered - apply_surface(int, SDL_Surface*,EA SDL_Surface*, SDL_Rect*) : void Trial Version + +
exit() : bool getHandlerOkna() : HWND
+ +
getZpravy() : MsgList* ~GUI()
+ getTah() : int EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version
+ GUI(int, int, Trial int) EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Version EA 7.0 Unregistered Trial Version + +
handleEvent() : bool input() : int
- load_image(std::string, Uint32, Uint32, Uint32) : SDL_Surface * EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version + nastavHraciPlochu() : void + +
openDialog() : LPWSTR pohniFigurkou(int, int) : void
+ +
PressedEnter(char&) : bool saveDialog() : LPWST R
+ +
setXzpravy(int, int) : void setYzpravy(int, int) : void
EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Version EA 7.0 Unregistered Trial Version + posun(int) : Trial void EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version + setTextZpravy(char*, int) : void + vyhodFigurku(int, int) : void EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trialint,Version EA 7.0 Unregistered Trial Version + + + + + + + + +
vyhodnotKlik(int, int) : int vyhodOkno(string) : void vyhozeno(int) : int vykresliPlochu(bool, bool) : void vypisViteze(int) : void vypisZpravu(char*, int, bool, int, int) : bool waitForCube() : int zobrazMenu() : int zobrazStavServeru() : int zobrazWaiting() : int
EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version
Obrázek 2 - Class diagram klienta
KAPITOLA: REALIZACE
~ 15 ~
4 Realizace 4.1 Data Třída Data je realizována jako datový typ singleton. Třída nemá veřejný konstruktor. Místo toho se volá veřejnou, statickou funkcí getInstance, která při prvním volání vrací ukazatel na nový objekt Data a při jakémkoliv dalším volání vrací ukazatel na již existující objekt typu Data. Kód pak vypadá následovně: class Data { private: static Data* m_poInstance; //nejake další promenne a funkce Data(); ~Data(); public: static Data* GetInstance(); // mnoho promennych a funkci };
Data* Data::GetInstance() { if (m_poInstance == NULL) { m_poInstance = new Data(); } return m_poInstance; }
Tímto způsobem lze pohodlně sdílet data mezi třídami.
4.2 Grafické rozhraní 4.2.1 Obrázky Grafické rozhraní je realizováno grafickou knihovnou SDL. Po inicializaci jsou načteny obrázky. Formát obrázků stojí za povšimnutí. Nejen, že jsou podporovány komprimované formáty, např. PNG, ale i výřezy. Obrázek samotný je složen z několika malých obrázků. Výřez se provádí zadáním souřadnic x a y levého horního rohu výřezu a šířkou a výškou. Tyto čtyři parametry jsou dostatečné k určení oblasti pro výřez. Zdrojový kód pak vypadá takto: SDL_Surface *kostky; SDL_Rect kostka[6]; kostky = load_image( "img/kostka.png", 0, 0x99, 0); kostka[ kostka[ kostka[ kostka[ kostka[ kostka[
0 1 2 3 4 5
].x ].x ].x ].x ].x ].x
= = = = = =
0; kostka[ 0 ].y = 0; kostka[ 0 ].w = 79; kostka[ 0 ].h = 83; 79; kostka[ 1 ].y = 0; kostka[ 1 ].w = 79; kostka[ 1 ].h = 83; 158; kostka[ 2 ].y = 0; kostka[ 2 ].w = 79; kostka[ 2 ].h = 83; 237; kostka[ 3 ].y = 0; kostka[ 3 ].w = 79; kostka[ 3 ].h = 83; 316; kostka[ 4 ].y = 0; kostka[ 4 ].w = 79; kostka[ 4 ].h = 83; 395; kostka[ 5 ].y = 0; kostka[ 5 ].w = 79; kostka[ 5 ].h = 83;
apply_surface( 450, 368, kostky, screen, &kostka[ data->getKostka()-1 ] ); SDL_Flip(screen);
Typ SDL_Surface je možné vykreslit na obrazovku. Typ SDL_Rect určuje oblast výřezu z SDL_Surface. Nejprve se načte do proměnné kostky obrázek img/kostka.png (Obrázek 3 - kostka) se
~ 16 ~
KAPITOLA: REALIZACE
všemi kostkami. Funkce load_image() požaduje 4 parametry. První je cesta a zbylé 3 označují průhlednou barvu (RGB). Dále se definují výřezy pro jednotlivé hodnoty hozené na kostce. Funkce apply_surface() přidá na plochu obrázek. První dva parametry jsou souřadnice, následuje obrázek, další parametr je plocha, na kterou se má obrázek přidat a poslední parametr je výřez. Jelikož je výřez uložen v poli, musí se zadat index pole. V tomto případě je index pole hodnota na kostce – 1, protože indexujeme od nuly, nikoliv od jedničky.
Obrázek 3 - kostka
4.2.2 Uživatelské vstupy aneb klávesnice a myš Události klávesnice a myši jsou odchytávány do nějaké proměnné. Je potřeba je pravidelně kontrolovat a podle hodnoty proměnné poznáme, jestli došlo k nějaké události, nebo ne. Následující příklad ilustruje odchytávání události myši. int GUI::getTah(){ while (SDL_PollEvent( &event )) { //pokud stiskne mys if( event.type == SDL_MOUSEBUTTONUP ) return vyhodnotKlik(event.button.x, event.button.y); if( event.type == SDL_QUIT ) return -1; Sleep(20); } return -3; }
Funkce getTah() vyžaduje, aby uživatel klikl myší, nebo zavřel okno s hrou. Je realizována velice jednoduše. SDL_PollEvent( &event ) uloží do proměnné event událost, která nastala. Pokud je událost puštění tlačítka myši, zavolá se funkce vyhodnotKlik(), která ze souřadnic vrátí index políčka, na které bylo klepnuto, a tuto hodnotu pak vrací i samotná funkce getTah(). Pokud hráč neklepl na políčko, vrací funkce vyhodnotKlik() hodnotu -2. Chtěl-li uživatel zavřít okno (SDL_QUIT), vrací se hodnota 1. Funkce Sleep() program na malou chvíli uspí, aby nedocházelo k aktivnímu čekání a zbytečnému vytížení procesoru. S klávesnicí je to podobné. Příklad na ukázku: bool GUI::PressedEnter(char& c) { if (!SDL_PollEvent( &event ) && (event.type != SDL_KEYDOWN)) return false; if (event.type == SDL_KEYDOWN) { c = event.key.keysym.sym; while (!SDL_PollEvent( &event ) && event.type != SDL_KEYUP) Sleep(10); if (c == SDLK_RETURN) return true; } return false; }
Funkce PressedEnter() vrací true, pokud byla stisknuta klávesa enter. V ostatních případech vrací false. První podmínka znamená, pokud nebyla stisknuta klávesa, vrať false. Druhá podmínka řeší situaci, kdy byla stisknuta klávesa. Uloží do návratové proměnné c znak, který byl na klávesnici
KAPITOLA: REALIZACE
~ 17 ~
stisknut. Pak se čeká, dokud není klávesa uvolněna. Otestuje se, zda nebyl stisknut enter a podle toho se vrací true, nebo false. 4.2.3 Dialogy 4.2.3.1 Informační dialog Pro dialogy se používá volání api funkcí Windows. Pro informační zprávy aplikace používá funkci MessageBox(). MessageBox(gui->getHandlerOkna(),TEXT("Nelze spustit hru. Hry pro jednoho hrace se nesmi ucastnit zadni sitovi hraci a minimalne dva hraci celkem."), TEXT("Informace o spusteni hry"), MB_ICONINFORMATION);
První argument představuje handler okna. Získává se z SDL ve funkci getHandlerOkna. Druhý argument je zobrazovaná zpráva, třetí je titulek okna zprávy a poslední představuje informace o okně (jakého typu je, jaká tlačítka obsahuje apod.). 4.2.3.2 Dialog pro ukládání a nahrávání Dialog pro ukládání má stejný základ jako pro nahrávání. Liší se pouze funkcí vyvolávající okno. OPENFILENAME savefilename; WCHAR szPath[1024]; WCHAR szDir[1024]; static const WCHAR szDefaultExt[] = { 'x','m','l',0 }; static const WCHAR txt_files[] = { '.','x','m','l',0 }; ZeroMemory(&savefilename, sizeof(savefilename)); GetCurrentDirectory(sizeof(szDir), szDir); lstrcpy(szPath, txt_files); savefilename.lStructSize = sizeof(savefilename); savefilename.hwndOwner = getHandlerOkna(); savefilename.lpstrFile = szPath; savefilename.nMaxFile = sizeof(szPath); savefilename.lpstrInitialDir = szDir; savefilename.lpstrFilter = TEXT("Clovece Save Files\0*.xml\0\0"); savefilename.Flags = OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST |OFN_HIDEREADONLY; savefilename.lpstrDefExt = szDefaultExt; if (GetSaveFileName(&savefilename)) return savefilename.lpstrFile; else return TEXT("");
OPENFILENAME představuje objekt souboru. I přes své jméno se tento typ používá jak pro načítání, tak pro ukládání. Nastaví se požadované parametry okna, jako akceptovatelné přípony, cesta do současného adresáře, název a filtr zobrazených souborů a flagy, určijící vlastnosti zobrazení dialogu (které soubory zobrazí a které ne). Samotný dialog se vyvolá funkcí GetSaveFileName(&savefilename), která vrací true, pokud uživatel klepl na tlačítko save a do proměnné filename uloží informace o vybraném souboru. Dialog pro načtení souboru je naprosto stejný, pouze se vyvolává funkcí GetOpenFile0ame(). 4.2.3.3 Dialog pro zadávání Je použit pro zadání IP adresy. Dokumentace k objektu CInputBox lze nalézt na stránkách http://www.codeproject.com/KB/dialog/inputbox.aspx. Volání vypadá následovně. CInputBox ibox(gui->getHandlerOkna()); if (ibox.DoModal(TEXT("Pripojeni k serveru"), TEXT("Zadejte IP adresu serveru"))) _snprintf_s(data->ipServeru,20,20,"%S",ibox.Text);
~ 18 ~
KAPITOLA: REALIZACE
Dialog je vyvolán funkcí DoModal(), jejíž první parametr určuje název okna a druhý Výzvu pro uživatele, aby věděl, co má zadat. Funkce _snprintf_s() kopíruje hodnotu zadanou v dialogu do proměnné data->ipServeru.
4.3 Umělá inteligence Umělá inteligence je tvořena sadou podmínek. Při splnění podmínky se přidává nebo odebírá bodové hodnocení u dané varianty. Varianta s největším počtem bodů je pak zahrána.
4.4 Formát updatu Update je zpráva, kterou posílá klient všem ostatním klientům prostřednictvím serveru. Obsahuje informace o aktuálním rozložení hry. Posílá se jako nezašifrovaný text. Každá hodnota je oddělena středníkem. První hodnota určuje, kdo je na tahu, druhá představuje hodnotu na kostce a zbytek jsou informace o jednotlivých políčkách. Jestli na něm stojí figurka, jaké má souřadnice apod. Určitě by update šel zašifrovat a posílat by se daly jen změny. V takovém případě by byl update mnohem menší. Zvolil jsem první variantu, protože je jednodušší na implementaci.
4.5 Chat Chat je naprosto nezávislý na všem ostatním. Běží na samostatných vláknech, a je tedy nezávislý jak na klientovi, tak na serveru. Má dokonce i vlastní port, na kterém komunikuje. Chová se opět jako hub, tzn., že pošle přijatou zprávu na všechny ostatní klienty kromě toho, ze kterého přišla. Na serveru je vlákno pro každého klienta pro příjem zpráv. Pro odesílání slouží jiné vlákno, společné pro všechny. Jakmile přijde zpráva, je uložena do nějaké statické proměnné a postupně odeslána všem připojeným klientům. Do statické proměnné proto, že do ní lze přistupovat z různých vláken.
4.6 Synchronizace vláken serveru Server je tvořen vícevláknově. Každé vlákno představuje jedno síťové připojení. Připojení hráče na serveru je realizováno přes loopback. Diagram ukazuje synchronizaci vláken na serveru.
KAPITOLA: REALIZACE sd Serv er
~ 19 ~
EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version Hlavní vlákno Vlakno 1 Vlakno 2 Vlakno 3 Vlakno 4 EA 7.0 Unregistered Trial(Prvni Version EA 7.0 Unregistered Trial (Vlakno Version EA 7.0 Unregistered Trial Version Klient) Serveru)
EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version Vytvor vlakno() Posli stav hracu
EA 7.0 Unregistered Trial Versionporeseno() EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version Uspi v lákno EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version
Nav azano spoj eni s klientem
Vytvor vlakno() Probud vlakno() EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version Posli stav hracu
poreseno()
Posli stav hracu
EA 7.0 Unregistered Trial Version poreseno() EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version Uspi v lakno EA 7.0 Unregistered Trial Version Uspi v lakno EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version
Nav azano spoj eni s klientem
Vytvor vlakno() probud vlakno()
EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version Posli stav hracu
EA 7.0 Unregistered Trial Versionprobud EAvlakno() 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version Posli stav hracu
Posli stav hracu
EA 7.0 Unregistered Trial Versionporeseno() EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version poreseno() poreseno() Trial Version EA 7.0 Unregistered EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version Uspi v lakno Uspi v lakno
Uspi v lakno prirad handle()
EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version probud vlakno()
toto v lakno se nev ytv ori, j e stej ne j ako v lakno serv eru.
probud vlakno()
EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version probud vlakno()
Posli stav hracu
stav hracu EA 7.0 Unregistered Trial EA 7.0 Unregistered TrialPosli Version EA 7.0 Unregistered Trial Version PosliVersion stav hracu poreseno()
EA 7.0 Unregistered Trial Version poreseno() EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version poreseno()
Uspi v lakno
Uspi v lakno
Uspi v lakno
a cekej na update) Trial Version EA 7.0 Unregistered Trial Version probud EAvlakno(usni 7.0 Unregistered EA 7.0 Unregistered Trial Version probud vlakno(usni a cekej na update)
EA 7.0 Unregistered EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version probud vlakno(cekej naTrial update) Version Uspi v lakno
Uspi v lakno Cekam na update
EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version Prij at update
EA 7.0 Unregistered Trial Versionprobud EAvlakno() 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version probud vlakno(cekej na update)
EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version Uspi v lakno
Vlakno posle update
Vlakno posle update
EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version Cekam na update
Uspi v lakno
EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version EA 7.0 Unregistered Trial Version Obrázek 4 - Synchronizace vláken serveru
Vlákna korespondují s pořadím hráčů ve hře. První vlákno vždy určuje zeleného hráč, druhé vlákno červeného atd. Zobrazený diagram je pro situaci, kdy jsou hráči přiřazeni následovně: • • • •
Zelený – Síťový hráč Červený – Síťový hráč Žlutý – Hráč Modrý - PC
~ 20 ~
KAPITOLA: REALIZACE
Pokud některý z hráčů nehraje, je vlákno označeno jako NULL. Na začátku je potřeba navázat spojení se všemi klienty. Tento proces zachycuje větší část obrázku. Nejprve běží hlavní vlákno serveru, které obdrží update od klienta, který zakládal server. V tomto updatu se nastaví hráči, určí se, které vlákno bude prvního hrajícího hráče a které bude vlákno serveru. V tento okamžik začíná diagram. Vytvoří se vlákno serveru, tj. vlákno první barvy, která hraje na klientovi hrajícím na počítači se serverem. Jakmile je vlákno vytvořeno, oznámí se to hlavnímu vláknu, které nyní může přijmout další spojení. Hlavní vlákno přijme spojení, vytvoří vlákno, pošle klientovi update, potvrdí hlavnímu vláknu, že dokončilo svou práci a usne. Hlavní vlákno je nyní připraveno přijmout další spojení. Jakmile ho klient otevře, vytvoří pro něj příslušné vlákno, pošle mu update o hráčích účastnících se hry, za kterého hráče hraje a usne. Jakmile by měla hra vytvořit vlákno pro dalšího hráče hrajícího na serveru, tak mu ho nevytvoří, ale pouze přiřadí odkaz na již existující vlákno, které obsluhuje klienta na serveru. Když jsou všichni hráči připojeni, probudí hlavní vlákno všechna ostatní, ale tentokrát jim sdělí, že již nebudou další klienti, ale aby čekali na update. Zároveň také vláknu, které obsluhuje prvního hrajícího hráče, řekne, že nemá usínat, ale čekat na update. Ostatní vlákna usnou. V okamžiku, kdy vlákno přijme update od klienta, probudí všechny ostatní, kteří jej pošlou svým svěřeným klientům. Mohou nastat 2 situace. Buď má dále hrát stejný hráč, v takovém případě ostatní vlákna usnou a opět čekají na update, nebo má hrát jiný hráč a v takovém případě vzbudí vlákno všechny ostatní, přičemž jednomu z nich řekne, aby po odeslání updatu čekal na další od svého klienta, a samotné vlákno usne. Tento proces se opakuje až do konce hry.
KAPITOLA: TESTOVÁNÍ
~ 21 ~
5 Testování Funkci jsem vložil do cyklu a postupně ji spouštěl se všemi možnými vstupy, které jsem následně kontroloval. Tento způsob testování zaručí správnou funkci funkcí. Betatestování proběhlo jedné noci, kdy jsme s kolegou hráli po síti a hledali chyby. Hráli jsme na počítačích s konfiguracemi: PC1
PC2
•
AMD Athlon 64 X2 Dual Core 4000+
•
Intel Centrino Duo 1,8GHz
•
6GB RAM
•
1 GB RAM
•
ATI Radeon 7600 GS
•
Mobile Intel ® 945 Express
•
Windows Vista SP1
•
Windows XP SP2
Na obou konfiguracích probíhala hra po odstranění několika chyb v pořádku a plynule. Testovali jsme i chat a všechny znaky posílal v pořádku. Test ukládání a nahrávání probíhal na PC1. Během testu bylo vytvořeno 10 XML souborů. Každý soubor představoval jednu uloženou hru. Struktura všech souborů odpovídala předpokladu a test byl prohlášen za úspěšný. Nahrávání souborů probíhalo velice podobně. Po nahrání hry se vždy správně rozestavily figurky. Byly správně vypsané zprávy, nastavený právě hrající hráč, kostka. Přehrávání tahů rovněž fungovalo vždy bez problémů. Program si poradil i s neplatnými vstupními soubory. Při podstrčení nesprávného souboru byly načteny pouze správně zformátované údaje. Například na prázdný soubor hra nereagovala vůbec. Při odebrání některé části souboru se načetlo vše kromě odebrané části. Program je přeložen v prostředí MS Visual Studio 2005 kompilátorem C/C++ pro 32 bitovou platformu. Verze kompilátoru je 14.00.50727.762 for 80x86. Je tedy 32 bitový, ale bez problému si s ním poradí i 64 bitové procesory.
~ 22 ~
KAPITOLA: TESTOVÁNÍ
KAPITOLA: ZÁVĚR
~ 23 ~
6 Závěr Práce prošla mnoha stádii vývoje. První verze byla napsána v neobjektovém C++ a v prostředí DEVC++. Postupně hra získala objektový základ a byly přidány síťové prvky. Nejobtížnější na implementaci byla pravděpodobně serverová část a synchronizace vláken. Časově závislé chyby provázely hru až téměř do konce. Naštěstí se mi jich většinu z nich podařilo odstranit. Bohužel se to nedá říct jistě, protože jsem neobjevil způsob, jak toto otestovat. Vhodné by bylo vytvořit lepší grafické rozhraní, např. v OpenGL. Tím by bylo možné hru zobrazit prostorově a dala by se přidat i různá světla a stíny. Animace by hru taktéž příjemně oživily. Chat by mohl mít vlastní okno a místo dialogů Windows by byly hezké nějaké vlastní. Daly by se přidat další varianty pravidel a různé obtížnosti inteligence počítače.
~ 24 ~
KAPITOLA: LITERATURA
KAPITOLA: LITERATURA
7 Literatura [1]
WIKIPEDIE, OTEVŘENÁ ENCYKLOPEDIE http://cs.wikipedia.org/
[2]
DESKOVEHRY.CZ
[3]
T HE CODE PROJECT – YOUR DEVELOPMENT RESOURCE http://www.codeproject.com/KB/dialog/inputbox.aspx
[4]
K336 INFO - POKYNY PRO PSANÍ BAKALÁŘSKÝCH PRACÍ. https://info336.felk.cvut.cz/clanek.php?id=504
[5]
SIMPLE DIRECTMEDIA L AYER http://libsdl.org/
- PORTÁL OD HRÁČŮ PRO HRÁČE http://www.deskovehry.cz/
~ 25 ~
~ 26 ~
KAPITOLA: LITERATURA
KAPITOLA: PŘÍLOHA A - OBSAH PŘILOŽENÉHO CD
PŘÍLOHA A - Obsah přiloženého CD •
clovece o img cf.png hod.png ikona.bmp kostka.png mf.png plocha.png start_figurky.png zf.png zf1.png AI.cpp AI.h arial.ttf clovece.idc clovece.vcproj data.cpp Data.h Game.cpp Game.h GUI.cpp GUI.h InputBox.cpp InputBox.h main.cpp policko.h Pravidla.cpp Pravidla.h Server.cpp Server.h timer.cpp timer.h
•
29 kB Obrázek červené figurky 29 kB Obrázek animace hodu kostkou 3 kB Ikona aplikace 2 kB Obrázky kostek po hodu 259 kB Obrázek modré figurky 3 kB Obrázek plochy 60 kB Obrázky položek na startovní obrazovce 2 kB Obrázek zelené figurky 2 kB Obrázek žluté figurky
7 kB Soubor s definicí třídy AI 359 kB Soubor s deklarací třídy AI 1 kB Soubor fontu 1 kB Soubor vytvořený Visual Studiem 1 kB Soubor vytvořený Visual Studiem 2 kB Soubor s definicí třídy Data 2 kB Soubor s deklarací třídy Data 1 kB Soubor s definicí třídy Game 33 kB Soubor s deklarací třídy Game 33 kB Soubor s definicí třídy GUI 7 kB Soubor s deklarací třídy GUI 7 kB Soubor s definicí třídy InputBox 1 kB Soubor s deklarací třídy InputBox 1 kB Startovací soubor 1 kB Soubor s deklarací třídy policko 14 kB Soubor s definicí třídy Pravidla 1 kB Soubor s deklarací třídy Pravidla 18 kB Soubor s definicí třídy Server 2 kB Soubor s deklarací třídy Server.h 1 kB Soubor s definicí třídy Timer 1 kB Soubor s deklarací třídy Timer
release o img cf.png hod.png ikona.bmp kostka.png mf.png plocha.png start_figurky.png
29 kB Obrázek červené figurky 29 kB Obrázek animace hodu kostkou 3 kB Ikona aplikace 2 kB Obrázky kostek po hodu 259 kB Obrázek modré figurky 3 kB Obrázek plochy 60 kB Obrázky položek na startovní obrazovce
~ 27 ~
~ 28 ~
KAPITOLA: PŘÍLOHA A - OBSAH PŘILOŽENÉHO CD zf.png zf1.png arial.ttf clovece.exe clovece.pdb jpeg.dll libfreetype-6.dll libpng12-0.dll libtiff-3.dll SDL.dll SDL_image.dll SDL_ttf.dll Server.exe Server.pdb zlib1.dll
•
359 kB 100 kB 111 kB 417 kB 417 kB 128 kB 313 kB 313 kB 40 kB 19 kB 40 kB 69 kB 69 kB
Obrázek zelené figurky Obrázek žluté figurky
Soubor fontu Binárka aplikace Soubor vytvořený Visual Studiem Knihovna pro práci s jpeg soubory Knihovna SDL Knihovna SDL pro práci s png Knihovna SDL pro práci s tiff Knihovna SDL Knihovna SDL pro práci s obrázky Knihovna SDL Binárka serveru Soubor vytvořený Visual Studiem Knihovna SDL
Server main.cpp Server.cpp Server.h Server.vcproj
•
2 kB 2 kB
Startovací soubor serveru 499 B 24 kB Soubor s definicí třídy Server 4 kB Soubor s deklarací třídy Server 4 kB Soubor vytvořený Visual Studiem
Text Bakalarska_prace-David_Kubat.pdf 468 kB Text bakalářské práce clovece.EAP 2 434 kB Class diagram v Enterprise Architektu clovece.ncb 1 kB Soubor vytvořený Visual Studiem clovece.sln 216 kB Solution pro MS Visual Studio 2005 clovece.suo 216 kB Soubor vytvořený Visual Studiem Readme.txt 2 134 kB Popisuje jak spustit aplikaci a co požaduje server_flow.EAP 2 134 kB Class diagram v Enterprise Architektu