Tuto hru jsem tvořil jako semestrální práci pro předměty Programování v jazyku Java (Y36PJV) a Objektové modelování (Y36OMO). V článku naleznete jak funkční multiplatformní hru, tak zdrojové kódy a dokumentaci.
Pokud se chcete jen podívat na hru, zascrolujte si níže. Upozorňuji, že se jedná o multiplayer-only (TCP / IP) hru. Hra proti počítači není implementována.
Dalo by se říci, že tato hra je ukázkou toho, co je člověk schopný naprogramovat v Jave po roce studia na mém oboru, i když předtím Javu nikdy neviděl.
Na rozdíl od semestrální práce z prvního semestru, tato je již s grafickým uživatelským rozhraním. Ostatně povaha projektu to v podstatě vyžaduje (nikoliv nezbytně, spolužák má v plánu dělat v C Lodě do příkazové řádky a už takhle udělal Tetris, takže mu docela věřím ).

Jestli studujete školu týkající se programování, budu rád, když mi pošlete ukázku vašich prací (na formě nezáleží). Jenom mě zajímá, jaké jsou pokroky na jiných školách.
Zadání
Co budeme programovat, jsme si mohli zvolit zcela volně. Tady jsem udělal první chybu hned v základu, nicméně byl jsem si jí vědom a nemohl jsem s tím nic moc dělat. Totiž nenapadlo mě nic užitečného, co by bylo pořádně k něčemu dobré a programovat něco jen kvůli semestrální práci, je otrava. Zvolil jsem si tedy jednu z her, která byla v oficiální nabídce projektů a rozhodl se ji alespoň trochu parafrázovat, k tomu ale později.
Samozřejmě jsme si nemohli zvolit „Hello world třikrát jinak“, ale něco odpovídající složitosti. V mém konkrétním případě s cvičícím (a zároveň přednášejícím) Mgr. Michalem Píšem to bylo tak, že jsme mu před koncem semestru měli poslat své zadání, které by případně upravil, pokud by bylo moc jednoduché.
Zápočty pak nebyly rozdávány jen za jakési programování v Javě, ale bylo třeba splnit několik věcí:
- Podmínky pro PJV:
- Odevzdaná práce musí být řádně odladěná a zdokumentovaná pomocí Javadoc.
- Dále v práci musí být použity alespoň tři z těchto oblastí:
- práce se soubory
- síťová komunikace
- databáze (s použitím JDBC)
- grafické uživatelské rozhraní (AWT nebo SWING, bez použití grafického nástroje ve vývojovém prostředí)
- vícevláknový přístup
- kolekce
- Podmínky pro OMO:
- Obecný požadavek na kulturnost kódu (kvalitní OOP).
- Po celou dobu vývoje je její kód ve školním repozitáři (Subversion).
- Jde přeložit pomocí antu mimo NetBeans jedním příkazem ant build (Ant).
- Příkazem ant test půjdou spustit unit testy, po jejich skončení code coverage vygeneruje report potvrzující stoprocentní pokrytí.
Algorithms
Algoritmy a v angličtině? Co to sakra je?
V angličtině je hlavně proto, že když už vyrábím stokrát ohranou písničku, ať má alespoň větší publikum a tedy větší šanci, že se někomu zalíbí (mám v plánu přidat hru na pár serverů typu Slunečnice.cz.
A co mají znamenat ty algoritmy? Jsem ITák, co ode mě čekáte ... Vzniklo to na jedné nudné přednášce, kdy Barča přišla s návrhem, že si zahrajeme Lodě. Tady se projevila moje IT degenerace, kdy jsem odpověděl něco jako: „Nemůžeme, nejde mi internet.“ Kdo by to byl řekl, že se dají Lodě hrát na papíře!
Už nevím, kdo pak přišel s tou parafrází lodí na algoritmy, ale patrně jsem to byl já (dělal jsem semestrální práci na asymptotickou složitost algoritmů).
Gama verze hry Algorithms. Jak je vidět, v této verzi docházelo k chybnému výpočtu 15x15=255.


Pro hraní nepotřebujete vědět nic jiného, než jak se hrají Lodě nebo-li Battleships. Princip je úplně stejný. Pokud vás zajímá příběh hry Algorithms, přečtěte si legendu pod bitevním polem ve hře.
Vývoj
Nebudu popisovat implementaci. Pokud vás zajímá, stáhněte si zdrojové kódy a prostudujte dokumentaci (viz. níže).

V první verzi, která nebyla uznána pro zápočet (ale následující nebyl důvod neuznání), hra fungovala čistě na střídání. Vůbec mi to nepřišlo divné, až kamarádka mi řekla, že by člověk měl mít další tah, když se trefí. Vlastně existovala ještě jedna předverze, kde jsem dokonce vykresloval grafiku dost hloupým způsobem, což je vidět na obrázku, kde je bug ve zobrazení posuvníku u legendy.
O nějaký ten měsíc později jsem se ke hře vrátil a hodně razantně jsem jí upravil. Sám jsem si na některých místech říkal, že se nedivím, proč mi ten zápočet nebyl udělen. Ostatně byla to má první OOP aplikace a jejímu programování nepředcházel žádný UML diagram, takže jsem vše dělal „on the fly“, a tak se prostě kvalitní aplikace programovat nedá.
Při opravách na mě vyplynulo snadné doprogramování některých částí (a hlavně tyto opravy jsou dost ubíjející - programujete, programujete a na venek je výsledek buď horší než výchozí bod nebo při nejlepším stejný - a tak jsem chtěl něco přidat). Co se změnilo od první verze:
- Když hráč trefí protihráče, má další tah.
- Kdo má tah, je poznat podle „bubliny“ u počítače hráče (dříve se zobrazovaly neustále u obou).
- Algoritmy si můžete nechat automaticky rozmístit (Battlefield -> Generate).
- Pravým tlačítkem myši si můžete během hry označovat políčka (obvykle ty, kde jste si jisti, že zde nemůže algoritmus být).
- Na konci hry hráči dostanou statistiku o jejich / i protihráčovo přesnosti střelby.
Byl jsem v pokušení ještě doprogramovat hru pro jednoho hráče proti počítači. Nakonec jsme si ale řekl ne. Především proto, že se jedná o 100x naprogramovanou věc a když si člověk chce něco takového zahrát proti počítači, má hodně možností jinde. Ale pokud byste si chtěli zahrát tuto hru na jednom počítači s kamarádem / kamarádkou, mám pro vás tip. Rozmístěte si algoritmy (druhý se nesmí dívat) a založte server. Poté okno posuňte tak, aby vaše lodě nebyly vidět, ale aby bylo vidět pole protihráče. Poté se nedívejte vy a v druhé instanci hry udělá to samé protihráč, jenom místo založení serveru se připojí na localhost (127.0.0.1). A můžete hrát! ... a nebo si sežeňte papír a tužku.
Stažení
Na rozdíl od minulé práce, tentokrát jsem se rozhodl zdrojové kódy zveřejnit:
- Hra Algorithms
- Celý projekt včetně zdrojových kódů, Javadoc a Antu (nejedná se o NetBeans projekt, ale lze do něj importovat - nedělá se to přes tlačítko import, ale přes založení nového projektu)
Známé bugy: Ve WinXP je částečně skryta dolní lišta. Je to způsobené tím, že v každém OS je šířka menu malinko jiná a já nepoužívám layout, který by pozici ostatních prvků automaticky přepočítal. Nicméně není to nic, co by zvláště vadilo.

Něco málo k odevzdávání semestrální práce, Mgr. M. Píšemu a úrovni hodnocení
Jestli to tu čtete, tak víte, že mám MP jako přednášejícího rád. Vypouštím to tu jen proto, abych mu trochu zlepšil pověst. Pár lidí o něm totiž nemluví moc hezky, ale troufnul bych si tvrdit, že jejich slova pramení jen z jejich vlastní hlouposti a faktu, že MP nedává zápočty / zkoušky úplně zadarmo (ale co si budeme povídat, nároky na E byly minimální).
Mé odevzdání semestrální práce u MP neprobíhalo hladce. Jak už jsem psal v jiném článku, při prvním pokusu nedošlo ani k otevření projektu, protože jsem jej zaslal na mail a MP jej chtěl do repozitáře. Po úspěšném nahrání pak jedna verze byla zamítnuta, a po dlouhém oddechu a značné úpravě už druhá verze prošla. Nutno říct, že mezí prvním pokusem a dosažením cíle proběhla výměna mnoha e-mailů.
Možná si teď říkáte, že kdybych zápočet nedostal, tak tady píši trochu něco jiného, ale není tomu tak. Já už jsem vzhledem k oddalování oprav moc nepočítal s tím, že zápočet dostanu, ale nijak to můj názor na M. Píšeho neovlivnilo. Však moje práce není zdaleka dokonalá a některé přednášky OMO bych si rád poslechnul ještě jednou.
Jde o to, že bych si příští rok zapsal jiného cvičícího, který by mi tu samou semestrální práci uznal bez mrknutí oka a zkouška ani mid-term test pro mne nebyl problém. Tady se dostávám k tomu, co mi hodně vadí. Z OMO by se mohl stát další sítovací předmět, jako je třeba Algebra, ale v oblasti programování. Je pravda, že v prvním ročníku (před rozřazením) je na STM hodně studentů, kteří se programování věnovat nechtějí (chtějí se zaměřit na grafiku nebo ekonomiku), ale stejně. Zkrátka co mi vadí je, že jsem slyšel z mnoha stran, jak cvičící OMO uznávají semestrální práce jak na běžícím páse, kolikrát bez nahlédnutí do zdrojového kódu. Když jsem toto porovnal s kontrolou mé práce, samozřejmě jsem se cítil znevýhodněn.
P.S.: Teď se dívám na rozvrh na 3. semestr a žádnej vyloženě kávovej předmět tam není, že by konec Javy?
shabbi<zavináč>shabbi
cz
Tak především - závidím rozvrh na 3. semestr - máš fajn předměty, my na VUT FITu si počkáme až do čtvrtého na věci jako OOP, Java, Grafika, Umělá inteligence,..
) ale aplikace vypadá velice kvalitně. Navíc jsem pochopil, že jsi na tom dělal sám a opět přemýšlím, jestli nechodím na špatnou školu. Nás v Javě čeká OOP projekt s GUI a ukládáním na serveru (kalendář/upomínkovač), a teď pozor - pro týmy o čtyřech lidech
...

