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 icon_smile.gif).

Algorithms - Battleships

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? icon_lol.gif

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 ...icon_lol.gif 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! icon_lol.gif 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ů).

DSC07869.JPG
Gama verze hry Algorithms. Jak je vidět, v této verzi docházelo k chybnému výpočtu 15x15=255. icon_mrgreen.gif Také je vidět, že jsem dostával slušnou nakládačku. BTW tuhle hru jsme ještě nedohráli, snad nikdo z nás neztratí referenci na svou instanci hry. icon_smile.gif

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).

alfa-test-alenka.jpg

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. icon_lol.gif

Stažení

Na rozdíl od minulé práce, tentokrát jsem se rozhodl zdrojové kódy zveřejnit:

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.

game-end.gif

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?

7 komentářů

Neváhejte napsat k článku komentář

Nevyplňujte:

  1. 1
    Shabbi.

    shabbi<zavináč>shabbitečkacz

    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,.. icon_cry.gif

    Jinak ale článek parádní! Zdrojáky jsem sice nestahoval/nezkoumal (dal bych přednost nějakému diagramu icon_cheesygrin.gif) 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 icon_eek.gif ...

    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 icon_rolleyes.gif

    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í) icon_smile.gif 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" icon_wink.gif

    ...a já se budu těšit na další zveřejněný projekt icon_cheesygrin.gif

    • Na komentář odpověděl(a) Antonín Daněk v komentáři #4
  2. 2
    Jirin

    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:-)

    • Na komentář odpověděl(a) Antonín Daněk v komentáři #4
  3. 3
    Josef

    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).

    • Na komentář odpověděl(a) Antonín Daněk v komentáři #4
  4. 4
    Antonín Daněk

    danek<zavináč>antonindanektečkacz

    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).

    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. icon_lol.gif

    Jirin: To jsi mi udělal radost. icon_smile.gif

    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. icon_eek.gif Takže zatím v těchhle předmětech asi budu volit Javu.

    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 icon_smile.gif) 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).

    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. icon_mrgreen.gif

    • Tento komentář je reakcí na příspěvek #1, který napsal(a) Shabbi.
    • Tento komentář je reakcí na příspěvek #2, který napsal(a) Jirin
    • Tento komentář je reakcí na příspěvek #3, který napsal(a) Josef
    • Na komentář odpověděl(a) Jirin v komentáři #5
    • Na komentář odpověděl(a) Josef v komentáři #6
  5. 5
    Jirin

    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

    • Tento komentář je reakcí na příspěvek #4, který napsal(a) Antonín Daněk
  6. 6
    Josef

    uzivatelcech<zavináč>seznamtečkacz



    Imho neměli; co tak zpětně koukám na ten odkazovaný článek, měl jsem jiného cvičícího. .)

    • Tento komentář je reakcí na příspěvek #4, který napsal(a) Antonín Daněk
  7. 7
    radek

    br4dek<zavináč>seznamtečkacz

    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 =)

    • Tento komentář je reakcí na příspěvek #3, který napsal(a) Josef