Univerzita Karlova v Praze Matematicko-fyzik´aln´ı fakulta
´ RSK ˇ ´ PRACE ´ BAKALA A
ˇ Michal Cevora KBang Katedra aplikovan´e matematiky
Vedouc´ı bakal´aˇrsk´e pr´ace: Mgr. Bernard Lidick´ y Studijn´ı program: Informatika, programov´an´ı
2009
R´ad bych podˇekoval Mgr. Bernardu Lidick´emu za veden´ı roˇcn´ıkov´eho projektu a bakal´aˇrsk´e pr´ace a za poskytnut´ı mnoha cen´ ych rad. D´ale bych chtˇel podˇekovat vˇsem lidem, kteˇr´ı se z´ uˇcastnili testov´an´ı projektu.
Prohlaˇsuji, ˇze jsem svou bakal´aˇrskou pr´aci napsal samostatnˇe a v´ yhradnˇe s pouˇzit´ım citovan´ ych pramen˚ u. Souhlas´ım se zap˚ ujˇcov´an´ım pr´ace a jej´ım zveˇrejˇ nov´an´ım. ˇ Michal Cevora
V Praze dne 28. 5. 2009
2
Obsah ´ 1 Uvod
7
2 Z´ akladn´ı koncepty a anal´ yza probl´ em˚ u hry 2.1 Hern´ı plocha . . . . . . . . . . . . . . . . . . 2.2 Tahy a stˇr´ıd´an´ı hr´aˇc˚ u. . . . . . . . . . . . . 2.3 Probl´em zapomenut´ı vlastnosti . . . . . . . 2.4 Probl´em identifikace karet . . . . . . . . . . 3 Architektura 3.1 Obecn´e koncepty . . . . . . . . . 3.1.1 Komunikaˇcn´ı protokol . . 3.1.2 Identifikace hr´aˇc˚ u . . . . . 3.1.3 Identifikace karet . . . . . 3.1.4 Kapsy . . . . . . . . . . . 3.1.5 Hern´ı stavy a kontext hry 3.2 Server . . . . . . . . . . . . . . . 3.2.1 Klient . . . . . . . . . . . 3.2.2 Vytv´aˇren´ı her . . . . . . . 3.2.3 Hr´aˇc . . . . . . . . . . . . 3.2.4 Vytv´aˇren´ı hr´aˇc˚ u. . . . . . 3.2.5 Pr˚ ubˇeh hry . . . . . . . . 3.3 Klient . . . . . . . . . . . . . . . 3.3.1 Pohyb karet . . . . . . . . 3.3.2 Zmˇena poˇctu ˇzivot˚ u. . . . 3.3.3 Zmˇena kontextu hry . . . 3.3.4 Hern´ı akce . . . . . . . . .
3
. . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .
. . . .
. . . . . . . . . . . . . . . . .
. . . .
. . . . . . . . . . . . . . . . .
. . . .
. . . . . . . . . . . . . . . . .
. . . .
. . . . . . . . . . . . . . . . .
. . . .
. . . . . . . . . . . . . . . . .
. . . .
. . . . . . . . . . . . . . . . .
. . . .
. . . . . . . . . . . . . . . . .
. . . .
. . . . . . . . . . . . . . . . .
. . . .
9 9 10 11 12
. . . . . . . . . . . . . . . . .
14 14 14 15 15 16 16 17 17 18 18 18 18 19 19 19 20 20
4 Implementace 4.1 Knihovna Qt4 . . . . . . . . . . . 4.2 Common . . . . . . . . . . . . . . 4.2.1 Parser . . . . . . . . . . . 4.2.2 Config . . . . . . . . . . . 4.3 Server . . . . . . . . . . . . . . . 4.3.1 Tˇr´ıda GameServer . . . . 4.3.2 Vnitˇrn´ı implementace hry 4.3.3 Implementace karet . . . . 4.3.4 Ovladaˇce hr´aˇce . . . . . . 4.4 Klient . . . . . . . . . . . . . . . 4.4.1 Tˇr´ıda MainWindow . . . . 4.4.2 Tˇr´ıda Game . . . . . . . . 4.4.3 Hern´ı widgety . . . . . . . 4.4.4 Hern´ı ud´alosti . . . . . . . 4.4.5 Animace pohybu karet . . 4.4.6 Spr´avce hern´ıch akc´ı . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
21 21 22 22 23 23 24 25 25 27 27 27 28 28 29 31 32
5 Uˇ zivatelsk´ a dokumentace 5.1 Instalace . . . . . . . . . . . . . . . . . . . 5.1.1 Windows XP/Vista 32 bit . . . . . 5.1.2 Linux . . . . . . . . . . . . . . . . 5.2 Server . . . . . . . . . . . . . . . . . . . . 5.3 Klient . . . . . . . . . . . . . . . . . . . . 5.3.1 Pˇripojen´ı se k serveru . . . . . . . . 5.3.2 Zaloˇzen´ı hry . . . . . . . . . . . . . 5.3.3 Pˇripojen´ı se do hry . . . . . . . . . 5.3.4 Zah´ajen´ı hry . . . . . . . . . . . . . 5.3.5 Kontrola karty pˇred l´ıznut´ım . . . . 5.3.6 L´ıznut´ı karty . . . . . . . . . . . . 5.3.7 Hran´ı karet . . . . . . . . . . . . . 5.3.8 Reakce . . . . . . . . . . . . . . . . 5.3.9 V´ ybˇer karet . . . . . . . . . . . . . 5.3.10 Pouˇz´ıv´an´ı karet vyˇzaduj´ıc´ı l´ıznut´ı“ ” 5.3.11 Pouˇz´ıv´an´ı vlastnost´ı . . . . . . . . 5.3.12 Odhozen´ı pˇreb´ yvaj´ıc´ıch karet . . . 5.3.13 Ukonˇcen´ı tahu . . . . . . . . . . . . 5.3.14 Zvˇetˇsen´ı karty . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
33 33 33 33 34 34 34 35 36 36 36 37 37 37 37 37 37 38 38 38
4
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
5.4
Konfiguraˇcn´ı soubor . . . . . . . . . . . . . . . . . . . . . .
38
6 Z´ avˇ er 6.1 Budoucnost projektu . . . . . . . . . . . . . . . . . . . . . .
40 40
Literatura
42
5
N´azev pr´ace: KBang ˇ Autor: Michal Cevora Katedra (´ ustav): Katedra aplikovan´e matematiky Vedouc´ı bakal´aˇrsk´e pr´ace: Mgr. Bernard Lidick´ y E-mail vedouc´ıho:
[email protected] Abstrakt: C´ılem t´eto pr´ace je pˇrev´est karetn´ı hru Bang! do poˇc´ıtaˇcov´e hry hrateln´e pˇres poˇc´ıtaˇcovou s´ıt’. Na zaˇca´tku pr´ace pˇredstavuji z´akladn´ı koncepty hry Bang! a zab´ yv´am se ˇreˇsen´ım probl´em˚ u spojen´ ych s implementac´ı hry. V n´asleduj´ıc´ım textu popisuji architekturu aplikace z hlediska serveru i klienta. Od obecn´e architektury se dost´av´am k popisu konkr´etn´ı implementace. Nejprve pˇredstav´ım pouˇzitou knihovnu Qt, vˇcetnˇe d˚ uvod˚ u pro jej´ı pouˇzit´ı, pot´e popisuji implementaci vˇsech ˇca´st´ı projektu. V z´avˇeru pr´ace se nach´az´ı uˇzivatelsk´a dokumentace. Kl´ıˇcov´a slova: Bang! online karetn´ı hra
Title: KBang ˇ Author: Michal Cevora Department: Department of Applied Mathematics Supervisor: Mgr. Bernard Lidick´ y Supervisor’s e-mail address:
[email protected] Abstract: The aim of this work is to transform the card game called Bang! into a computer game that will be playable over computer network. In the beginning of the work I present the basic concepts of the game and I deal with solving problems related to implementation of the game. In the subsequent text I outline the architecture of the application with respect to server and client. From general architecture I proceed to the description of concrete implementation. First I acquaint the reader with the Qt, mentioning the reasons for its use, afterwards I describe the implementation of all parts of the project. In the conclusion of the work there is the user manual. Keywords: Bang! online card game
6
Kapitola 1 ´ Uvod Bang! je karetn´ı hra, kter´a se pˇredevˇs´ım mezi hr´aˇci karetn´ıch a deskov´ ych her stala velmi popul´arn´ı. Vytvoˇril ji italsk´ y hern´ı n´avrh´aˇr Emiliano Sciarra v roce 2002 a d˚ ukazem jej´ıho u ´spˇechu je nejen vyd´an´ı celkem tˇr´ı ofici´aln´ıch rozˇs´ıˇren´ı, ale i nˇekolik ocenˇen´ı, kter´e tato hra za dobu sv´e existence posb´ırala. Pozad´ı hry se odehr´av´a v mal´em mˇesteˇcku na divok´em z´apadˇe, kde hr´aˇci v rol´ıch ˇserifa, bandit˚ u, pomocn´ık˚ u ˇserifa a odpadl´ıka svedou bitvu o moc. ˇ Serif a jeho pomocn´ıci chtˇej´ı odstranit vˇsechny bandity i jejich b´ yval´eho kolegu odpadl´ıka. Bandit´e chtˇej´ı pro zmˇenu zab´ıt ˇserifa, protoˇze v´ı, ˇze jakmile zemˇre ˇserif, nastane ve mˇestˇe bezvl´ad´ı. Nakonec odpadl´ık m´a nejtˇeˇzˇs´ı u ´kol — mus´ı zab´ıt vˇsechny bandity i pomocn´ıky ˇserifa a samotn´eho ˇserifa si mus´ı podat jako posledn´ıho. Pouze tak se s´am m˚ uˇze st´at nov´ ym ˇserifem. Velmi d˚ uleˇzit´ ym prvkem ve hˇre je skuteˇcnost, ˇze kromˇe ˇserifa jsou vˇsechny role tajn´e a tedy na zaˇc´atku hry zn´a kaˇzd´ y hr´aˇc pouze svou roli a v´ı, kter´ y hr´aˇc je ˇserif. Pr´avˇe tento prvek vn´aˇs´ı do hry nap´ınavou atmosf´eru a nejsp´ıˇs stoj´ı za vysvˇetlen´ım, proˇc je tato hra tolik obl´ıben´a. N´apad o vytvoˇren´ı s´ıtov´e poˇc´ıtaˇcov´e hry Bang! vznikl uˇz d´avno, at’ uˇz v hlav´ach technicky zdatn´ ych n´aruˇziv´ ych hr´aˇc˚ u tak i u samotn´eho Emiliana, kter´ y se nˇekolikr´at nechal slyˇset, ˇze nakladatelstv´ı DaVinci pracuje na online poˇc´ıtaˇcov´e verzi. Nakonec i na diskusn´ım f´oru serveru www.bang.cz1 se nejednou objevilo ozn´amen´ı r˚ uzn´ ych fanouˇsk˚ u, ˇze zaˇc´ınaj´ı pracovat na pˇreveden´ı t´eto hry do poˇc´ıtaˇcov´e podoby. Bohuˇzel vˇsechna tato diskusn´ı vl´akna po ˇcase utichla a ˇza´dn´a funkˇcn´ı implementace Bangu se na f´oru nikdy neobjevila. 1
Aˇckoli m´ a tento server ˇceskou dom´enu, jedn´a se pravdˇepodobnˇe o nejvˇetˇs´ı neofici´aln´ı server o Bangu! a na f´ orum ˇcasto pˇrisp´ıv´a s´am Emiliano.
7
C´ılem bakal´aˇrsk´e pr´ace bylo vytvoˇrit program, kter´ y by lidem umoˇznil hr´at Bang! na poˇc´ıtaˇci pˇres poˇc´ıtaˇcovou s´ıt’. Kompletn´ı pravidla Bangu! najdete na pˇriloˇzen´em CD nebo je m˚ uˇzete z´ıskat na ofici´aln´ıch str´ank´ach hry[2].
8
Kapitola 2 Z´ akladn´ı koncepty a anal´ yza probl´ em˚ u hry Tato kapitola se vˇenuje probl´em˚ um, kter´e je nutn´e zohlednit pˇri n´avrhu architektury projektu. K dan´ ym probl´em˚ um jsou pˇredloˇzena a porovn´av´ana r˚ uzn´a ˇreˇsen´ı a v z´avˇeru kaˇzd´e sekce je pops´ano pouˇzit´e ˇreˇsen´ı.
2.1
Hern´ı plocha
Hern´ı plocha v Bangu je tvoˇrena oblastmi, ve kter´ ych se shromaˇzd’uj´ı karty. Karty mohou b´ yt um´ıstˇeny na hrac´ı ploˇse bud’ l´ıcem nahoru a nebo rubem nahoru. V pˇr´ıpadˇe, ˇze je karta um´ıstˇena l´ıcem nahoru (a za pˇredpokladu, ˇze na t´eto kartˇe neleˇz´ı jin´a karta), je tato karta pro dan´eho hr´aˇce zn´am´a. Opakem jsou skryt´e karty, leˇz´ıc´ı rubem nahoru. Podobnˇe jako v jin´ ych karetn´ıch hr´ach, tak´e v Bangu drˇz´ı jednotliv´ı hr´aˇci nˇekter´e sv´e karty v ruce. Hr´aˇci by si mˇeli d´avat pozor, aby jim do karet nekoukal protivn´ık. Z pohledu jednoho konkr´etn´ıho hr´aˇce jsou proto vˇsechny karty v ruce protivn´ık˚ u povaˇzov´any za skryt´e. Stejnˇe tak jsou i skryt´e vˇsechny karty v l´ızac´ım bal´ıˇcku a tak´e v odhazovac´ım bal´ıˇcku, kromˇe vrchn´ı karty. Viditelnost karet na hern´ı ploˇse shrnuje obr´azek 2.1. Hrac´ı plocha je do jist´e m´ıry sd´ılen´a mezi hr´aˇci. Vˇsichni hr´aˇci vˇzdy vid´ı ty sam´e karty, jedin´ y rozd´ıl je, ˇze nˇekteˇr´ı vid´ı nˇekter´e karty jako zn´am´e, kdeˇzto jin´ı jako skryt´e.
9
Obr´azek 2.1: Viditelnost karet na hern´ı ploˇse
2.2
Tahy a stˇ r´ıd´ an´ı hr´ aˇ c˚ u
Hr´aˇci se v Bangu stˇr´ıdaj´ı po taz´ıch. Jakmile se hr´aˇc rozhodne ukonˇcit sv˚ uj tah, pokraˇcuje hr´aˇc po jeho levici. Hr´aˇc m´a moˇznost ve sv´em tahu hr´at karty, kter´e vyˇzaduj´ı reakce ostatn´ıch hr´aˇc˚ u. Napˇr´ıklad kdyˇz hr´aˇc A zahraje kartu Bang! na hr´aˇce B, tento hr´aˇc se mus´ı rozhodnout, zda zahraje kartu Vedle a nebo si ubere ˇzivot. Existuj´ı i karty, kter´e vyˇzaduj´ı reakci vˇsech hr´aˇc˚ u. Pˇr´ıkladem budiˇz karta Indi´ani, po jejimˇz zahr´an´ı mus´ı kaˇzd´ y hr´aˇc zahr´at kartu Bang! (zastˇrelit si sv´eho indi´ana) a nebo si ubrat ˇzivot. V tomto pˇr´ıpadˇe pravidla nespecifikuj´ı poˇrad´ı, kdy maj´ı jednotliv´ı hr´aˇci reagovat a pˇri bˇeˇzn´e hˇre na ˇzivo“ se ” vˇetˇsinou reaguje v n´ahodn´em poˇrad´ı. 10
Abychom mohli popsat moment´aln´ı stav hry, je d˚ uleˇzit´e si pamatovat, kter´ y hr´aˇc je na tahu. V pˇr´ıpadˇe zahr´an´ı karet, kter´e vyˇzaduj´ı reakci hr´aˇce si tak´e mus´ıme pamatovat, od kter´eho hr´aˇce v dan´ y moment oˇcek´av´ame reakci. V pˇr´ıpadˇe karet, kter´e vyˇzaduj´ı reakci od v´ıce hr´aˇc˚ u nast´av´a probl´em. Pokud bychom chtˇeli umoˇznit hr´aˇc˚ um reagovat v libovoln´em poˇrad´ı, museli bychom si pamatovat mnoˇzinu hr´aˇc˚ u, od kter´ ych oˇcek´av´ame reakci. Postupnˇe jak by hr´aˇci reagovali bychom tyto hr´aˇce z mnoˇziny vyˇskrt´avali. Toto ˇreˇsen´ı se na prvn´ı pohled zd´a velmi dobr´e — nakonec by pˇrece nejv´ıc odpov´ıdalo bˇeˇzn´ ym hr´am na ˇzivo“, nicm´enˇe pod´ıvejme se jeˇstˇe na dalˇs´ı ” ˇreˇsen´ı. Jakmile bude zahr´ana karta, kter´a vyˇzaduje reakci v´ıce hr´aˇc˚ u, m˚ uˇzeme se tˇechto hr´aˇc˚ u zeptat po jednom ve smˇeru hry. Toto ˇreˇsen´ı m´a jednu v´ yhodu, kter´a na prvn´ı pohled nen´ı tolik patrn´a. Poˇrad´ı reakc´ı hr´aˇc˚ u totiˇz nen´ı nezanedbateln´e (napˇr. pokud si hr´aˇci l´ıˇzou kartu na Barel ) a pro nˇekter´eho hr´aˇce m˚ uˇze b´ yt v´ yhodnˇejˇs´ı zareagovat jako prvn´ı, nebo naopak jako posledn´ı. To by mohlo hr´aˇce sv´adˇet k z´avodˇen´ı, coˇz u t´eto hry nen´ı pˇr´ıliˇs vhodn´e. Nakonec mus´ıme br´at v u ´vahu, ˇze hr´aˇci mohou hr´at s pomal´ ym pˇripojen´ım a takto by mohli b´ yt znev´ yhodnˇeni.
2.3
Probl´ em zapomenut´ı vlastnosti
V bˇeˇzn´ ych hr´ach (obzvl´aˇstˇe mezi ne pˇr´ıliˇs zkuˇsen´ ymi hr´aˇci) se ˇcasto st´av´a, ˇze nˇejak´ y hr´aˇc zapomene na svou vlastnost a nevyuˇzije ji. Napˇr´ıklad hr´aˇc hraj´ıc´ı za Willyho Kida, aˇckoli m´a moˇznost hr´at neomezen´ y poˇcet Bang˚ u za kolo, zapomene na svou vlastnost a odhod´ı dva Bangy do odhazovac´ıho bal´ıˇcku, aˇckoli by je mohl pouˇz´ıt k u ´toku na jist´eho nepˇr´ıtele. U nˇekter´ ych vlastnost´ı vˇsak vznik´a probl´em, kter´ y se pokus´ım ilustrovat na n´asleduj´ıc´ım pˇr´ıkladu. Uvaˇzme postavu Vulture Sam, jej´ıˇz vlastnost ji dovol´ı z´ıskat vˇsechny karty mrtv´ ych hr´aˇc˚ u. Pˇri norm´aln´ı hˇre mus´ı hr´aˇc na tuto vlastnost pamatovat a pˇri smrti nˇejak´eho hr´aˇce se pˇripomenout a tohoto hr´aˇce poˇz´adat o karty. Pokud na to zapomene, um´ıraj´ıc´ı hr´aˇc odhod´ı vˇsechny svoje karty do odhazovac´ıho bal´ıˇcku a hra pokraˇcuje d´al. Konkr´etn´ı situace by mohla vypadat n´asledovnˇe. Hr´aˇc A zahraje Bang! na hr´aˇce B, kter´ y m´a posledn´ı ˇzivot. Hr´aˇc B se nem˚ uˇze br´anit, protoˇze nem´a kartu Vedle a proto um´ır´a. Nyn´ı m´a hr´aˇc C hraj´ıc´ı jako Vulture Sam pr´avo uplatnit sv˚ uj n´arok, ale dˇr´ıv, neˇz to stihne udˇelat, hr´aˇc A pokraˇcuje ve hˇre a n´arok hr´aˇce C je nyn´ı promlˇcen´ y. Objevuje se zde stejn´ y probl´em z´avodˇen´ı hr´aˇc˚ u jako v pˇredchoz´ı sekci. 11
Jedna z moˇznost´ı ˇreˇsen´ı tohoto probl´emu je vloˇzit do hry prodlevu, kter´a d´a hr´aˇci C napˇr´ıklad pˇet vteˇrin na vyuˇzit´ı sv´e vlastnosti. Probl´emem je, ˇze jak´ekoli pevnˇe nastaven´e ˇcasov´e prodlevy mohou dˇelat v s´ıt’ov´ ych hr´ach probl´emy. Klient m˚ uˇze m´ıt napˇr´ıklad pomal´e internetov´e spojen´ı nebo tˇreba pomal´ y poˇc´ıtaˇc, na kter´em se pomaleji animuj´ı pohyby karet, coˇz by mu nakonec br´anilo ve vyuˇzit´ı jeho vlastnosti. Dalˇs´ı moˇzn´e ˇreˇsen´ı je poˇckat na reakci hr´aˇce C. Ten by se mohl v klidu rozhodnout, zda svou vlastnost pouˇzije ˇci ne. Oˇcividnˇe toto nen´ı spr´avn´e ˇreˇsen´ı, protoˇze jakmile se hr´aˇce zept´ame, jestli chce pouˇz´ıt svou vlastnost, musel by b´ yt hloup´ y, aby ˇrekl ne. Posledn´ı moˇzn´e ˇreˇsen´ı je pouˇz´ıvat vlastnosti trp´ıc´ı t´ımto probl´emem automaticky. K tomuto ˇreˇsen´ı jsem se nakonec pˇriklonil.
2.4
Probl´ em identifikace karet
D˚ uleˇzit´ ym probl´emem ve hˇre je vyˇreˇsit zp˚ usob identifikace karet. Server bude muset pos´ılat klientu informace o pohybu karet a z´aroveˇ n bude muset umoˇznit klientu nˇekter´e tyto karty pouˇz´ıvat. Jedna z moˇznost´ı je pos´ılat karty jako ˇctveˇrice (I, T, H, B), kde I je jednoznaˇcn´ y ˇc´ıseln´ y identifik´ator karty, T je typ karty, H je hodnost karty (2 – 10, J, Q, K, A) a B je barva karty (piky, kˇr´ıˇze, k´ary, srdce). Server mus´ı tak´e zajistit, ˇze se ˇza´dn´ y klient nedozv´ı informace o kart´ach, u kter´ ych vid´ı pouze rub (l´ızac´ı bal´ıˇcek, karty v rukou oponent˚ u). V pˇr´ıpadˇe takov´ ych karet urˇcitˇe nesm´ıme pos´ılat informace T , H a B. Ot´azkou je, zda m˚ uˇzeme pos´ılat informaci I. Pokud by klient potˇreboval manipulovat s touto kartou, jistˇe by se hodilo zn´at identifik´ator karty. Napˇr´ıklad kdyby hr´aˇc zahr´al kartu Panika za u ´ˇcelem vz´ıt oponentovi kartu z ruky, klient by serveru poslal identifik´ator karty Panika a identifik´ator dan´e karty oponenta. Jakmile vˇsak dovol´ıme klientovi zn´at identifik´atory nezn´am´ ych karet, otv´ır´ame t´ım prostor k podv´adˇen´ı. Klient si tak m˚ uˇze vytvoˇrit mapov´an´ı zn´am´ ych karet a jejich identifik´ator˚ u a toto mapov´an´ı pak pouˇz´ıvat k odhalov´an´ı oponentov´ ych karet. Hr´aˇc – program´ator by si pak mohl upravit klienta tak, aby se mu skryt´e karty, jejichˇz identifik´atory jsou jiˇz namapovan´e, zobrazovaly odkrytˇe. Jeden z moˇzn´ ych zp˚ usob˚ u je pouˇz´ıvat v´ıce identifik´ator˚ u a volit je tak, aby nedoch´azelo k v´ yˇse uveden´ ym probl´em˚ um. Napˇr´ıklad je moˇzn´e zav´est dva typy identifik´ator˚ u — absolutn´ı identifik´atory, kter´e pˇriˇrazuj´ı kaˇzd´e kartˇe jedineˇcn´e ˇc´ıslo a popisn´e identifik´atory, kter´e popisuj´ı, kde se karta nach´az´ı. 12
Pˇri odkazov´an´ı na oponentovu kartu v ruce bychom pak mohli pouˇz´ıt pouze popisn´ y identifik´ator, kter´ y by napˇr. ˇr´ıkal druh´a karta v rukou hr´aˇce B“. ” Pokud si promysl´ıme vˇsechny pˇr´ıpady, kdy je tˇreba odkazovat se na nezn´amou kartu, zjist´ıme, ˇze jich nen´ı mnoho. V podstatˇe se jedn´a pouze o pouˇzit´ı karet Cat Balou nebo Panika na nezn´amou kartu v rukou oponenta. Vezmeme-li v u ´vahu fakt, ˇze karta z rukou oponenta se vyb´ır´a n´ahodnˇe (oponent by si mˇel sv´e karty zam´ıchat, neˇz nech´a hr´aˇce vybrat kartu), m˚ uˇzeme nechat skuteˇcn´ y v´ ybˇer karty na serveru. Klient by pak pouze poslal, ˇze c´ılem Cat Balou nebo Paniky je ruka hr´aˇce X. Touto metodou bychom mohli velmi elegatnˇe vyˇreˇsit probl´em identifikace nezn´am´ ych karet.
13
Kapitola 3 Architektura Z´akladn´ım rozhodnut´ım implementace s´ıt’ov´e karetn´ı hry je rozdˇelen´ı povinnost´ı mezi klienta a server. Jedna z moˇznost´ı je soustˇredit veˇskerou hern´ı logiku na server a klienta navrhnout co nejjednoduˇseji. V takov´em n´avrhu bude server kromˇe z´akladn´ıch u ´kol˚ u spojen´ ych s obsluhou spojen´ı a udrˇzov´an´ı stavu hry tak´e zodpovˇedn´ y za kontrolu vstup˚ u od jednotliv´ ych klient˚ u. Klient naopak bude rozumˇet hˇre na velmi n´ızk´e u ´rovni. Kdyˇz pak bude cht´ıt hr´aˇc zahr´at nˇejakou kartu, klient poˇsle dan´ y poˇzadavek na server a aˇz ten se rozhodne, jestli tato akce neodporuje pravidl˚ um. Tento pˇr´ıstup m´a nˇekolik v´ yhod, ale tak´e i p´ar nev´ yhod. Pˇredevˇs´ım n´am umoˇzn´ı implementovat pravidla pouze na jednom m´ıstˇe a nemus´ıme je tedy ps´at dvakr´at. D´ale d´ıky toho, ˇze klient nezn´a pravidla, je moˇzn´e upravovat (opravovat) pravidla pouze na severu bez nutnosti mˇenit klienta. Tento poznatek je velmi d˚ uleˇzit´ y v typick´em s´ıt’ov´em prostˇred´ı, kdy se pˇri objeven´ı chyby v pravidlech pouze oprav´ı a pˇrekompiluje server. Hlavn´ı nev´ yhodou je pak zv´ yˇsen´e mnoˇzstv´ı pˇren´aˇsen´ ych dat a vyˇsˇs´ı z´atˇeˇz serveru. Jedn´a se vˇsak o mal´e nav´ yˇsen´ı, a proto je moˇzn´e ho zanedbat.
3.1 3.1.1
Obecn´ e koncepty Komunikaˇ cn´ı protokol
Komunikaˇcn´ı protokol jsem se rozhodl postavit na z´akladˇe obecn´eho jazyka XML. Narozd´ıl od bin´arn´ıch protokol˚ u pouˇzit´ı ˇcistˇe textov´eho protokolu netrp´ı probl´emy s nejednotnou reprezentac´ı dat (napˇr. probl´em r˚ uzn´e endi14
anity) a tak´e umoˇzn ˇuje pohodln´e ladˇen´ı. Pouˇzit´ı XML m´a zase v´ yhodu v automatick´e validaci pˇrij´ıman´ ych dat pomoc´ı XML Sceme nebo Relax NG. Bezespornou v´ yhodou bin´arn´ıho protokolu je menˇs´ı mnoˇzstv´ı pˇren´aˇsen´ ych dat, neˇz je tomu u textov´eho protokolu. Nicm´enˇe tato v´ yhoda je zanedbateln´a, protoˇze velikost informac´ı, kter´e je nutn´e pos´ılat, je relativnˇe mal´a. Po nav´az´an´ı spojen´ı poˇsle klient serveru hlaviˇcku XML dokumentu a otv´ırac´ı stream element. Server odpov´ı stejnˇe. V tomto okamˇziku m´a kaˇzd´a strana vytvoˇren´ y jeden vstupn´ı a jeden v´ ystupn´ı proud a komunikace prob´ıh´a do doby, neˇz jedna strana poˇsle uzav´ırac´ı stream element. Komunikace prob´ıh´a pomoc´ı pos´ıl´an´ı top level element˚ u, zvan´ ych stanza. Protokol rozliˇsuje tˇri druhy stanzy. Prvn´ı je stanza query, kter´a slouˇz´ı k dotazovan´ı se. Klient pouˇz´ıv´a tuto stanzu napˇr´ıklad k zjiˇstˇen´ı informac´ı o serveru. Nejprve poˇsle stanzu query s atributem type="get" a jedineˇcn´ ym identifik´atorem id="1" a dovnitˇr zabal´ı konkr´etn´ı poˇzadavek. Server tento poˇzadavek zpracuje a vr´at´ı v´ ysledek zabalen´ y opˇet do stanzy query s atributem type="result" a se stejn´ ym identifik´atorem, jak´ y mˇel poˇzadavek. Dalˇs´ı typ stanzy je action. Tuto stanzu pouˇz´ıv´a klient k pos´ıl´an´ı vˇsech typ˚ u akc´ı, at’ uˇz se jedn´a o zaloˇzen´ı nov´e hry, pˇripojen´ı se ke hˇre, nebo zahr´an´ı karty. Posledn´ı typ stanzy je event, kter´ y pouˇz´ıv´a server k informov´an´ı klienta o ud´alostech kter´e nastaly.
3.1.2
Identifikace hr´ aˇ c˚ u
ˇ ıslo 0 z˚ Pro identifikaci hr´aˇc˚ u pouˇzijeme celoˇc´ıseln´e identifik´atory. C´ ustane rezervovan´e pro speci´aln´ı pˇr´ıpady (neplatn´ y hr´aˇc, ˇz´adn´ y hr´aˇc).
3.1.3
Identifikace karet
Jednotliv´e karty budou identifikov´any tak´e pomoc´ı celoˇc´ıseln´ ych identifik´ator˚ u. ˇ ıslo 0 z˚ C´ ustane rezervovan´e pro hr´aˇci nezn´amou kartu. Jak jsem jiˇz rozebral v sekci 2.4, nezn´am´e karty nemus´ı m´ıt identifik´atory, protoˇze je lze urˇcit pomoc´ı kapsy, ve kter´e se nach´az´ı. Kapsy jsou pops´any v sekci 3.1.4.
15
3.1.4
Kapsy
Pro reprezentaci um´ıstˇen´ı karet si pom˚ uˇzeme zaveden´ım kapes (angl. pockets). Kapsou budeme rozumˇet jakoukoli oblast hern´ı plochy, kde se m˚ uˇzou shromaˇzd’ovat karty. Nˇekter´e kapsy jsou spoleˇcn´e a nˇekter´e kapsy jsou vlastnˇeny konkr´etn´ım hr´aˇcem. Mezi spoleˇcn´e kapsy patˇr´ı l´ızac´ı bal´ıˇcek, odhazovac´ı bal´ıˇcek a v´ybˇer. Kapsa obsahuj´ıc´ı karty v rukou hr´aˇce (d´ale jen ruka) a kapsa obsahuj´ıc´ı vyloˇzen´e karty pˇred hr´aˇcem (d´ale jen st˚ ul ) jsou kapsy vlastnˇen´e konkr´etn´ımi hr´aˇci. Libovoln´a kapsa lze jednoznaˇcnˇe urˇcit dvojic´ı (T, H), kde T je typ kapsy a H je identifik´ator hr´aˇce. Identifik´ator hr´aˇce m´a v´ yznam pouze v pˇr´ıpadˇe kapes vlastnˇen´ ych hr´aˇcem (ruka, st˚ ul ). Kaˇzd´a hrac´ı karta ve hˇre n´aleˇz´ı v jednom okamˇziku pr´avˇe do jedn´e kapsy a na poˇrad´ı karet v r´amci jedn´e kapsy nez´aleˇz´ı. V´ yjimku tvoˇr´ı kapsy l´ızac´ı bal´ıˇcek a odhazovac´ı bal´ıˇcek, kde jsou karty uspoˇra´dan´e. V pˇr´ıpadˇe tˇechto kapes se vˇsak vˇzdy pracuje pouze s vrchn´ı kartou a tedy lze z pohledu klienta tyto dvˇe kapsy ch´apat jako kapsy velikosti jedna.
3.1.5
Hern´ı stavy a kontext hry
Pr˚ ubˇeh hry je prov´azen pˇrechodem mezi r˚ uzn´ ymi hern´ımi stavy (viz obr´azek 3.1). Kontext hry je reprezentov´an trojic´ı (S, C, R), kde S je aktu´aln´ı hern´ı stav, C je identifik´ator hr´aˇce na tahu a R je identifik´ator dotazovan´eho hr´aˇce. Po rozd´an´ı karet hra zaˇc´ın´a ve stavu f´aze 1 a C i R je nastaveno na hr´aˇce, kter´ y zahajuje hru (ˇserif). Hr´aˇc si l´ızne dvˇe karty a pˇresune se po ˇsipce 1. do stavu f´aze 2. V pˇr´ıpadˇe, ˇze m´a hr´aˇc pˇred sebou kartu Dynamit nebo Vˇezen´ı, mus´ı pˇred l´ıznut´ım karet otoˇcit vrchn´ı kartu bal´ıˇcku, ˇc´ımˇz ovˇeˇr´ı efekt dan´e karty (pˇresun po ˇsipce 2.). Hr´aˇc ve f´azi 2 m˚ uˇze zahr´at nˇekter´e karty z ruky. Pokud zahraje kartu, kter´a vyˇzaduje reakci ostatn´ıch hr´aˇc˚ u (Bang!, Emporio, aj.), pˇrejde se po ˇsipce 3. do stavu reakce a R se nastav´ı na c´ılov´eho hr´aˇce. V pˇr´ıpadˇe, ˇze byla zahr´ana karta, vyˇzaduj´ıc´ı reakci pouze jednoho hr´aˇce, vr´at´ıme se ˇsipkou 4. do stavu f´aze 2 a nastav´ıme R = C. V pˇr´ıpadˇe, ˇze byla zahr´ana karta vyˇzaduj´ıc´ı reakci v´ıce hr´aˇc˚ u, p˚ ujdeme po ˇsipce 5. a nastav´ıme R na dalˇs´ıho reaguj´ıc´ıho hr´aˇce. Po reakci posledn´ıho hr´aˇce se vr´at´ıme ˇsipkou 4. do stavu f´aze 2 a nastav´ıme R = C. Jakmile se hr´aˇc ve f´azi 2 rozhodne ukonˇcit sv˚ uj tah, pˇresuneme se po ˇsipce 6. do f´aze 3. Pokud m´a hr´aˇc v´ıce karet neˇz je jeho poˇcet ˇzivot˚ u, mus´ı
16
8
2
Fáze 1
Fáze 3
1
7
6 Fáze 2
4
3 Reakce
5
Obr´azek 3.1: Diagram hern´ıch stav˚ u odhodit pˇrebyteˇcn´e karty (ˇsipka 7.). V opaˇcn´em pˇr´ıpadˇe se pokraˇcuje po ˇsipce 8., C a R se nastav´ı na n´asleduj´ıc´ıho hr´aˇce a zaˇc´ın´a nov´ y tah. Je d˚ uleˇzit´e uvˇedomit si, ˇze hr´aˇc, kter´ y je aktu´alnˇe na tahu m˚ uˇze ve sv´em tahu zemˇr´ıt, napˇr. pokud m´a sm˚ ulu pˇri l´ıznut´ı na Dynamit nebo pokud prohraje Duel. V tˇechto pˇr´ıpadech se hra z libovoln´eho stavu pˇresune po ˇsipce 8. do f´aze 1 a pokraˇcuje dalˇs´ı hr´aˇc.
3.2
Server
Server je program, kter´ y se spravuje pˇripojen´e klienty a prob´ıhaj´ıc´ı hry.
3.2.1
Klient
Klient je z pohledu serveru entita, se kterou server komunikuje pomoc´ı komunikaˇcn´ıho protokolu. Server se star´a o obsluhu nˇekter´ ych poˇzadavk˚ u klienta. Jedn´a se o poˇzadavky o vytvoˇren´ı hry a pˇripojen´ı se ke hˇre. Jakmile se klient pˇripoj´ı do hry jako hr´aˇc, bere na sebe roli ovladaˇce hr´aˇce.
17
3.2.2
Vytv´ aˇ ren´ı her
Kaˇzd´ y klient m´a moˇznost vytvoˇrit novou hru. Pˇri vytv´aˇren´ı nov´e hry m´a pak moˇznost nastavit nˇekter´e parametry hry, jako je n´azev a popis hry, minim´aln´ı a maxim´aln´ı poˇcet hr´aˇc˚ u, poˇcet AI1 a tak´e se m˚ uˇze rozhodnout, zda si pˇreje po spuˇstˇen´ı hry zam´ıchat pozice hr´aˇc˚ u. Nav´ıc lze kaˇzd´a hra zabezpeˇcit heslem. Kaˇzd´ y klient, kter´ y se chce pˇripojit k dan´e hˇre, pak mus´ı zn´at dan´e heslo. Po vytvoˇren´ı hry se ˇcek´a na pˇripojen´ı hr´aˇc˚ u. Jakmile se ve hˇre nach´az´ı dostatek hr´aˇc˚ u k spuˇstˇen´ı hry (d´ano parametrem minim´aln´ı poˇcet hr´aˇc˚ u“), ” tv˚ urce hry m˚ uˇze tuto hru odstartovat, ˇc´ımˇz se zah´aj´ı rozd´av´an´ı karet.
3.2.3
Hr´ aˇ c
Jakmile se klient pˇripoj´ı do hry, vytvoˇr´ı se nov´ y hr´aˇc a jako jeho ovladaˇc se nastav´ı onen klient. Hr´aˇci ovl´ad´ani umˇelou inteligenc´ı se vytvoˇr´ı podle nastaven´ı parametru hry ihned po vytvoˇren´ı hry. Pokud se klient jeˇstˇe pˇred spuˇstˇen´ım hry rozhodne opustit hru, j´ım ovl´adan´ y hr´aˇc se odstran´ı. Ovˇsem pokud by klient opustil hru po spuˇstˇen´ı hry, pouze se odpoj´ı ovladaˇc hr´aˇce. K hr´aˇci se pak m˚ uˇze pˇripojit jin´ y klient (pokud zn´a heslo).
3.2.4
Vytv´ aˇ ren´ı hr´ aˇ c˚ u
Hr´aˇc se vytvoˇr´ı pˇripojen´ım klienta do hry. Pro zjednoduˇsen´ı se hr´aˇc vytvoˇr´ı tak´e pˇri zaloˇzen´ı hry a tento zakl´adaj´ıc´ı hr´aˇc je v roli tv˚ urce hry. Pˇri vytv´aˇren´ı hr´aˇce je tˇreba zadat jm´eno hr´aˇce. Volitelnˇe je moˇzn´e zadat heslo hr´aˇce. Toto heslo slouˇz´ı k opˇetovn´emu pˇripojen´ı se k hr´aˇci, napˇr´ıklad po v´ ypadku spojen´ı se serverem. Pouze klient, kter´ y zad´a spr´avn´e heslo, se m˚ uˇze pˇripojit k tomuto hr´aˇci.
3.2.5
Pr˚ ubˇ eh hry
Pˇred spuˇstˇen´ım hry se hr´aˇc˚ um n´ahodnˇe rozdˇel´ı role a kaˇzd´emu hr´aˇci se pˇridˇel´ı jedna postava. D´ale se pˇriprav´ı bal´ıˇcek karet, zam´ıch´a se a zaˇcnou se rozd´avat karty. 1
Artifical Intelligence - hr´ aˇci ovl´ad´an´ı umˇelou inteligenc´ı
18
3.3
Klient
Po pˇripojen´ı klienta k serveru m˚ uˇze uˇzivatel bud’ vytvoˇrit novou hru a nebo se pˇripojit do jiˇz existuj´ıc´ı hry. Pokud se rozhodne pro vytvoˇren´ı nov´e hry, st´av´a se automaticky tv˚ urcem hry a rozhoduje kdy bude hra spuˇstˇena. Jakmile se pˇripoj´ı dostatek hr´aˇc˚ u, tv˚ urce hry m˚ uˇze odstartovat hru.
3.3.1
Pohyb karet
Veˇsker´ y pohyb karet ve hˇre je pˇr´ımo ovl´ad´an serverem, kter´ y pos´ıl´a klient˚ um ud´alosti o pohybu karet. Kaˇzd´a tato ud´alost je tvoˇren´a trojic´ı (karta, zdrojov´a kapsa, c´ılov´a kapsa). Karta je pak reprezentovan´a ˇctveˇric´ı (I, T, H, B) (v pˇr´ıpadˇe nezn´am´e karty je karta nulov´a — vˇsechny poloˇzky ˇctveˇrice jsou nulov´e) a kapsy jsou jednoznaˇcnˇe urˇceny typem kapsy a identifik´atorem vlastn´ıka kapsy (v pˇr´ıpadˇe sd´ılen´ ych kapes je to 0). Takto definovan´a ud´alost je schopna reprezentovat t´emˇeˇr libovoln´ y pohyb karty v Bangu. Existuje pouze jedin´ y pˇr´ıpad, kdy je tˇreba tuto strukturu rozˇs´ıˇrit. V pˇr´ıpadˇe ˇze zdrojovou kapsou je odhazovac´ı bal´ıˇcek, klient nev´ı (nemus´ı si pamatovat) jak´a karta leˇz´ı pod vrchn´ı kartou, kter´a se bude h´ ybat. Klient by si tuto informaci mohl pamatovat, ale jelikoˇz bychom mohli teoreticky odeb´ırat karty z odhazovac´ıho bal´ıˇcku donekoneˇcna (dokud tam nˇejak´a karta bude), klient by si tak musel ukl´adat cel´ y odhazovac´ı bal´ıˇcek a tak´e by musel spr´avnˇe interpretovat pˇresunut´ı karet z odhazovac´ıho bal´ıˇcku do l´ızac´ıho bal´ıˇcku v pˇr´ıpadˇe, ˇze v l´ızac´ım bal´ıˇcku dojdou karty. Tyto komplikace na stranˇe klienta by mohly v´est ke ztr´atˇe synchronizace, kdy by si klient myslel, ˇze je na vrcholu odhazovac´ıho bal´ıˇcku jin´a karta, neˇz ve skuteˇcnosti je. Danou strukturu dopln´ıme o jeˇstˇe jednu kartu, kter´a se pouˇzije pouze v pˇr´ıpadˇe, kdy zdrojov´a kapsa bude odhazovac´ı bal´ıˇcek a bude znaˇcit nov´ y vrchol odhazovac´ıho bal´ıˇcku. V pˇr´ıpadˇe, ˇze tato karta bude nulov´a, znamen´a to, ˇze odhazovac´ı bal´ıˇcek bude pr´azdn´ y.
3.3.2
Zmˇ ena poˇ ctu ˇ zivot˚ u
V pˇr´ıpadˇe, ˇze dojde k zmˇenˇe poˇctu ˇzivot˚ u hr´aˇce, klienti jsou o tom informov´an´ı skrze ud´alost o zmˇenˇe ˇzivot˚ u. Tato ud´alost obsahuje identifik´ator klienta a nov´ y poˇcet ˇzivot˚ u.
19
3.3.3
Zmˇ ena kontextu hry
Jakmile dojde ke zmˇenˇe kontextu hry, server informuje vˇsechny klienty zasl´an´ım nov´eho kontextu. Klient na z´akladˇe aktu´aln´ıho kontextu vizu´alnˇe oznaˇcuje hr´aˇce na tahu a dotazovan´eho hr´aˇce. Pokud je klient s´am dotazovan´ ym hr´aˇcem, umoˇzn´ı uˇzivateli prov´adˇet hern´ı akce.
3.3.4
Hern´ı akce
Klientsk´a aplikace poskytuje uˇzivateli rozhran´ı pro vykon´av´an´ı hern´ıch akc´ı. Klient by mˇel pos´ılat serveru hern´ı akce pouze, pokud je dan´ y hr´aˇc specifikov´an jako dotazovan´y hr´aˇc v kontextu hry. Pokud nen´ı odeslan´a hern´ı akce platn´a (napˇr. pokud akce odporuje pravidl˚ um nebo nen´ı dan´ y hr´aˇc na tahu), server takovou akci ignoruje. Z tohoto d˚ uvodu klient nikdy s´am po odesl´an´ı hern´ı akce nemˇen´ı stav hry, ale vˇzdy ˇcek´a na danou ud´alost od serveru. Klient m˚ uˇze odes´ılat tyto hern´ı akce: • DrawCard - hr´aˇc si l´ızne 2 karty • PlayCard - hr´aˇc zahraje danou kartu • PlayCard (s c´ılov´ ym hr´aˇcem) - hr´aˇc zahraje danou kartu s c´ılov´ ym hr´aˇcem • PlayCard (s c´ılovou kartou) - hr´aˇc zahraje danou kartu s c´ılovou kartou • UseAbility - hr´aˇc pouˇzije svou vlastnost • UseAbility (s c´ılov´ ym hr´aˇcem) - hr´aˇc pouˇzije svou vlastnost • UseAbility (s c´ılov´ ymi kartami) - hr´aˇc pouˇzije svou vlastnost • Turn - hr´aˇc ukonˇc´ı sv˚ uj tah • Pass - hr´aˇc se rozhodne nereagovat na efekt karty na nˇej zahran´e • Discard - hr´aˇc odhod´ı svou kartu do odkl´adac´ıho bal´ıˇcku
20
Kapitola 4 Implementace KBang je implementov´an v objektovˇe orientovan´em jazyce C++ a pouˇz´ıv´a pˇrev´aˇznˇe prostˇredky knihovny Qt4. Projekt je rozdˇelen´ y do tˇr´ı podprojekt˚ u: • common — knihovna se spoleˇcn´ ym k´odem pro server i client • server — serverov´a aplikace • client — klientsk´a aplikace
4.1
Knihovna Qt4
Knihovna Qt1 je multiplatformn´ı knihovna pro vytv´aˇren´ı (nejen) aplikac´ı s grafick´ ym uˇzivatelsk´ ym rozhran´ım. Vyv´ıj´ı ji norsk´a spoleˇcnost Qt Software (dˇr´ıve Trolltech), kter´a je od l´eta 2008 vlastnˇena finskou firmou Nokia. Knihovna je vyd´av´ana v nˇekolika edic´ıch pod r˚ uzn´ ymi licencemi. Pro v´ yvoj svobodn´eho softwaru/open source je k dispozici edice Qt Open Source Edition licencov´ana pod licencemi, kter´e vych´az´ı z GNU/GPL2 a GNU/LGPL3 . Knihovna Qt4 byla vyd´ana v roce 2005 jako n´astupce knihovny Qt3. Tato verze pˇrinesla mnoho zmˇen a stala se tak zpˇetnˇe nekompatibiln´ı s jej´ı starˇs´ı verz´ı. Pro v´ yvoj´aˇre znamen´a pouˇzit´ı knihovny Qt4 znaˇcn´e zjednoduˇsen´ı v´ yvoje software. Knihovna jde aˇz tak daleko, ˇze se snaˇz´ı rozˇs´ıˇrit v jist´ ych ohledech omezenou funkcionalitu jazyka C++. Zav´ad´ı tak prostˇredky jako sign´aly a sloty, Qt RTTI 4 nebo tˇreba metaobjekty. Tyto pom˚ ucky jsou v 1
Vyslovov´ ano jako anglick´e slovo cute“ - roztomil´ y ” GNU General Public Licence 3 GNU Lesser General Public Licence 4 Run-Time Type Identificaion 2
21
C++ realizovateln´e pouze pomoc´ı generov´an´ı k´odu. Knihovna Qt4 pˇrich´az´ı s tzv. kompil´atorem metaobjek˚ u (Meta Object Compiler ), kter´ y se star´a o pˇrevod tˇechto vyˇsˇs´ıch prostˇredk˚ u do standardn´ıho C++. D´ale poskytuje Qt knihovna n´astroje, kter´e konkuruj´ı standardn´ı STL ˇ knihovnˇe. Casto se jedn´a o vylepˇsen´ı pˇr´ısluˇsn´ ych protˇejˇsk˚ u z STL. Napˇr´ıklad tˇr´ıda QString oproti bˇeˇzn´emu stringu ze standardn´ı knihovny poskytuje implicitn´ı sd´ılen´ı (copy-on-write) a podporu Unicode. V neposledn´ı ˇradˇe poskytuje Qt multiplatformn´ı rozhr´an´ı pro pouˇzit´ı vl´aken. D˚ uvodem k pouˇzit´ı Qt4 v projektu byla pˇredevˇs´ım ona multiplatformnost t´eto knihovny. Jakoˇzto uˇzivatel minoritn´ıho operaˇcn´ıho syst´emu nem˚ uˇzu oˇcek´avat, ˇze by mohlo doj´ıt k vˇetˇs´ımu rozˇs´ıˇren´ı hry bez moˇznosti hr´at ji na majoritn´ıch operaˇcn´ıch syst´emech a architektur´ach. Dalˇs´ı bezespornou v´ yhodou je skuteˇcnost, ˇze knihovna je nyn´ı zaˇstit’ov´ana u ´spˇeˇsnou spoleˇcnost´ı, coˇz m´a vliv na budouc´ı v´ yvoj t´eto knihovny.
4.2
Common
Knihovna se spoleˇcn´ ym k´odem obsahuje pˇredevˇs´ım spoleˇcn´ y Parser, kter´ y implementuje komunikaˇcn´ı protokol. D´ale pak obsahuje tˇr´ıdu Config, kter´a slouˇz´ı k naˇc´ıt´an´ı a ukl´ad´an´ı konfiguraˇcn´ıch soubor˚ u.
4.2.1
Parser
Tˇr´ıda Parser poskytuje spoleˇcn´ y parser jak pro klientskou aplikaci, tak pro server. Kaˇzd´ y pak pouˇz´ıv´a pouze ˇca´st jej´ıho rozhr´an´ı. Po vytvoˇren´ı socketu pak kaˇzd´ y u ´ˇcastn´ık pˇripoj´ı na socket parser. Pro odes´ıl´an´ı zpr´av se volaj´ı jednotliv´e metody parseru a pro pˇr´ıjem zpr´av je tˇreba pˇripojit sign´aly parseru na pˇr´ısluˇsn´e sloty. Parser pak d´av´a vˇedet o pˇr´ıchoz´ıch zpr´av´ach pomoc´ı sign´al˚ u, jejichˇz zavol´an´ı pak zavol´a pˇripojen´e obsluˇzn´e metody. Jelikoˇz mohou jednotliv´e zpr´avy pˇrich´azet fragmentovanˇe, parser je zodpovˇedn´ y za jejich spojov´an´ı a pˇr´ısluˇsn´ y sign´al se zavol´a aˇz tehdy, kdyˇz je pˇrij´ıman´a zpr´ava kompletn´ı. V hlaviˇckov´em souboru parser/parserstructs.h jsou nav´ıc definov´any pomocn´e struktury pro reprezentaci pos´ılan´ ych informac´ı. Napˇr. struktura PublicPlayerData slouˇz´ı k reprezentaci veˇrejn´ ych informac´ı o hr´aˇci. Pokud chce server napˇr´ıklad poslat klientu informaci, ˇze se do hry pˇripojil nov´ y hr´aˇc, nejprve vytvoˇr´ı novou instanci PublicPlayerData a nastav´ı ji podle informac´ı o hr´aˇci. Nakonec zavol´a na parseru metodu eventPlayerJoinedGame 22
(const PublicPlayerData&), coˇz zajist´ı odesl´an´ı dan´ ych informac´ı klientovi. Parser na stranˇe klienta pak pˇr´ıjme zpr´avu, identifikuje ji a vytvoˇr´ı podle n´ı nov´ y objekt PublicPlayerData. Tento objekt je pak pomoc´ı sign´alu sigEventPlayerJoinedGame(const PublicPlayerData&) posl´an do pˇr´ısluˇsn´e obsluˇzn´e metody klienta. Tˇr´ıda Parser tvoˇr´ı tedy adapt´er mezi hern´ımi strukturami a hern´ım protokolem. Pokud by v budoucnu doˇslo ke zmˇenˇe protokolu (napˇr. na bin´arn´ı protokol), bylo by potˇreba pouze zmˇenit implementaci parseru — k´od klienta i serveru by z˚ ustal nezmˇenˇen.
4.2.2
Config
Tˇr´ıda Config se star´a o ukl´ad´an´ı r˚ uzn´ ych nastaven´ı do konfiguraˇcn´ıho souboru. Tato tˇr´ıda je implementov´ana jako singleton a jej´ı jedin´a instance je pˇr´ıstupn´a pˇres statickou metodu Config::instance(). Pˇri jej´ı konstrukci (kter´a je odloˇzena aˇz do momentu prvn´ıho pouˇzit´ı tˇr´ıdy) se automaticky naˇcte konfiguraˇcn´ı soubor a v pˇr´ıpadˇe, ˇze tento soubor neexistuje, nastav´ı se v´ ychoz´ı hodnoty. Tˇr´ıda pak poskytuje metody na ˇcten´ı a z´apis jednotliv´ ych poloˇzek. Poloˇzky v konfiguraˇcn´ım souboru jsou bud’ textov´e ˇretˇezce nebo seznamy textov´ ych ˇretˇezc˚ u. Vˇsechny tyto poloˇzky jsou nav´ıc seskupov´any do skupin. Pro naˇcten´ı poloˇzky je tedy potˇreba zadat kromˇe jej´ıho jm´ena i jm´eno skupiny, ve kter´e se nach´az´ı. Pro pohodln´ y pˇr´ıstup k ˇc´ıseln´ ym parametr˚ um nab´ız´ı tˇr´ıda tak´e metody pro z´apis a ˇcten´ı celoˇc´ıseln´ ych poloˇzek, kter´e jsou implementov´any pomoc´ı pˇretypov´an´ı z/na textov´ y ˇretˇezec. Po z´apisu nov´ ych poloˇzek do Configu je tˇreba uloˇzit zmˇeny pomoc´ı metody store(). Um´ıstˇen´ı konfiguraˇcn´ıho souboru je z´avisl´e na pouˇzit´e platformˇe. V pˇr´ıpadˇe Unix-like syst´em˚ u je to $HOME/.kbang/kbang.conf, na syst´emech Windows je to typicky C:\Documents and Settings\$USERNAME\kbang\kbang.conf. Soubor je ukl´ad´an v textov´em form´atu, tud´ıˇz nen´ı probl´em editovat ho jednoduch´ ym textov´ ym editorem.
4.3
Server
Server, aˇckoli m˚ uˇze najednou obsluhovat v´ıce klient˚ u a v´ıce her, je naps´an jako jednovl´aknov´a aplikace. Vyuˇz´ıv´a se pˇri tom syst´emu ud´alost´ı poskyto23
van´ ych knihovnou Qt4. Jednotliv´e akce na serveru prob´ıhaj´ı vˇzdy v reakci na pˇr´ıchoz´ı zpr´avy z klient˚ u. Server je tedy nutno implementovat tak, aby veˇsker´e metody byly neblokuj´ıc´ı. Jako pˇr´ıklad si uvedeme poˇzadavek klienta o l´ıznut´ı karet, kter´ y je zn´azornˇen na obr´azku 4.1. Jakmile pˇrijde zpr´ava od klienta na server, probud´ı se Parser (je zavol´an ze smyˇcky ud´alost´ı ˇr´ızen´e knihovnou Qt), rozpozn´a pˇr´ıchoz´ı zpr´avu a vyˇsle sign´al sigActionDrawCard(). Na tento sign´al je pˇripojen´ y slot onActionDrawCard() ve tˇr´ıdˇe Client. Tato metoda se zavol´a, zkontroluje, zda je klient pˇripojen´ y ke hˇre a pokud ano, zavol´a metodu draw() na instanci tˇr´ıdy PlayerCtrl, kter´a poˇzadavek propaguje d´al do vnitˇrn´ıch ˇca´st´ı serveru. Nakonec v metodˇe playerDrawFromDeck() tˇr´ıdy GameTable dojde ke zmˇenˇe stavu (dvˇe karty z vrcholu l´ızac´ıho bal´ıˇcku se pˇresunou do rukou hr´aˇce) a k ozn´amen´ı t´eto ud´alosti klient˚ um.
ˇıˇren´ı poˇzadavku o l´ıznut´ı karet uvnitˇr serveru Obr´azek 4.1: S´ Po proveden´ı kaˇzd´e reakce na pˇr´ıchoz´ı zpr´avu z klienta se kontext programu vˇzdy vr´at´ı do smyˇcky ud´alost´ı a ˇcek´a na dalˇs´ı zpr´avy.
4.3.1
Tˇ r´ıda GameServer
Tˇr´ıda GameServer je singleton, kter´ y pˇredstavuje cel´ y server. Star´a se o vytv´aˇren´ı a spr´avu klient˚ u (tˇr´ıda Client) a vytv´aˇren´ı a spr´avu her (tˇr´ıda Game). Jakmile pˇrijde na server pˇr´ıchoz´ı TCP spojen´ı, tato tˇr´ıda vytvoˇr´ı novou instanci tˇr´ıdy Client a pˇred´a ji socket. Tˇr´ıda Client se pak uˇz sama star´a o spojen´ı (pˇripoj´ı na nˇej parser ...).
24
4.3.2
Vnitˇ rn´ı implementace hry
Tˇr´ıda Game pˇredstavuje jednu hru. Tato tˇr´ıda se star´a o vytv´aˇren´ı nov´ ych hr´aˇcu a o udrˇzov´an´ı seznamu hr´aˇc˚ u. Jednotliv´ı hr´aˇci jsou reprezentov´ani tˇr´ıdou Player, kter´a se star´a o veˇsker´e atributy hr´aˇc˚ u, jako je napˇr´ıklad role a charakt´er hr´aˇce, karty v rukou a vyloˇzen´e karty na stole a poˇcet ˇzivot˚ u hr´aˇce. Tˇr´ıda GameCycle se star´a o udrˇzov´an´ı kontextu hry. Tato tˇr´ıda kontroluje, zda pˇr´ıchoz´ı hern´ı akce neodporuje kontextu hry. V pˇr´ıpadˇe platn´ ych akc´ı je tato tˇr´ıda propaguje d´ale, bud’ vol´an´ım metod konkr´etn´ıch zahran´ ych karet a nebo pˇr´ımo vol´an´ım metod tˇr´ıdy GameTable. Tˇr´ıda GameTable udrˇzuje vˇsechny tˇri sd´ılen´e kapsy — l´ızac´ı bal´ıˇcek, odhazovac´ı bal´ıˇcek a v´ybˇer. Kromˇe toho je to tak´e jedin´a tˇr´ıda, kter´a m´a pr´avo manipulovat s kartama. Pˇri manipulaci s kartama tato tˇr´ıda automaticky pos´ıl´a pˇr´ısluˇsn´e hern´ı ud´alosti (pomoc´ı tˇr´ıdy GameEventManager). Tˇr´ıda GameEventManager se star´a o ˇs´ıˇren´ı hern´ıch ud´alost´ı. Tˇr´ıdy, implementuj´ıc´ı rozhr´an´ı abstraktn´ı tˇr´ıdy GameEventListener se mohou zaregistrovat k odbˇeru hern´ıch ud´alost´ı a tato tˇr´ıda jim pak tyto ud´alosti pos´ıl´a. Vnitˇrn´ı implementace hry je oddˇelena od okoln´ıho svˇeta (ovladaˇc˚ u hr´aˇc˚ u) pomoc´ı fas´ady, kter´a je tvoˇrena tˇr´ıdami PublicGameView, PublicPlayerView, PrivatePlayerView a PlayerCtrl. V´ıce o t´eto fas´adˇe najdete v sekci 4.3.4.
4.3.3
Implementace karet
Funkce jednotliv´ ych typ˚ u karet jsou implementov´any pˇr´ımo v potomc´ıch tˇr´ıdy PlayingCard. Tato tˇr´ıda se star´a o udrˇzen´ı spoleˇcn´ ych rys˚ u vˇsech karet (identifik´ator, znak, hodnost, ...) a z´aroveˇ n poskytuje z´akladn´ı rozhr´an´ı pro konkr´etn´ı karty. virtual void play(); virtual void play(Player* targetPlayer); virtual void play(PlayingCard* targetCard); V´ ychoz´ı implementace tˇechto metod vyvol´a vyj´ımku BadUsageException. Tˇr´ıdy konkr´etn´ıch karet pak nˇekter´e z tˇechto metod pˇrekryj´ı sv´ ymi implementacemi. Tˇr´ıda TableCard rozˇsiˇruje tˇr´ıdu PlayingCard a slouˇz´ı jako nadtˇr´ıda pro karty, kter´e se daj´ı zahr´at na st˚ ul (karty s modr´ ym okrajem). Poskytuje metody registerPlayer() a unregisterPlayer(), kter´e jsou zavol´any v 25
Obr´azek 4.2: Tˇr´ıda Game a jej´ı okol´ı momentˇe, kdy se karta objev´ı vyloˇzen´a pˇred hr´aˇcem (resp. kdy karta opust´ı prostor pˇred hr´aˇcem). Tˇr´ıda ReactionCard rozˇsiˇruje tˇr´ıdu PlayingCard a slouˇz´ı jako nadtˇr´ıda pro karty, kter´e po zahr´an´ı oˇcek´avaj´ı reakci ostatn´ıch hr´aˇc˚ u. Tˇr´ıda konkr´etn´ı karty pouˇzije metodu setResponseMode() tˇr´ıdy GameCycle, kter´e kromˇe ukazatele na sama sebe poˇsle i ukazatel na hr´aˇce, po nˇemˇz ˇza´d´a reakci. Jakmile dan´ y hr´aˇc zareaguje, tˇr´ıda GameCycle zavol´a na kartˇe jednu z n´asleduj´ıc´ıch metod, podle dan´e reakce. virtual void respondPass(); virtual void respondCard(PlayingCard* targetCard); Funkce nˇekter´ ych karet jsou velmi podobn´e, a proto je obˇcas nˇekolik typ˚ u karet sdruˇzeno do jedn´e tˇr´ıdy. Napˇr´ıklad vˇsechny karty zbran´ı jsou implementov´any ve tˇr´ıdˇe WeaponCard. Karty Mustang a Appaloosa jsou zase implementov´any ve tˇr´ıdˇe CardHorse.
26
4.3.4
Ovladaˇ ce hr´ aˇ ce
Ovladaˇce hr´aˇce jsou tˇr´ıdy, kter´e ovl´adaj´ı pˇripojen´eho hr´aˇce. Tohoto hr´aˇce mohou ovl´adat samy (umˇel´a inteligence) a nebo mohou delegovat tuto ˇcinnost na jin´e tˇr´ıdy. V projektu jsou zat´ım dva ovladaˇce hr´aˇce - tˇr´ıda VoidAI a tˇr´ıda Client. Kaˇzd´ y ovladaˇc hr´aˇce mus´ı b´ yt schopen odes´ılat hern´ı akce a pˇrij´ımat hern´ı ud´alosti. K odes´ıl´an´ı hern´ıch akc´ı slouˇz´ı instance tˇr´ıdy PlayerCtrl, kterou ovladaˇc obdrˇz´ı jakmile se pˇripoj´ı do hry. K pˇr´ıjmu hern´ıch ud´alost´ı mus´ı ovladaˇc implementovat rozhr´an´ı tˇr´ıdy GameEventListener. Pˇri pˇripojov´an´ı se do hry odeˇsle ukazatel na sama sebe a vnitˇrn´ı implementace hry se postar´a o pˇrihl´aˇsen´ı k odbˇeru hern´ıch ud´alost´ı. Nav´ıc maj´ı ovladaˇce moˇznost samy si zjiˇst’ovat informace o hˇre. K tomu slouˇz´ı tˇr´ıda PublicGameView, kter´a poskytuje veˇrejn´e informace o hˇre. Tato tˇr´ıda tak´e umoˇzn ˇuje z´ıskat pro kaˇzd´eho hr´aˇce ve hˇre pˇr´ısluˇsnou instanci tˇr´ıdy PublicPlayerView. Skrze metody t´eto tˇr´ıdy pak m˚ uˇze ovladaˇc zjiˇst’ovat veˇrejn´e informace jednotliv´ ych hr´aˇc˚ u. V serveru jeˇstˇe existuje tˇr´ıda GameLogger, kter´a tak´e implementuje rozhr´an´ı GameEventListener, ale nejedn´a se o ovladaˇc. Tato tˇr´ıda pouze pˇrij´ım´a hern´ı ud´alosti a zapisuje je do log souboru. Aby log soubory mohly obsahovat tak´e neveˇrejn´e informace, tato tˇr´ıda je v GameEventManageru zaregistrovan´a jako supervizor, coˇz j´ı umoˇzn´ı z´ısk´avat hern´ ı ud´ alosti se soukrom´ ymi u ´daji (napˇr. informace o l´ıznut´ ych kart´ach).
4.4
Klient
Hlavn´ı okno klientsk´e aplikace obsahuje kromˇe hlavn´ı nab´ıdky v horn´ı ˇca´sti pouze hrac´ı plochu Bangu!. V lev´e spodn´ı ˇc´asti je oblast pro psan´ı zpr´av a v prav´e spodn´ı ˇca´sti je prostor, kde se zobrazuj´ı hern´ı ud´alosti (log) a nebo lad´ıc´ı informace (XML). D´ale jsou pak v oknˇe rozm´ıstˇeny oblasti pro zobrazov´an´ı jednotliv´ ych hr´aˇc˚ u. Cel´e toto okno je vizu´alnˇe vytvoˇreno pomoc´ı aplikace Qt Designer.
4.4.1
Tˇ r´ıda MainWindow
Tˇr´ıda MainWindow pˇredstavuje hlavn´ı okno aplikace. Hlavn´ı okno m´a v horn´ı ˇca´sti hlavn´ı nab´ıdku, skrze kterou se uˇzivatel pˇripojuje k serveru a vytv´aˇr´ı nebo pˇripojuje se ke hr´am. Pro pˇripojen´ı se k serveru, vytvoˇren´ı hry a 27
pˇripojen´ı se ke hˇre jsou vytvoˇrena dialogov´a okna (tˇr´ıdy ConnectToServerDialog, CreateGameDialog a JoinGameDialog). Tˇr´ıda MainWindow pouˇz´ıv´a instanci tˇr´ıdy ServerConnection ke komunikaci se serverem. Tato tˇr´ıda na poˇz´ad´an´ı vytvoˇr´ı spojen´ı se serverem a v pˇr´ıpadˇe u ´spˇechu nasad´ı na novˇe vzniknut´ y socket parser ze spoleˇcn´e knihovny (tˇr´ıda Parser). Jakmile pˇrijde ud´alost ze serveru o vstupu do game m´odu (v reakci na poˇzadavek klienta o pˇripojen´ı se do hry), vytvoˇr´ı se nov´a instance tˇr´ıdy Game, kter´a existuje do doby, neˇz pˇrijde poˇzadavek na opuˇstˇen´ı game m´odu. Instance tˇr´ıdy Game dostane pˇri inicializaci referenci na hern´ı widgety, kter´e po dobu sv´eho ˇzivota spravuje. Dostane tak´e referenci na ServerConnection, u kter´e si zaregistruje pˇr´ıjem hern´ıch ud´alost´ı a d´ale ji pouˇz´ıv´a k odes´ıl´an´ı hern´ıch akc´ı.
4.4.2
Tˇ r´ıda Game
Tˇr´ıda Game se star´a o zobrazov´an´ı hern´ı plochy a stavu hry (skrze widgety, kter´e ji jsou delegov´any) a tak´e o odes´ıl´an´ı hern´ıch akc´ı. Bˇehem inicializace tˇr´ıdy se vytvoˇr´ı GameEventHandler, kter´ y si zaregistruje pˇres referenci na ServerConnection odbˇer hern´ıch ud´alost´ı a star´a se pak o ˇrazen´ı pˇr´ıchoz´ıch hern´ıch ud´alost´ı do fronty a jejich postupn´e spouˇstˇen´ı. D´ale se pˇri inicializaci vytvoˇr´ı GameActionManager, kter´ y se star´a o obsluhu ud´alost´ı myˇsi nad hern´ımi widgety a o odes´ıl´an´ı hern´ıch akc´ı (skrze ServerConnection) na server. Nakonec se provede inicializace vˇsech hern´ıch widget˚ u. Objekt tˇr´ıdy Game m˚ uˇze nab´ yvat tˇr´ı stav˚ u. Stav NoInterface je v´ ychoz´ı stav po pˇripojen´ı do nerozehran´e hry. V tomto stavu je stˇredn´ı ˇc´ast okna pr´azdn´a. Stav CreatorInterface je v´ ychoz´ı stav po vytvoˇren´ı hry. Je-li Game v tomto stavu, uˇzivatel vid´ı uprostˇred okna tlaˇc´ıtko slouˇz´ıc´ı k spuˇstˇen´ı hry. Nakonec stav GameInterface slouˇz´ı pro samotnou hru, kdy je na stˇredu l´ızac´ı a odhazovac´ı bal´ıˇcek a prostor pro kapsu v´ybˇer. Hra mˇezi tˇemito stavy pˇrech´az´ı v z´avislosti na pˇrij´ıman´ ych hern´ıch ud´alostech ze serveru.
4.4.3
Hern´ı widgety
Tˇr´ıda Game spravuje po dobu sv´eho ˇzivota hern´ı widgety, delegovan´e tˇr´ıdou MainWindow a z´aroveˇ n (ve stavu GameInterface) vytv´aˇr´ı tˇri widgety nov´e — l´ızac´ı bal´ıˇcek (tˇr´ıda DeckWidget), odhazovac´ı bal´ıˇcek (tˇr´ıda GraveyardWidget) 28
QDialog
CreateGameDialog
AboutDialog 1
1
JoinGameDialog
ConnectToServerDialog
1
1
1 1
1 1
MainWindow
1
Game
1
+GameWidgets +showConnectToServerDialog() +showCreateGameDialog() +showJoinGameDialog() +showAboutDialog() +enterGameMode() +exitGameMode()
1
ServerConnection +socket: QTcpSocket* +connectToServer() +disconnectFromServer() 1
KBang - common
Parser
1
+attachSocket() +detachSocket()
Obr´azek 4.3: Tˇr´ıda MainWindow a kapsa v´ybˇer (tˇr´ıda CardListWidget). Mezi delegovan´ ymi widgety jsou widgety vˇsech hr´aˇc˚ u (tˇr´ıda LocalPlayerWidget pro lok´aln´ıho hr´aˇce a tˇr´ıda OpponentWidget pro oponenty). Kaˇzd´ y z tˇechto widget˚ u obsahuje kapsu ruka, kapsu st˚ ul a widget CharacterWidget, kter´ y slouˇz´ı k zobrazen´ı postavy hr´aˇce a k poˇc´ıt´an´ı ˇzivot˚ u. Propojen´ı hern´ıch widget˚ u je zobrazeno na obr´azku 4.4.
4.4.4
Hern´ı ud´ alosti
O obsluhu hern´ıch ud´alost´ı se star´a tˇr´ıda GameEventHandler a GameEventQueue. GameEventHandler nejprve pˇri inicializaci zaregistruje vˇsechny konkr´etn´ı 29
CardPocket +newCardPosition(): QPoint +push(CardWidget*) +setPocketType() +setOwnerId()
CardPileWidget +peek(): CardWidget* +pop(): CardWidget*
DeckWidget
GraveyardWidget
CardListWidget +take(cardId:int): CardWidget* cards *
localPlayerWidget 1
playerWidgets 7
roleWidget 1
Game
selectionWidget 1
CardWidget
playerId gameState gameContext
PlayerWidget
hand 1table 1
LocalPlayerWidget
OpponentWidget
CharacterWidget
Obr´azek 4.4: Tˇr´ıda Game a hern´ı widgety typy hern´ıch ud´alost´ı a inicializuje frontu ud´alost´ı - GameEventQueue. Jakmile pˇrijde ze serveru nov´a hern´ı ud´alost, GameEventHandler vytvoˇr´ı pˇr´ısluˇsn´eho potomka GameEvent a vloˇz´ı ho do fronty ud´alost´ı. Fronta ud´alost´ı postupnˇe odeb´ır´a ud´alosti a spouˇst´ı je zavol´an´ım jejich metody run(). Z´aroveˇ n si pˇripoj´ı jejich sign´al SIGNAL(finished(GameEvent*)) na sv˚ uj slot SLOT(onGameEventFinished(GameEvent*)). T´ımto zp˚ usobem se GameEventQueue dozv´ı, ˇze pr´avˇe bˇeˇz´ıc´ı hern´ı ud´alost skonˇcila a m˚ uˇze spustit dalˇs´ı ud´alost ve frontˇe. Je moˇzn´e tak´e doˇcasnˇe pozastavit spouˇstˇen´ı dosud ˇcekaj´ıc´ıch ud´alost´ı pomoc´ı metod pause() a resume(). Zaveden´ı fronty hern´ıch ud´alost´ı do programu m´a sv˚ uj v´ yznam. Nˇekter´e ud´alosti, jako tˇreba ud´alost pohybu karty, jsou v klientu zobrazeny ani30
GameEventHandler
Game
+pause() +resume() +clear()
GameEvent
GameEventQueue +add(GameEvent*) +onGameEventFinished(GameEvent*) +pause() +resume() +clear()
signal finished(GameEvent*) +run() +stop() +isReadyRun() +isRunning()
events *
CardMovementEvent GameContextChangeEvent
GameSyncEvent GameMessageEvent
PlayerEvent PlayerDiedEvent
Obr´azek 4.5: Hern´ı ud´alosti v klientu movanˇe a tedy nˇejak´ y ˇcas trv´a, neˇz se tyto ud´alosti projev´ı. Pokud bychom ud´alosti neˇradili do fronty, mohly by ud´alosti od serveru pˇrich´azet rychleji, neˇz bychom je staˇcili animovat a v lepˇs´ım pˇr´ıpadˇe by uˇzivatel vidˇel zmˇet’ karet l´ıtaj´ıc´ıch do vˇsech smˇer˚ u. Jakmile by pˇriˇsla ud´alost, kter´a by oˇcek´avala, ˇze jiˇz byla provedena pˇredeˇsl´a ud´alost, ale ona pˇredeˇsl´a ud´alost by se st´ale jeˇstˇe animovala, pravdˇepodobnˇe by doˇslo k p´adu aplikace.
4.4.5
Animace pohybu karet
Animace pohybu karet je zajiˇst’ov´ana tˇr´ıdu CardMovementEvent. Po spuˇstˇen´ı ud´alosti se podle informac´ı obdrˇzen´ ych od serveru vyhled´a karta, kter´a se bude animovat. Souˇca´st´ı informace od serveru je i zdrojov´a kapsa a tedy nen´ı probl´em kartu jednoznaˇcnˇe urˇcit i v pˇr´ıpadˇe, ˇze se jedn´a o nezn´amou kartu. Tˇr´ıda tuto kartu odstran´ı z dan´e kapsy a urˇc´ı novou, c´ılovou kapsu. Na t´eto kapse zavol´a virtu´aln´ı metodu newCardPosition(), kter´a vrac´ı pozici na kterou je tˇreba kartu um´ıstit. Tˇr´ıda nyn´ı zn´a zdrojovou (aktu´aln´ı) i c´ılovou pozici pro animaci pohybu karty a pomoc´ı klasick´eho line´arn´ıho vzorce pro pohyb konstantn´ı rychlost´ı provede animaci pohybu. Animace je implementov´ana pomoc´ı tˇr´ıdy QTimer. Abychom zajistili co nejplynulejˇs´ı pohyb, v kaˇzd´em zavol´an´ı timeru 31
si zjist´ıme ˇcas uplynul´ y od startu animace a ten pak pouˇzijeme k v´ ypoˇctu aktu´aln´ı polohy karty. Pokud se nˇekter´e z vol´an´ı timeru lehce opozd´ı, karta se jednoduˇse posune o vˇetˇs´ı kus a uˇzivatel nezaznamen´a trhan´ y pohyb. Jakmile karta doputuje na svou c´ılovou pozici, je vloˇzena do c´ılov´e kapsy, kter´a za n´ı d´ale pˇreb´ır´a zodpovˇednost.
4.4.6
Spr´ avce hern´ıch akc´ı
O zachyt´av´an´ı akc´ı uˇzivatele a generov´an´ı pˇr´ısluˇsn´ ych akc´ı pro server se star´a tˇr´ıda GameActionManager. Kaˇzd´a zobrazen´a karta (tˇr´ıda CardWidget) a tak´e kaˇzd´ y PlayerWidget reaguj´ı na ud´alosti myˇsi vol´an´ım pˇr´ısluˇsn´ ych metod GameActionManageru. Pˇri hran´ı nˇekter´ ych karet je potˇreba zadat doplˇ nuj´ıc´ı informaci, jako tˇreba c´ılov´y hr´aˇc nebo c´ılov´a karta. Uvnitˇr tˇr´ıdy GameActionManager je jednoduch´ y stavov´ y automat, kter´ y objekt pˇrep´ın´a do stav˚ u, kdy se oˇcek´av´a doplnˇen´ı c´ılov´eho hr´aˇce nebo karty. Jakmile je zad´ana kompletn´ı hern´ı akce, je odesl´ana na server. GameActionManager tak´e reaguje na stisk prav´eho tlaˇc´ıtka nad kartou. Tato akce negeneruje ˇza´dnou hern´ı ud´alost, ale provede zvˇetˇsen´ı karty (pomoc´ı tˇr´ıdy CardZoomWidget).
32
Kapitola 5 Uˇ zivatelsk´ a dokumentace 5.1 5.1.1
Instalace Windows XP/Vista 32 bit
KBang je pro Windows distribuov´an ve formˇe zip arch´ıvu. Tento arch´ıv obsahuje kromˇe vlastn´ıch spustiteln´ ych soubor˚ u pro klienta a server tak´e potˇrebnou grafiku karet a potˇrebn´e DLL soubory (vˇcetnˇe runtime knihovny Qt4). Arch´ıv staˇc´ı rozbalit do libovoln´e sloˇzky a spustit jeden z exe soubor˚ u.
5.1.2
Linux
Vzhledem k r˚ uznorodosti linuxov´ ych syst´em˚ u neexistuje jedno standardn´ı ˇreˇsen´ı distribuce software. Z tohoto d˚ uvodu je zat´ım potˇreba na linuxu cel´ y projekt zkompilovat. Pˇred samotnou kompilac´ı se ujistˇete, ˇze m´ate vhodn´ y kompil´ator (doporuˇcuji aspoˇ n gcc 4.1 ) a dev verzi knihovny Qt4 (minim´alnˇe ve verzi 4.4 1 , ale doporuˇcuji verzi 4.5 a vyˇsˇs´ı). Pro kompilaci program˚ u v linuxu je tak´e doporuˇcov´ana alespoˇ n z´akladn´ı u ´roveˇ n pr´ace s pˇr´ıkazovou ˇra´dkou. Pokud nem´ate k dispozici zdrojov´e k´ody aplikace, m˚ uˇzete je z´ıskat na str´ance projektu [4]. Samotnou kompilaci provedete vloˇzen´ım n´asleduj´ıc´ıch pˇr´ıkaz˚ u do termin´alu: $ cd kbang 1
V t´eto verzi se na nˇekter´ ych syst´emech objevuj´ı probl´emy se sekanou animac´ı pohybu karet
33
$ qmake kbang.pro $ make Nyn´ı by mˇely b´ yt vytvoˇreny bin´arky kbang-client a kbang-server, kter´e m˚ uˇzete spustit.
5.2
Server
Po spuˇstˇen´ı serveru je vˇse pˇripraveno pro pˇripojen´ı klient˚ u. Se serverem vˇsak lze d´ale pracovat pomoc´ı konzole. Do konzole m˚ uˇzete zad´avat pˇr´ıkazy — nˇekter´e z nich vyˇzaduj´ı zad´an´ı parametr˚ u. Parametry pˇr´ıkazu se p´ıˇs´ı za pˇr´ıkaz a oddˇeluj´ı se mezerou. N´asleduje pˇrehled pˇr´ıkaz˚ u z kr´atk´ ym popisem. Pˇr´ıkaz help
Popis vyp´ıˇse seznam vˇsech pˇr´ıkaz˚ u vˇcetnˇe kr´atk´eho popisu jejich funkce quit ukonˇc´ı server list-games vyp´ıˇse seznam her na serveru list-clients vyp´ıˇse seznam klient˚ u pˇripojen´ ych k serveru set-player-password umoˇzn´ı nastavit heslo hr´aˇce; tento pˇr´ıkaz vyˇzaduje tˇri parametry: id hry, id hr´aˇce a nov´e heslo
5.3
Klient
Ovl´ad´an´ı KBangu je vesmˇes intuitivn´ı a uˇzivatel, kter´ y dobˇre zn´a Bang! by nemˇel m´ıt probl´emy. Snad jedin´e ˇca´sti ovl´ad´an´ı hry, se kter´ ymi maj´ı zaˇc´ınaj´ıc´ı hr´aˇci KBangu probl´em, jsou pouˇz´ıv´an´ı karet vyˇzaduj´ıc´ı l´ıznut´ı“ ” (5.3.10) a pouˇz´ıv´an´ı vlastnost´ı (5.3.11).
5.3.1
Pˇ ripojen´ı se k serveru
Po spuˇstˇen´ı klientsk´e aplikace je tˇreba pˇrihl´asit se k serveru. Pomoc´ı volby Connect to Server v nab´ıdce Game otevˇrete dialog pro v´ ybˇer serveru. Pokud jste KBang spustili poprv´e, bude nab´ıdka server˚ u obsahovat pouze jedin´ y server — alderan.cz. Tento server je urˇcen´ y pro veˇrejnost a doporuˇcuji v´am hr´at pr´avˇe na nˇem. Pomoc´ı tlaˇc´ıtek Add Server, Edit Server a Delete Server m˚ uˇzete upravovat seznam server˚ u. Tento seznam se po uzavˇren´ı dialogu 34
Obr´azek 5.1: KBang Klient automaticky uloˇz´ı do konfiguraˇcn´ıho souboru. Pro pˇripojen´ı vyberte server ze seznamu a kliknˇete na tlaˇc´ıtko Connect.
5.3.2
Zaloˇ zen´ı hry
Po pˇripojen´ı ke hˇre m´ate bud’ moˇznost zaloˇzit novou hru a nebo se pˇripojit k jiˇz zaloˇzen´e hˇre. Pokud se rozhodnete pro zaloˇzen´ı hry, vyberte volbu Create Game z nab´ıdky Game. Otevˇre se nov´e dialogov´e okno, ve kter´em m˚ uˇzete zadat parametry nov´e hry. M˚ uˇzete zde nastavit jm´eno hry, omezit minim´aln´ı a maxim´aln´ı poˇcet hr´aˇc˚ u nebo nastavit poˇcet poˇc´ıtaˇcov´ ych hr´aˇc˚ u. M´ate zde tak´e moˇznost nastavit heslo pro pˇripojuj´ıc´ı se hr´aˇce. Posledn´ı volba umoˇzn ˇuje rozhodnout, zda budu hr´aˇci rozm´ıstˇen´ı okolo stolu podle poˇrad´ı, v jak´em se pˇripojovali k serveru nebo zda budou hr´aˇci pˇri spuˇstˇen´ı hry zam´ıch´ani. Nakonec je zde jeˇstˇe tˇreba vyplnit u ´daje o hr´aˇci. M˚ uˇzete zde nastavit 35
jm´eno a heslo hr´aˇce a taky avat´ar (mal´ y obr´azek hr´aˇce). Heslo slouˇz´ı k opˇetovn´emu pˇripojen´ı se k hr´aˇci, napˇr´ıklad v d˚ usledku p´adu pˇripojen´ı bˇehem hry. Avat´ar nastav´ıte kliknut´ım na r´ameˇcek s textem Avatar. Objev´ı se dialog ve kter´em vyberete soubor s obr´azkem. Obr´azek by mˇel m´ıt ˇctvercov´ y form´at, jinak dojde k deformaci obr´azku. Nez´aleˇz´ı na velikosti, obr´azek se automaticky pˇreˇsk´aluje do spr´avn´e velikosti. Po nastaven´ı vˇsech parametr˚ u vytvoˇr´ıte hru kliknut´ım na tlaˇc´ıtko Create.
5.3.3
Pˇ ripojen´ı se do hry
Pokud se chcete pˇripojit k jiˇz existuj´ıc´ı hˇre, vyberte volbu Join Game z nab´ıdky Game. V lev´e ˇc´asti novˇe otevˇren´eho dialogu uvid´ıte seznam vˇsech her, kter´e pr´avˇe prob´ıhaj´ı na serveru. Po kliknut´ı na jednu z her se objev´ı v prav´e ˇc´asti dialogu informace o dan´e hˇre, vˇcetnˇe seznamu hraj´ıc´ıch hr´aˇc˚ u. V prav´e spodn´ı ˇc´asti se tak´e vyskytuje oblast pro zad´an´ı informac´ı o hr´aˇci. Nejˇcastˇeji se nejsp´ıˇs budete pˇripojovat do jeˇstˇe nespuˇstˇen´ ych her. Takov´e hry maj´ı ve sloupc´ı State naps´ano Waiting. Chcete-li se pˇripojit do takov´e hry, kliknˇete na danou hru a v seznamu hr´aˇc˚ u se ujistˇete, ˇze je vybran´a posledn´ı moˇznost Create new player. Tlaˇc´ıtkem Play se pˇripoj´ıte do hry. Druh´a moˇznost je pˇripojit se do jiˇz rozehran´e hry m´ısto hr´aˇce, kter´ y se odpojil. V tomto pˇr´ıpadˇe kliknˇete na danou hru a v seznamu hr´aˇc˚ u vyberte hr´aˇce, m´ısto kter´eho se chcete pˇripojit. Hr´aˇci, na kter´e se nelze pˇripojit jsou zobrazen´ı ˇsedou barvou a nelze je vybrat. Abyste mohli nahradit dan´eho hr´aˇce, je tˇreba vyplnit do pole Player Password stejn´e heslo, jak´e zadal p˚ uvodn´ı uˇzivatel pˇri pˇripojov´an´ı se do hry. Pot´e kliknˇete na tlaˇc´ıtko Play.
5.3.4
Zah´ ajen´ı hry
Po zaloˇzen´ı hry je tˇreba poˇckat na ostatn´ı hr´aˇce. Jakmile se pˇripoj´ı dostatek hr´aˇc˚ u, zakladatel hry m˚ uˇze kliknout na tlaˇc´ıtko Start Game uprostˇred hern´ı plochy, ˇc´ımˇz zah´aj´ı hru.
5.3.5
Kontrola karty pˇ red l´ıznut´ım
Pokud m´a v´aˇs hr´aˇc pˇred sebou vyloˇzenou kartu Vˇezen´ı nebo Dynamit, je tˇreba pˇred l´ıznut´ım si karet otoˇcit vrchn´ı kartu z l´ızac´ıho bal´ıˇcku, kter´a rozhodne, zda se dostanete z vˇezen´ı (popˇr. zda dynamit vybouchne ˇci ne).
36
Pro tento u ´ˇcel je tˇreba kliknout na onu vyloˇzenou kartu. V pˇr´ıpadˇe, ˇze m´ate pˇred sebou obˇe karty, nejprve se klik´a na Dynamit a pot´e na Vˇezen´ı.
5.3.6
L´ıznut´ı karty
Kliknut´ım na bal´ıˇcek karet si l´ıznete dvˇe karty. Nˇekter´e postavy mohou pouˇz´ıt alternativn´ı zp˚ usob l´ıznut´ı, urˇcen´ y jejich vlastnost´ı. V´ıce o pouˇz´ıv´an´ı vlastnosti najdete v sekci 5.3.11.
5.3.7
Hran´ı karet
Kartu z ruky zahrajete jednoduˇse kliknut´ım na ni. V pˇr´ıpadˇe, ˇze se jedn´a o kartu Bang!, Duel nebo Vˇezen´ı, je tˇreba po kliknut´ı na kartu vybrat c´ılov´eho hr´aˇce. V pˇr´ıpadˇe karet Cat Balou a Panika mus´ıte vybrat c´ılovou kartu.
5.3.8
Reakce
V pˇr´ıpadˇe, ˇze na v´as byl zahr´an Bang! (nebo jin´a u ´toˇcn´a karta) m˚ uˇzete se br´anit zahr´an´ım karty Vedle (nebo jinou obranou kartou, dle pravidel). V pˇr´ıpadˇe, ˇze nem´ate, nebo nechcete zahr´at Vedle, pouˇzijte tlaˇc´ıtko P, ˇc´ımˇz si uberete ˇzivot.
5.3.9
V´ ybˇ er karet
V nˇekter´ ych pˇr´ıpadech hry (napˇr. po zahr´an´ı karty Hokyn´aˇrstv´ı) dojde k vyloˇzen´ı nˇekolika karet ve stˇredn´ı ˇca´sti hern´ı plochy. Jakmile na v´as pˇrijde ˇrada, vyberte si kartu kliknut´ım na ni.
5.3.10
Pouˇ z´ıv´ an´ı karet vyˇ zaduj´ıc´ı l´ıznut´ı“ ”
Pokud si potˇrebujete l´ıznout na efekt nˇejak´e karty, kliknˇete na tuto kartu. T´ımto zp˚ usobem se napˇr´ıklad pouˇz´ıv´a karta Barel.
5.3.11
Pouˇ z´ıv´ an´ı vlastnost´ı
Vlastnosti nˇekter´ ych postav vyˇzaduj´ı aktivaci hr´aˇcem. U tˇechto postav aktivujete vlastnost kliknut´ım na kartu postavy. V pˇr´ıpadˇe postavy Jesse Jones, kter´a si m˚ uˇze prvn´ı kartu l´ıznout z ruky libovoln´eho hr´aˇce je po
37
kliknut´ı na postavu tˇreba vybrat c´ılov´eho hr´aˇce. Podobnˇe pˇri pouˇzit´ı vlastnosti postavy Sid Ketchum (odhod’ dvˇe karty z ruky a pˇridej si jeden ˇzivot) mus´ıte po kliknut´ı na kartu postavy vybrat dvˇe karty k odhozen´ı.
5.3.12
Odhozen´ı pˇ reb´ yvaj´ıc´ıch karet
Na konci sv´eho tahu nesm´ı m´ıt ˇza´dn´ y hr´aˇc v´ıce karet neˇz je jeho poˇcet ˇzivot˚ u. Pokud tato podm´ınka nen´ı splnˇena, mus´ı hr´aˇc odhodit pˇreb´ yvaj´ıc´ı karty. V tomto pˇr´ıpadˇe kliknˇete na tlaˇc´ıtko D a vyberte karty k odhozen´ı. Jakmile se napln´ı uveden´a podm´ınka, v´aˇs tah automaticky skonˇc´ı a pokraˇcuje dalˇs´ı hr´aˇc.
5.3.13
Ukonˇ cen´ı tahu
V pˇr´ıpadˇe, ˇze chcete ukonˇcit sv˚ uj tah (a nem´ate ˇz´adn´e pˇreb´ yvaj´ıc´ı karty), kliknˇete na tlaˇc´ıtko T.
5.3.14
Zvˇ etˇ sen´ı karty
Aby se na obrazovku veˇsly vˇsechny d˚ uleˇzit´e informace, karty jsou v klientu docela mal´e. Stisknut´ım prav´eho tlaˇc´ıtka myˇsi nad kartou si m˚ uˇzete danou kartu zvˇetˇsit.
5.4
Konfiguraˇ cn´ı soubor
Veˇsker´a nastaven´ı jak klienta tak serveru se ukl´adaj´ı do konfiguraˇcn´ıho souboru. Tento konfiguraˇcn´ı soubor se (pokud neexistuje) s´am vytvoˇr´ı po prvn´ım spuˇstˇen´ı klienta nebo serveru. Um´ıstˇen´ı souboru z´avis´ı na operaˇcn´ım syst´emu: Windows: C:\Documents and Settings\$USERNAME\kbang\kbang.conf Linux: $HOME/.kbang/kbang.conf Konfiguraˇcn´ı soubor je v textov´em form´atu, d´ıky ˇcemuˇz jej lze editovat bˇeˇzn´ ym textov´ ym editorem. Konfiguraˇcn´ı soubor je rozdˇelen do skupin. Kaˇzd´a skupina zaˇc´ın´a ˇra´dkem [jm´ eno skupiny] a na n´asleduj´ıc´ıch ˇra´dc´ıch
38
je seznam poloˇzek. Poloˇzka m˚ uˇze obsahovat bud’ textov´ y ˇretˇezec nebo seznam textov´ ych ˇretˇezc˚ u. V pˇr´ıpadˇe jednoduch´e poloˇzky m´a ˇr´adek tvar polozka=hodnota a v pˇr´ıpadˇe seznam˚ u se jednotliv´e prvky seznam˚ u zapisuj´ı seznam[]=hodnota. Takto vypad´a v´ ychoz´ı konfiguraˇcn´ı soubor: [network] server_bind_ip=0.0.0.0 server_description=Default Description server_name=KBang Server server_port=6543 [player] name=Player password= [server-list] hostname[]=alderan.cz port[]=6543
39
Kapitola 6 Z´ avˇ er 6.1
Budoucnost projektu
Vzhledem k vesmˇes pozitivn´ım reakc´ım lid´ı z diskuzn´ıho f´ora na serveru bang.cz jsem se rozhodl, ˇze budu pokraˇcovat ve v´ yvoji projektu. Ode dne co jsem na tomto f´oru inzeroval prvn´ı hratelnou verzi KBangu se zaˇcly objevovat ˇza´dosti o pˇrid´an´ı t´e ˇci on´e funkcionality. Dokonce i j´a jsem pˇri kaˇzdoveˇcern´ım testov´an´ı“ hry dost´aval n´apady na vylepˇsen´ı, jejichˇz real” izaci jsem musel odloˇzit, abych stihl dokonˇcit projekt vˇcas. Mezi nejv´ıce ˇza´dan´a vylepˇsen´ı patˇr´ı bezesporu moˇznost zobrazovat karty vˇetˇs´ı. Velikosti karet jsou pevnˇe nastaven´e tak, aby se hlavn´ı okno veˇslo na monitor s rozliˇsen´ım 1024 × 768. V dneˇsn´ı dobˇe jsou vˇsak mnohem ˇcastˇejˇs´ı vˇetˇs´ı rozliˇsen´ı, jako 1280 × 1024 a taky 1600 × 1200 jiˇz nen´ı v´ yjimkou. Pokud se hlavn´ı okno klienta na takov´ ych rozliˇsen´ıch maximalizuje, je v oknˇe hodnˇe nevyuˇzit´e plochy. D´ıky faktu, ˇze karty jsou ˇsk´alov´any na konkr´etn´ı velikosti aˇz v klientu je moˇzn´e karty ˇsk´alovat dynamicky. Jedna z moˇznost´ı je umoˇznit uˇzivateli ˇsk´alovat velikost karet pomoc´ı kombinace kl´aves (napˇr. Ctrl + + a Ctrl + - ). Jin´a moˇznost je karty dynamicky ˇsk´alovat pˇri zmˇenˇe velikosti okna. Dalˇs´ı ˇcasto zmiˇ novan´e vylepˇsen´ı je implementace ofici´aln´ıch rozˇs´ıˇren´ı. Tento c´ıl bych vˇsak sp´ıˇse zaˇradil mezi dlouhodob´e c´ıle, jelikoˇz bude moˇzn´a potˇreba upravit architekturu aplikace. Jelikoˇz se nyn´ı hraje KBang v´ yhradnˇe na serveru alderan.cz, pˇrem´ yˇslel jsem o vytvoˇren´ı autentifikaˇcn´ıho syst´emu. Kaˇzd´ y hr´aˇc by se potom mohl volitelnˇe zaregistrovat a hr´at pod sv´ ym u ´ˇctem. Na z´akladˇe odehran´ ych her by se pak kaˇzd´emu registrovan´emu uˇzivateli vytv´aˇrela statistika, popˇr. by 40
se mohl zobrazovat ˇzebˇr´ıˇcek hr´aˇc˚ u. Jako u ´schovna dat by se mohl pouˇz´ıvat nˇejak´ y datab´azov´ y syst´em a dokonce by mohlo existovat webov´e rozhran´ı, umoˇzn ˇuj´ıc´ı prohl´ıˇzet statistiku v bˇeˇzn´em webov´em prohl´ıˇzeˇci. D´ale je v budoucnu tˇreba vˇenovat ˇcas umˇel´e inteligenci. Souˇcasn´a umˇel´a inteligence je velmi hloup´a a proto bude tˇreba napsat novou, lepˇs´ı. Tak´e bych r´ad napsal adapt´er, kter´ y by pˇrevedl rozhran´ı pro ovladaˇce hr´aˇce do nˇejak´eho jednoduch´eho skriptovac´ıho jazyka. T´ımto krokem bych umoˇznil komukoli s aspoˇ n z´akladn´ı znalosti programov´an´ı napsat si svou vlastn´ı umˇelou inteligenci a d´ale bychom mohli uspoˇr´adat soutˇeˇz o nejlepˇs´ı umˇelou inteligenci. Pˇrihl´aˇsen´e umˇel´e inteligence by pak svedli souboj v ˇreknˇeme desetitis´ıc´ıch hr´ach a umˇel´a inteligence s nejvˇetˇs´ım sk´ore by byla zaˇclenˇena do projektu. Jedna s d˚ uleˇzit´ ych vˇec´ı pro rozˇs´ıˇren´ı KBangu je jednoduch´a instalace. Do budoucna bych r´ad pˇridal nˇejak´ y sluˇsn´ y windows instal´ator a tak´e bych r´ad vytv´aˇrel bal´ıˇcky pro pˇredn´ı linuxov´e distribuce. Dlouhodob´ ym c´ılem by pak bylo dostat se do ofici´aln´ıch repozit´aˇr˚ u linuxov´ ych distribuc´ı.
41
Literatura [1] Blanchette J., Summerfield M. (2008): C++ GUI Programming with Qt 4 — Second Edition [2] DaVinci Games — ofici´aln´ı str´anka hry, http://www.davincigames.com/page eng.cfm?sez=01&gioco=bang!
[3] Ezust A., Ezust P. (2006): An Introduction to Design Patterns in C++ with Qt 4 [4] KBang — str´anka projektu http://code.google.com/p/kbang
42