Takže pokud by tě zajímalo nějaké old-school command-line C, mrkni na můj web - v pravém sloupci v části "Stránky" 

Jinak ale článek parádní! Zdrojáky jsem sice nestahoval/nezkoumal (dal bych přednost nějakému diagramu
Nemám nic proti práci v týmech, ale doteď jsme psali pouze Céčkové prográmky pro příkazový řádek a když už přijde něco zajímavějšího, tak to člověk ani nemůže dělat sám
A psal jsi o zveřejňování zdrojáků, což se snažím podpořit. Konkrétně na naší fakultě dělám tak trochu osvětu, málokdo chce svoji práci zveřejňovat. Já ale nevidím důvod proč se nepodělit a nepochlubit (když je navíc dobré hodnocení)
...a já se budu těšit na další zveřejněný projekt
Já bych tohle pravděpodobně neudělala a to dělám už druhý rok:-) nicméně je ot tím, že se spíše orientuji jiným směrem:-)
Jinak třetí semestr si Javy ještě užiješ neboj, hlavně v ísítch, budete dělat síťový automat a přenos souborů přes UDP s potvrzováním. Můžeš si vybrat C nebo Javu. A výklad DSA je prezentován na Javě, ale ot je very simple java:-) Jinak doporučuji si zapsat v dalším semestru Technologie programování v Javě, případně i Enterprise Java, a pronikneš do taů Javy EE:-)
Pěkné. .) Osobně jsem první GUI aplikaci (Člověče, nezlob se) v javě dělal v prvním semestru a na druhý jsem chtěl stávající trochu předělat - podmínky z PJV už splňovala a prý by to nebyl problém.
Jenže jsem udělal klasickou blbost - chtěl jsem přepsat kód z gruntu. Takže jsem z toho nakonec byl celý otrávený, vykašlal se na to, zahodil rozpracované a udělal jednoduchou aplikaci ala matice (proč jsem k hotovému neudělal akorát OMO část mi už tedy není jasné :)) ). Inu, moje hloupost a hlavně poučení - nikdy nedělat věc, která by mě akorát otrávila a makat na něčem užitečném (kéž by to ale vždy šlo).
danek<zavináč>antonindanek
cz
Shabbi., na předměty si též nestěžuji (i když z datových struktur mi už teď naskakuje husí kůže), ale to rozvržení jsem si teď trochu pokazil golfem ve čtvrtek, ke kterému jsem se tak trochu nechal ukecat (rozvrh jsem updatnul).


Takže zatím v těchhle předmětech asi budu volit Javu.
) právě odevzdal u jednoho benevolentnějšího cvičícího práci z algoritmizace, aniž by se jí znovu dotknul (jenom dodělal při odevzdávání na koleni Ant).

Co se týče práce v týmech u OOP, tak bych nebyl proti. U nás je dobrý, že je jen málo věcí, které by se nedaly nějak domluvit. Jinak řečeno, jeden spolužák dělal svojí semestrální práci v týmu s kamarádem. Jde o to, že v týmu budete líp vidět smysl OOP, protože to je vlastně jeho hlavní smysl - když programuje víc lidí. Když já si tu pachtím sám svojí hru, na které se mnou nikdo nepracuje a nikdo jí nebude rozvíjet, tak vlastně nemá smysl, abych ten kód psal zvlášť pěkně.
Jinak projekty budu určitě zveřejňovat i nadále. A když se nebudu zvláště stydět za zdrojový kód, tak i sním.
Jirin: To jsi mi udělal radost.
Já si teď právě zapsal C/C++, ale až na mini-základy ze střední školy s ANSI C, to pro mě bude novinka a už vidím, jak budu plavat v těch ukazatelích na ukazatele apod.
Na EE Javu jsem se díval a říkal o ní něco Ing. Daněček, ještě uvidim.
Josef: Neměli jsme spolu TED? Mam takovej pocit, že si tuhle hru někdo volil jako téma pro tvorbu dokumentace. (Měl jsem prezentaci na Google Services - mělo to docela úspěch, tak by sis to podle toho mohl přiřadit.)
Jinak jsi to asi takhle udělat mohl no. Jeden známej (resp. znamej znýmýho
A to závěrečné - nikdy nedělat věc, která by mě akorát otrávila - není co dodat. Ostatně to píšu tady v článku i o mojí práci. Taky mě tohle tolik nenadchlo, ale zase jsem se při tvorbě hodně naučil (co jsem uměl minulej semestr a co teď se opravdu nedá srovnávat) a s výsledkem jsem celkem spokojený, takže nakonec ok. Navíc přišla třešnička na dortu v podobě zápočtu, takže není co řešit.
Java EE se hodi, uz jen proto, ze jsi pak vetsinou hodne dobre placeny, ale jako skola ti da jako vzdy, spise jen zaklad:-)
s tim C/C++ to is uzjes, nejtezsi predmet tretiho semestru, ale ty jej nemas povinne jesltize jsi na WMM takze v nejhorsim to jen nedas. Kazdy tyden tri ukoly a 1 za 14 dni dva ukoly na cviku, opravuje automat, takze dost veci neprojde. A hlavne neopisujte, pak dopadnete jako kamos, co mel -20bodu ze semestru:D
uzivatelcech<zavináč>seznam
cz
Imho neměli; co tak zpětně koukám na ten odkazovaný článek, měl jsem jiného cvičícího. .)
br4dek<zavináč>seznam
cz
Ahoj, prosímtě neměl bys ještě to clovece nezlob se? mám to ted jako semestrálku a sekl jsem se a nevím jak dál. Moc by mi pomohlo, kdybys mi ji poslal na mail, děkuji ti =)