Verze 0.13.5299: 226 NS, 5 496 odstavců, 54 943 slov, 406 692 znaků, 2 052 608 bajtů. Adventura. Rudolf Pecinovský 2015



Podobné dokumenty
OOP. Verze : 365 NS, odstavců, slov, znaků, bajtů. a Java 8

OOP. Verze : 365 NS, odstavců, slov, znaků, bajtů. a Java 8

Metodika. Architecture First. Rudolf Pecinovský

Vaše jistota na trhu IT. Balíčky. Rudolf Pecinovský

1. Programování proti rozhraní

Kolekce ArrayList. Deklarace proměnných. Import. Vytvoření prázdné kolekce. napsal Pajclín

Výčtový typ strana 67

PROMĚNNÉ, KONSTANTY A DATOVÉ TYPY TEORIE DATUM VYTVOŘENÍ: KLÍČOVÁ AKTIVITA: 02 PROGRAMOVÁNÍ 2. ROČNÍK (PRG2) HODINOVÁ DOTACE: 1

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

Generátor kódu. a jeho uplatnění ve výuce programování. Rudolf PECINOVSKÝ rudolf@pecinovsky.cz

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

TÉMATICKÝ OKRUH Softwarové inženýrství

ČÁST 1. Zahřívací kolo. Co je a k čemu je návrhový vzor 33

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

Algoritmizace a programování

Vyřešené teoretické otázky do OOP ( )

MS Excel makra a VBA

Quo vadis programování? Automatizace vyhodnocování studentských úloh

15. Projekt Kalkulačka

Funkční objekty v C++.

Bridge. Známý jako. Účel. Použitelnost. Handle/Body

Využití OOP v praxi -- Knihovna PHP -- Interval.cz

MS Word 2007 Šablony programu MS Word

Obsah. Zpracoval:

Polymorfismus. Časová náročnost lekce: 3 hodiny Datum ukončení a splnění lekce: 30.března

20. Projekt Domácí mediotéka

INSTALACE PRODUKTU ONTOPIA KNOWLEDGE SUITE

Vývoj a ověřování metodiky výuky programování

návrhový vzor Singleton.

[BAL-MLP] Multiplayer

Programování v Javě I. Únor 2009

1. Dědičnost a polymorfismus

Obsah přednášky 9. Skrývání informací. Skrývání informací. Zapouzdření. Skrývání informací. Základy programování (IZAPR, IZKPR) Přednáška 9

Obsah přednášky. 12. Dokumentace zdrojového kódu Tvorba elektronické dokumentace UML. Co je diagram tříd. Ing. Ondřej Guth

Ukázka knihy z internetového knihkupectví

7 Formátovaný výstup, třídy, objekty, pole, chyby v programech

19. Projekt Adventura

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

Programování v Javě I. Leden 2008

Statické proměnné a metody. Tomáš Pitner, upravil Marek Šabo

Projekty pro výuku programování v jazyce Java

8 Třídy, objekty, metody, předávání argumentů metod

PREPROCESOR POKRAČOVÁNÍ

Základy HTML. Autor: Palito

Čtvrtek 3. listopadu. Makra v Excelu. Obecná definice makra: Spouštění makra: Druhy maker, způsoby tvorby a jejich ukládání

Objektově orientované programování v jazyce Python

Multimediální prezentace MS PowerPoint I

Práce se styly 1. Styl

Objektové programování

Programování v jazyce VISUAL BASIC.NET

6 Příkazy řízení toku

typová konverze typová inference

DUM 06 téma: Tvorba makra pomocí VBA

Výhody a nevýhody jednotlivých reprezentací jsou shrnuty na konci kapitoly.

ABC Linux běží z CD české prostředí tištěná příručka obsah portálu Mutt Jak začít? Jan Fuchs

Tematický celek Proměnné. Proměnné slouží k dočasnému uchovávání hodnot během provádění aplikace Deklarace proměnných

Objektově orientované programování v jazyce Python

Evidence požadavků uživatelů bytů a nebytových prostor

DSL manuál. Ing. Jan Hranáč. 27. října V této kapitole je stručný průvodce k tvorbě v systému DrdSim a (v

Zadání maturitní práce ve školním roce 2016/2017

Office podrobný průvodce. Tomáš Šimek

11 Diagram tříd, asociace, dědičnost, abstraktní třídy

Čtvrtek 8. prosince. Pascal - opakování základů. Struktura programu:

Vzorce. Suma. Tvorba vzorce napsáním. Tvorba vzorců průvodcem

Prozkoumání příkazů na pásu karet Každá karta na pásu karet obsahuje skupiny a každá skupina obsahuje sadu souvisejících příkazů.

PŘÍRUČKA PRÁCE SE SYSTÉMEM SLMS CLASS pro učitele

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

Tento projekt je spolufinancován Evropským sociálním fondem a státním rozpočtem České republiky. PORTÁL KUDY KAM. Manuál pro editaci ŽS. Verze 1.

Programování v C++ 3, 3. cvičení

Úvod do programování - Java. Cvičení č.4

Cvičení č. 3. Sdílené prostředky a synchronizace Program Banka. 4 body

Programovací jazyk Java

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

První kapitola úvod do problematiky

KOMU JE KNIHA URČENA?

Základy objektové orientace I. Únor 2010

Ukázka knihy z internetového knihkupectví

Úvod do programovacích jazyků (Java)

17. Projekt Trojúhelníky

MQL4 COURSE. By Coders guru -8- Proměnné

10 Balíčky, grafické znázornění tříd, základy zapozdření

Pomůcka/manuál pro redakční systém verze 1.0

PB161 Programování v jazyce C++ Přednáška 7

PB161 Programování v jazyce C++ Přednáška 7

3. Je defenzivní programování technikou skrývání implementace? Vyberte jednu z nabízených možností: Pravda Nepravda

MS OFFICE OUTLOOK SEZNÁMENÍ

dokumentu, respektive oddílu (více o oddílech v další kapitole). Nemůžeme

Access Tabulka letní semestr 2013

2 PŘÍKLAD IMPORTU ZATÍŽENÍ Z XML

BM Software, Databáze Docházky 3000 na NAS serveru (pro MySQL) Němčičky 84, Němčičky u Břeclavi. Úvodní informace:

Koncepce (větších) programů. Základy programování 2 Tomáš Kühr

( ) ( ) Rozklad mnohočlenů na součin I (vytýkání) Předpoklady:

Hledání správné cesty

Tento studijní blok má za cíl pokračovat v základních prvcích jazyka Java. Konkrétně bude věnována pozornost rozhraním a výjimkám.

Předměty. Algoritmizace a programování Seminář z programování. Verze pro akademický rok 2012/2013. Verze pro akademický rok 2012/2013

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Návod k práci s programem MMPI-2

45 Plánovací kalendář

Základy programovaní 3 - Java. Unit testy. Petr Krajča. Katedra informatiky Univerzita Palackého v Olomouci. 26.,27.

Transkript:

Verze 0.13.5299: 226 NS, 5 496 odstavců, 54 943 slov, 406 692 znaků, 2 052 608 bajtů Návrh semestrálního projektu a jeho rámce Adventura Rudolf Pecinovský 2015 49R_Adventura.doc verze 0.13.5299, uloženo: ne 12.4.15 21:45 Strana 1 z 240

Rudolf Pecinovský Návrh semestrálního projektu a jeho rámce Adventura Copyright Grada Publishing a.s., 2015 V knize použité názvy mohou být ochrannými známkami nebo registrovanými ochrannými známkami příslušných vlastníků. Vydala Grada Publishing a.s. U Průhonu 22, Praha 7 jako svoji 3472. publikaci Návrh vnitřního layoutu Rudolf Pecinovský Zlom Rudolf Pecinovský Počet stran První vydání, Praha 2015 ISBN 978-80-247-2653-3 49R_Adventura.doc verze 0.13.5299, uloženo: ne 12.4.15 21:45 Strana 2 z 240

Všem, kteří se chtějí něco naučiti 49R_Adventura.doc verze 0.13.5299, uloženo: ne 12.4.15 21:45 Strana 3 z 240

Stručný obsah Stručný obsah Stručný obsah... 4 Podrobný obsah... 5 Seznam programů... 11 Seznam obrázků... 13 Úvod... 14 Část I: Pro studenty 17 1. Zadání projektu... 18 2. Začínáme testy... 21 3. Návrh správce scénářů konkrétní hry... 42 4. Návrh rámce pro hru... 65 5. Začínáme tvořit vlastní hru... 77 6. Vytváříme svět hry... 96 7. Vytvoření prvních povinných příkazů... 119 8. Definice společného rodiče kontejnerů objektů... 136 9. Definice nestandardních příkazů... 150 10. Realizace rozhovoru... 169 11. Definice uživatelského rozhraní... 184 12. Vylepšování architektury refaktorace... 203 13. Doporučení pro obhajobu... 205 Část II: Pro učitele a zkušenější studenty 207 49R_Adventura.doc verze 0.13.5299, uloženo: ne 12.4.15 21:45 Strana 4 z 240

Podrobný obsah 5 Podrobný obsah Podrobný obsah Stručný obsah... 4 Podrobný obsah... 5 Seznam programů... 11 Seznam obrázků... 13 Úvod... 14 Komu je kniha určena... 14 Potřebné vybavení... 14 Použité konvence... 14 Odbočka... 16 Část I: Pro studenty 17 1. Zadání projektu... 18 1.1 Koncepce hry... 18 1.2 Příklady her... 19 1.3 Shrnutí co jsme se naučili... 20 2. Začínáme testy... 21 2.1 Koncepce frameworku... 21 2.2 Jak testovat... 22 Programování řízené testy... 25 Jednotkové a integrační testy... 25 Možnosti testování naší hry... 26 2.3 Typ scénáře třída TypeOfScenario... 26 2.4 Kroky scénáře třída ScenarioStep... 28 2.5 Typ kroků scénáře třída TypeOfStep... 29 2.6 Třída ScenarioStep podrobněji... 33 2.7 Správce scénářů... 34 Spravované scénáře... 34 Jméno a ID autora... 22 Jak získat hru k testování... 36 Interfejs IGame... 37 Vytvoření správce... 38 Předání scénářů společnému rodiči... 38 Třída Scenario... 39 2.8 Diagram tříd balíčku scenario... 40 2.9 Interfejs IGSMFactory... 40 3. Návrh správce scénářů konkrétní hry... 42 3.1 Zadání, které budeme řešit... 42 3.2 Prázdný správce scénářů... 43 Import k odstranění... 44 49R_Adventura.doc verze 0.13.5299, uloženo: ne 12.4.15 21:45 Strana 5 z 240

6 Návrh semestrálního projektu a jeho rámce Adventura 3.3 Jednoduchý správce využívající literály... 44 Počáteční krok... 46 Pokračovací kroky... 47 Přechod mezi scénáři Základní chybový scénář... 48 Konstruktor... 50 Hlavní metoda... 52 3.4 Trochu chytřejší správce... 55 3.5 Definice třídy Texts... 55 3.6 Definice správce scénářů využívající konstanty... 60 3.7 Úkol... 61 Náměty... 63 3.8 Co jsme prozatím naprogramovali... 64 4. Návrh rámce pro hru... 65 4.1 Koncepce rámce hry... 65 4.2 Objekty vystupující ve hře... 66 Zadání... 66 Definice použitých interfejsů... 66 Hra IGame... 67 Svět IWorld... 67 Prostor ISpace... 67 Příkaz ICommand... 67 Přechod... 67 Objekt IObject... 68 Hráč... 68 Batoh IBag... 68 Úkol, cíl... 68 Množství, kapacita... 69 4.3 Upřesnění návrhu rámce... 69 ICommand... 69 IBag... 70 IObject... 71 ISpace... 71 IWorld... 71 IGame... 72 4.4 Doplnění společných rodičů... 74 Pojmenované objekty... 74 Kontejnery objektů... 74 4.5 Doplnění uživatelského rozhraní... 74 4.6 Diagram tříd balíčku game_txt... 75 4.7 Diagram tříd v balíčku empty_classes... 76 5. Začínáme tvořit vlastní hru... 77 5.1 Výběr metody návrhu... 77 5.2 Začínáme s třídou hry... 78 5.3 Pokračujeme v testech... 80 5.4 Kdo má mít na starosti zpracování příkazů... 81 Tři skupiny programů... 81 Jak jsou na tom příkazy?... 81 5.5 Definice správce příkazů... 82 Úprava definice konstruktoru... 83 Vytvoření jednotlivých příkazů... 84 Úprava metody execute(string) ve třídě hry... 85 5.6 Definice metody pro provádění příkazů... 85 Dva režimy zpracování příkazů... 86 Metoda isalive() ve třídě hry... 86 49R_Adventura.doc verze 0.13.5299, uloženo: ne 12.4.15 21:45 Strana 6 z 240

Podrobný obsah 7 Metoda isalive() ve správci příkazů... 86 Definice metody execute(string)... 87 5.7 Metoda pro spuštění hry startgame(string)... 88 5.8 Metoda pro pracování běžného příkazu executecommoncomand(string)... 88 Rozdělení příkazového řádku na slova... 88 Převedení počátečního slova na příkaz... 89 5.9 Prozatímní podoba definice třídy ACommand... 89 5.10 Co jsme prozatím naprogramovali... 94 6. Vytváříme svět hry... 96 6.1 Analýza chybového hlášení... 96 Svět hry jako správce prostor hry... 96 6.2 Vytvoření třídy světa hry Apartment... 97 Definice metody getallareas()... 97 6.3 Třída prostorů hry Room... 98 Konstruktor místnosti... 98 Metoda getname()... 100 Metoda getneighbors()... 100 Metoda getobjects()... 101 6.4 Třída objektů v prostorech Thing... 101 Váha, přenositelnost... 102 Zveřejnění příznaků... 103 Vlastní definice... 103 6.5 Dokončení definice třídy Room... 106 6.6 Dokončení definice třídy Apartment... 107 Metoda getallareas()... 107 Doplnění konstruktoru... 107 Metoda getcurrentarea()... 108 6.7 Test... 109 6.8 Úprava informací o stavu hry... 109 6.9 Úvahy o inicializaci prostorů... 110 6.10 Realizace inicializace prostorů... 111 Inicializace ve třídě ACommand... 111 Inicializace ve třídě Apartment... 112 Inicializace instancí třídy Room... 112 6.11 Test... 114 6.12 Doplnění batohu... 115 Metoda getcapacity()... 116 Metody getobjects() a initialize()... 116 Metoda getbag() ve třídě hry... 116 6.13 Test... 117 6.14 Co jsme prozatím naprogramovali... 117 7. Vytvoření prvních povinných příkazů... 119 7.1 Jak sjednotit postup pro většinu her... 119 7.2 Definice nového scénáře... 120 7.3 Úprava definice konstruktoru... 122 7.4 Úprava definice metody main(string[])... 122 7.5 Definice příkazu pro nápovědu... 123 Zkopírování kostry třídy... 123 Rodičovská třída... 123 Metoda execute(string...)... 124 Test... 125 Doplnění těla metody getallcommands() ve třídě hry... 126 Doplnění těla metody getallcommands() ve třídě správce příkazů... 126 49R_Adventura.doc verze 0.13.5299, uloženo: ne 12.4.15 21:45 Strana 7 z 240

8 Návrh semestrálního projektu a jeho rámce Adventura Test... 127 7.6 Definice příkazu pro přesun z aktuálního prostoru do zadaného sousedního prostoru... 128 Metoda execute(string...)... 128 Existence parametru... 128 Korektnost parametru... 129 Přesun do cílového prostoru... 129 Test... 130 7.7 Definice příkazu pro zvednutí objektu v aktuálním prostoru a jeho přemístění do batohu... 130 Existence parametru... 131 Korektnost parametru... 131 Principy další práce příkazu... 131 Úpravy definice třídy prostorů... 131 Úpravy definice třídy batohu... 132 Definice metody execute(string...) definovaného příkazu... 133 Test... 134 7.8 Co jsme prozatím naprogramovali... 134 8. Definice společného rodiče kontejnerů objektů... 136 8.1 Definice příkazu pro položení objektu... 136 8.2 Co bychom mohli do společného předka vytknout... 137 8.3 Definice společného předka kontejnerů objektů... 138 Metoda getobjects()... 138 Metody getobject(string) a removeobject(thing)... 138 Zpětné nastavení atributu objects na private... 139 Metoda tryaddobject(thing)... 139 8.4 Inicializace objektů... 139 Názvy metod... 139 Nastavení kapacity... 140 Inicializace kolekce objects... 140 8.5 Příkaz pro pokládání objektů CommandPutDown... 144 Test... 145 8.6 Příkaz k předčasnému ukončení hry CommandExit... 145 Test... 146 8.7 Prověření programu chybovým scénářem... 146 Doplnění reakce na prázdný příkaz... 147 Test... 148 8.8 Co jsme prozatím naprogramovali... 148 9. Definice nestandardních příkazů... 150 9.1 Změna testu... 150 9.2 Definice příkazu pro otevření ledničky... 151 9.3 Definice třídy Flags... 152 9.4 Vytvoření třídy CommandOpen... 155 9.5 Definice metody execute(string...)... 155 Test existence parametru... 155 Test přítomnost otevíraného objektu... 156 Test otevíratelnosti zadaného objektu... 156 Dokončení definice... 156 Doplnění testu podloženost... 157 Test... 158 9.6 Oprava definice příkazu pro položení objektu... 158 9.7 Definice příkazu pro přečtení papíru... 159 Test existence parametru... 159 Test přítomnosti daného objektu v batohu... 160 49R_Adventura.doc verze 0.13.5299, uloženo: ne 12.4.15 21:45 Strana 8 z 240

Podrobný obsah 9 Test, zda je požadováno přečtení objektu, který lze opravdu přečíst... 160 Test nasazených brýlí... 160 Výsledná podoba metody... 161 Test... 162 9.8 Definice příkazu pro nasazení brýlí... 162 Test... 163 9.9 Definice příkazu pro podložení ledničky... 163 Test plnosti batohu... 164 Definice metody execute(string...)... 165 Test... 166 9.10 Co jsme prozatím naprogramovali... 166 9.11 Co jsme prozatím přeskočili... 168 10. Realizace rozhovoru... 169 10.1 Specifika rozhovoru... 169 10.2 Přepnutí do konverzačního režimu... 170 Zavedení příznaku prověřenosti... 170 Úprava metody execute(string...) ve třídě CommandPickUp... 170 10.3 Třída Conversation... 172 Metoda start(thing)... 172 10.4 Úprava metody executecommand(string) ve třídě ACommand... 173 10.5 Definice metody answer(string) ve třídě Conversation... 174 Stavy rozhovoru... 174 Reakce v závislosti na stavu... 176 Vlastní definice metody answer(string)... 177 Test... 177 10.6 Definice metody waitingfortheage(string)... 177 Test... 179 10.7 Definice metody waitingfortheyear(string)... 180 Test... 180 10.8 Příkaz pro zavření ledničky CommandCLose... 181 Test... 182 10.9 Co jsme prozatím naprogramovali... 182 11. Definice uživatelského rozhraní... 184 11.1 Co je třeba navrhnout... 184 11.2 Úprava rozdělení do balíčků... 185 11.3 Uživatelské rozhraní využívající služeb třídy javax.swing.joptionpane... 185 Definice metody startgame()... 186 Metody třídy JOptionPane... 186 Definice metody startgame(igame)... 187 11.4 Uživatelské rozhraní komunikující přes standardní vstup a výstup... 189 Nevýhody používání standardního vstupu a výstupu... 189 Třída java.util.scanner... 189 Vytvoření třídy pro konzolový vstup... 190 11.5 Zobecnění uvedených řešení... 191 Interfejs IGamePlayer... 191 Hlavní metoda umožňující volbu použitého rozhraní... 192 Výsledná definice třídy UIC_GamePlayer... 192 11.6 Další zobecnění uživatelského rozhraní... 197 11.7 Co jsme prozatím naprogramovali... 200 12. Vylepšování architektury refaktorace... 203 12.1 203 12.2 Co jsme prozatím naprogramovali... 203 13. Doporučení pro obhajobu... 205 49R_Adventura.doc verze 0.13.5299, uloženo: ne 12.4.15 21:45 Strana 9 z 240

10 Návrh semestrálního projektu a jeho rámce Adventura 13.1 205 13.2 Shrnutí co jsme se naučili... 205 Část II: Pro učitele a zkušenější studenty 207 49R_Adventura.doc verze 0.13.5299, uloženo: ne 12.4.15 21:45 Strana 10 z 240

Seznam programů 11 Seznam programů Seznam programů Výpis 2.1: Definice třídy TypeOfScenario... 27 Výpis 2.2: Výčtový typ TypeOfStep... 30 Výpis 2.3: Výchozí podoba třídy ScenarioStep... 33 Výpis 3.1: Výpis první části zdrojového kódu třídy ManagerWithLiterals až po definici prvních dvou kroků úspěšného (šťastného) scénáře... 44 Výpis 3.2: Výpis druhé části zdrojového kódu třídy ManagerWithLiterals od posledního kroku úspěšného (šťastného) scénáře až po definici prvních čtyř kroků... 47 Výpis 3.3: Výpis třetí části zdrojového kódu třídy ManagerWithLiterals obsahující deklaraci atributu s odkazem na jedináčka, tovární metody, konstruktoru a metody main(string[])... 50 Výpis 3.4: Výpis autotestu správce scénářů... 52 Výpis 3.5: Definice třídy Texts definující jednotlivé textové konstanty... 56 Výpis 3.6: Definice prvních tří kroků úspěšného scénáře ve třídě Výpis 5.1: ManagerWithConstants... 60 Definice metod getauthorname(), getauthorid() a getscenariomanager() ve třídě hry... 79 Výpis 5.2: Definice metod isalive() ve třídě hry... 80 Výpis 5.3: Upravená definice konstruktoru instancí třídy ACommand... 84 Výpis 5.4: Definice metody execute(string) ve třídě OfficialApartmentGame... 85 Výpis 5.5: Upravená definice metody isalive() ve třídě OfficialApartmentGame... 86 Výpis 5.6: Prozatímní podoba definice třídy ACommand... 90 Výpis 6.1: Definice konstruktoru instancí třídy Room a jím inicializovaných atributů... 99 Výpis 6.2: Definice třídy Thing, jejíž instance představují objekty... 103 Výpis 6.3: Upravená definice konstruktoru instancí třídy Apartment... 108 Výpis 6.4: Upravená definice metody getcurrentarea() ve třídě Apartment... 109 Výpis 6.5: Upravená definice metody getworld()... 109 Výpis 6.6: Upravená definice metody startgame(string) spolu s metodou initialize() ve třídě ACommand... 111 Výpis 6.7: Definice metody initialize()ve třídě Apartment... 112 Výpis 6.8: Definice metod initialize(), initializeneighbors() a initializeobjects() ve třídě Room... 112 Výpis 6.9: Definice metody getroom(string) ve třídě Apartment... 113 Výpis 7.1: Definice pole REQUIRED_STEPS ve třídě OfficialApartmentManager... 120 Výpis 7.2: Upravená definice konstruktoru třídy OfficialApartmentManager... 122 Výpis 7.3: Upravená definice metody main(string[]) ve třídě OfficialApartmentManager... 122 Výpis 7.4: Definice konstruktoru instancí třídy CommandHelp... 124 Výpis 7.5: Definice metody execute(string...) ve třídě CommandHelp... 125 Výpis 7.6: Definice metody getallcommands() ve třídě OfficialApartmentGame... 126 49R_Adventura.doc verze 0.13.5299, uloženo: ne 12.4.15 21:45 Strana 11 z 240

12 Návrh semestrálního projektu a jeho rámce Adventura Výpis 7.7: Definice metody getallcommands() ve třídě ACommand... 127 Výpis 7.8: Upravená definice konstruktoru ve třídě CommandMove... 128 Výpis 7.9: Definice metody execute(string...) ve třídě CommandMove... 129 Výpis 7.10: Definice metod getobject(string) a removeobject(thing) ve třídě Room... 132 Výpis 7.11: Definice metody tryaddobject(thing) ve třídě Hands... 132 Výpis 7.12: Definice metody execute(string...) ve třídě CommandPickUp... 133 Výpis 8.1: Definice třídy ThingContainer... 141 Výpis 8.2: Definice metody execute(string...) ve třídě CommandPutDown... 144 Výpis 8.3: Definice metody execute(string...) ve třídě CommandExit... 145 Výpis 8.4: Definice metody executecommand(string) ve třídě ACommand... 147 Výpis 9.1: Upravená definice statické metody initialize() třídy ACommand... 153 Výpis 9.2: Předběžné podoba definice třídy Flags... 153 Výpis 9.3: Definice metody execute(string...) ve třídě CommandOpen... 157 Výpis 9.4: Definice metody execute(string...) ve třídě CommandRead... 161 Výpis 9.5: Definice metody execute(string...) ve třídě CommandPutOnGlasses... 162 Výpis 9.6: Definice metody isfull() instancí třídy ThingContainer... 164 Výpis 9.7: Definice metody execute(string...) instancí třídy CommandSupportIcebox... 165 Výpis 10.1: Upravená definice metody execute(string...) ve třídě CommandPickUp... 171 Výpis 10.2: Definice metody start(thing) ve třídě Conversation... 173 Výpis 10.3: Upravená definice metody executecommand ve třídě ACommand... 174 Výpis 10.4: Definice metody answer(string) ve třídě Conversation... 177 Výpis 10.5: Definice metody waitingfortheage(string) ve třídě Conversation... 178 Výpis 10.6: Definice metody waitingfortheyear(string) ve třídě Conversation... 180 Výpis 10.7: Definice metody execute(string...) instancí třídy CommandCLose... 181 Výpis 11.1: Definice metody startgame() ve třídě UIA_JOptionPane... 186 Výpis 11.2: Definice metody startgame(igame) ve třídě UIA_JOptionPane... 188 Výpis 11.3: Definice metody startgame(igame) ve třídě UIB_Scanner... 190 Výpis 11.4: Definice metody startgame(igame) ve třídě UIB_Scanner... 190 Výpis 11.5: Definice interfejsu IGamePlayer... 191 Výpis 11.6: Definice třídy UIC_GamePlayer... 193 Výpis 11.7: Definice třídy UID_Multiplayer... 197 Výpis 12.1: Definice Class... 203 Výpis 13.1: Definice Class... 205 49R_Adventura.doc verze 0.13.5299, uloženo: ne 12.4.15 21:45 Strana 12 z 240

Seznam obrázků 13 Seznam obrázků Seznam obrázků Obrázek 2.1 Jednoduchý diagram tříd balíčku scenario... 40 Obrázek 4.1 Jednoduchý diagram tříd balíčku game_txt... 75 Obrázek 4.2 Jednoduchý diagram tříd balíčku empty_classes... 76 Obrázek 5.1 Aktuální diagram tříd projektu poté, co byla definována kostra třídy a správce příkazů... 95 Obrázek 6.1 Aktuální diagram tříd projektu poté, co byly definovány třídy reprezentující svět hry a jeho části... 118 Obrázek 7.1 Aktuální diagram tříd projektu poté, co byly definovány třídy reprezentující první tři povinné příkazy hry... 135 Obrázek 8.1 Aktuální diagram tříd projektu poté, co byly definovány třídy reprezentující všechny povinné příkazy hry... 149 Obrázek 9.1 Aktuální diagram tříd projektu poté, co byly definovány třídy reprezentující nestandardní příkazy hry bez podpory rozhovoru... 167 Obrázek 10.1 Stavový diagram rozhovoru přechody mezi stavy v závislosti na odpovědi hráče... 175 Obrázek 10.2 Aktuální diagram tříd projektu poté, co byly definována třídy realizující podporu rozhovoru... 183 Obrázek 11.1 Dialogové okno s úvodní zprávou hry čekající na zadání příkazu... 187 Obrázek 11.2 Aktuální diagram tříd balíčku s doposud definovanými třídami řešícími textové uživatelské rozhraní... 201 Obrázek 12.1 Vlastní popis obrázku (pozor na počáteční tabulátor zachovat!)... 203 Obrázek 12.2 Aktuální diagram tříd projektu poté, co byly definovány třídy reprezentující nestandardní příkazy hry bez podpory rozhovoru... 204 Obrázek 13.1 Popis obrázku (pozor na počáteční tabulátor zachovat!)... 205 49R_Adventura.doc verze 0.13.5299, uloženo: ne 12.4.15 21:45 Strana 13 z 240

14 Návrh semestrálního projektu a jeho rámce Adventura Úvod Úvod Komu je kniha určena Tato kniha má sloužit jako doplněk mých učebnic zabývajících se architekturou objektově orientovaných programů. Je určena studentům úvodních kurzů programování, kteří připravují svůj semestrální projekt a nedokáží si správně zapamatovat vše, co jsme si na přednáškách či cvičeních řekli. Má proto sloužit jako podklad k zopakování si látky z hodiny. Kniha přepokládá, že čtenář zná základy objektově orientovaného programování na úrovni základního kurzu mohli bychom říci na úrovní probrané v učebnicích Java 7 Učebnice objektové architektury pro začátečníky Java 8 Úvod do objektové architektury pro mírně pokročilé Navazuje na ně a ukazuje čtenářům, jak postupovat při návrhu poněkud většího a komplexnějšího projektu, než jsou projekty probírané na hodinách. Současně jim má pomoci osvojit si práci s externími knihovnami a frameworky. Potřebné vybavení Pro úspěšné studium této knihy budete potřebovat dvě věci: dostatečně výkonný počítač, základní vývojovou sadu Javy. Pro úspěšný vývoj programů potřebujete ještě vhodný vývojový nástroj. Je zcela na vás, jaký nástroj zvolíte. Na hodinách používáme NetBeans a na ně se budu občas odkazovat i ve výkladu. Jejich použití ale není nezbytně nutné. Někteří studenti dávají přednost ověřenému a jednoduchému prostředí BlueJ, jiné použijí některý z dalších profesionálních prostředí Eclipse nebo INTELLIJ Idea. Použité konvence K tomu, abyste se v textu lépe vyznali a také abyste si vykládanou látku lépe zapamatovali, používám několik prostředků pro odlišení a zvýraznění textu. 49R_Adventura.doc verze 0.13.5299, uloženo: ne 12.4.15 21:45 Strana 14 z 240

Úvod 15 Objekty Názvy Citace Adresy Program První výskyt nějakého termínu a další texty, které chci zvýraznit, vysazuji tučně. Názvy firem a jejích produktů vysazuji kurzivou. Kurzivou vysazuji také názvy kapitol, podkapitol a oddílů, na které se v textu odkazuji. Texty, které si můžete přečíst na displeji, např. názvy polí v dialogových oknech či názvy příkazů v nabídkách, vysazuji tučným bezpatkovým písmem. Názvy souborů a internetové adresy vysazuji obyčejným bezpatkovým písmem. Texty programů a jejich částí vysazuji neproporcionálním písmem. Kromě částí textu, které považuji za důležité zvýraznit nebo alespoň odlišit od okolního textu, najdete v textu ještě řadu doplňujících poznámek a vysvětlivek. Všechny budou v jednotném rámečku, který bude označen ikonou charakterizující druh informace, kterou vám chce poznámka či vysvětlivka předat. Symbol jin-jang bude uvozovat poznámky, s nimiž se setkáte na počátku každé kapitoly. Zde vám vždy prozradím, co se v dané kapitole naučíte. Otevřená schránka s dopisy označuje informace o projektu, s nímž budeme v dalším textu pracovat nebo v něm najdete vzorové řešení. Obrázek knihy označuje poznámku týkající se používané terminologie. Tato poznámka většinou upozorňuje na další používané termíny označující stejnou skutečnost nebo na konvence, které se k probírané problematice vztahují. Seznam všech terminologických poznámek najdete v rejstříku pod heslem terminologie. Obrázek počítače označuje zadání úkolu, který máte samostatně vypracovat. Seznam všech úloh najdete v rejstříku pod heslem úloha. Píšící ruka označuje obyčejnou poznámku, která pouze doplňuje informace z hlavního proudu výkladu o nějakou zajímavost. 49R_Adventura.doc verze 0.13.5299, uloženo: ne 12.4.15 21:45 Strana 15 z 240

16 Návrh semestrálního projektu a jeho rámce Adventura Ruka s hrozícím prstem upozorňuje na věci, které byste měli určitě vědět a na které byste si měli dát pozor, protože jejich zanedbání vás většinou dostane do problémů. Usměváček vás bude upozorňovat na různé tipy, kterými můžete vylepšit svůj program nebo zefektivnit svoji práci. Mračoun vás naopak bude upozorňovat na různá úskalí programovacího jazyka nebo programů, s nimiž budeme pracovat, a bude vám radit, jak se těmto nástrahám vyhnout či jak to zařídit, aby vám alespoň pokud možno nevadily. Brýle označují tzv. poznámky pro šťouraly, ve kterých se vás snažím seznámit s některými zajímavými vlastnostmi probírané konstrukce nebo upozorňuji na některé souvislosti, avšak které nejsou k pochopení látky nezbytné. Symbol znamení raka označuje poznámku, ve které poukazuji na interpretaci nějakého obratu či konstrukce v nějaké analogii, nejčastěji v analogii ze světa robotů, kterou zavádím v podkapitole Chyba! Nenalezen zdroj odkazů. na straně Chyba! Záložka není definována.. Seznam odkazů na tuto analogii najdete v rejstříku pod heslem analogie. Odbočka Občas je potřeba vysvětlit něco, co nezapadá přímo do okolního textu. V takových případech používám podšeděný blok se silnou čarou po straně. Tento podšeděný blok je takovou drobnou odbočkou od ostatního výkladu. Nadpis podšeděného bloku pak najdete i v podrobném obsahu mezi nečíslovanými nadpisy. 49R_Adventura.doc verze 0.13.5299, uloženo: ne 12.4.15 21:45 Strana 16 z 240

Část I: Pro studenty Část I: Pro studenty Tato část vám nejprve naznačí, jak je možno navrhnout koncepci rámce (frameworku) pro sadu aplikací realizujících konverzační hru, a pak předvede, jak je možno navrhnout hru, která bude odpovídat danému rámci. 49R_Adventura.doc verze 0.13.5299, uloženo: ne 12.4.15 21:45 Strana 17 z 240

18 Návrh semestrálního projektu a jeho rámce Adventura 1. Zadání projektu Kapitola 1 Zadání projektu Co se v kapitole naučíme Tato kapitola je nejkratší kapitolou celé knihy. Zde si vysvětlíme zadání projektů, pro které v následujících kapitolách navrhneme společný rámec a následně vytvoříme jeden ukázkový projekt 1.1 Koncepce hry Vytvářenou aplikací bude jednoduchá konverzační hra, při níž se hráč snaží v konečném počtu kroků dostat k předem zadanému cíli. Vždy programu zadá textový příkaz naznačující, co má v daném okamžiku udělal, a program mu odpoví. V odpovědi hráči vysvětlí, v jaké situaci se po provedení této akce nachází, a případně mu naznačí, jaké jsou jeho další možnosti. Bude to tedy takový rozhovor anebo, chcete-li, textový pink-ponk: hráč pošle text příkazu, program vrátí text odpovědi. A tak stále kolem dokola, dokud hráč nedosáhne požadovaného cíle hry nebo dokud jej to nepřestane bavit. Hra přitom bude definována jako jedináček, který po ukončení jednoho běhu bude schopen opětného spuštění nového běhu hry, aniž by bylo třeba ukončovat program. Hra bude probíhat ve virtuálním světě, v němž existuje několik prostorů, které spolu zadaným způsobem sousedí. Těmito prostory mohou být místnosti v budově, části krajiny, planety, etapy života apod. Hra musí nabízet příkaz zprostředkující přechod z aktuálního prostoru do sousedního prostoru. Za sousední prostor přitom považujeme takový, do nějž lze jednoduše přejít. Je-li třeba nejprve splnit nějakou podmínku, stane se onen potenciálně sousední prostor skutečně sousedním až po splnění dané podmínky. Tyto podmínky mohou být různé: 49R_Adventura.doc verze 0.13.5299, uloženo: ne 12.4.15 21:45 Strana 18 z 240

Kapitola 1: Zadání projektu 19 Jsou-li oněmi prostory místnosti v budově, může být potřeba nejprve odemknout spojovací dveře. Jsou-li oněmi prostory části krajiny, můžeme se na sousední louku za potokem dostat až poté, co postavíme most přes potok. Jsou-li oněmi prostory semestry vysoké školy, kterou máte za cíl absolvovat, musíte odemknout následující semestr třeba tak, že dojdete na studijní oddělení a ukážete index s absolvovanými předměty, aby vás mohli zapsat do dalšího semestru. V každém prostoru se mohou nacházet různé objekty. Některé z nich může hráč vzít, uložit je do pomyslného batohu, aby mu v budoucnu pomohly ke splnění nějakého pomocného úkolu nebo dokonce cíle celé hry. Hra musí proto nabízet příkaz, který přesune zadaný objekt z aktuálního prostoru (tj. prostoru, v němž se právě nachází hráč) do batohu a příkaz, který naopak přesune objekt z batohu do aktuálního prostoru. Množství objektů, které se do batohu vejdou, je však omezené. Příkaz pro přesun objektu z prostoru do batohu proto nesmí povolit překročení kapacity batohu. Navíc musí ve světě hry existovat objekty, které není možno zvednout a přemístit do batohu (okno, potok, studijní referentka, ). Příkaz pro zvednutí objektu proto nesmí umožnit uložit do batohu nezvednutelný objekt. Mezi objekty mohou (ale nemusejí) být i takové, s nimiž může hráč komunikovat a případně od nich získat informaci potřebnou ke zdárnému pokračování. Tyto objekty mohou být jak živé (trpaslík, kouzelný dědeček, ), tak neživé (robot, magnetofon, knížka, ). Mezi objekty v prostoru mohou (ale opět nemusejí) být i takové, které jsou za jistých okolností novým prostorem s jeho vlastními objekty. Takovýmto objektem-prostorem může být např. truhla, trezor, nalezený batoh apod. Tyto nestandardní prostory nemají žádné sousedy, a proto se do nich musíme přesunout nějakým nestandardním příkazem např. otevři truhla a zpět příkazem zavři trhula. Takovýmto prostorem může být např. i deska stolu. Do jejího prostoru se přesunete např. příkazem koukni_na_stůl. Pak uvidíte jenom objekty, které se na stole nacházejí, a některý z nich se vám může hodit. 1.2 Příklady her Na scénářích hry se pozná nápaditost studenta. Ti prostodušší volí hry na téma Probudil(a) jste se po těžkém flámu v neznámém bytě. Najděte svoje spodky a svršky a opusťte byt. Ti o trochu nápaditější vykrádají banky, utíkají z vězení. 49R_Adventura.doc verze 0.13.5299, uloženo: ne 12.4.15 21:45 Strana 19 z 240

20 Návrh semestrálního projektu a jeho rámce Adventura Další vytvářejí hry na motivy pohádek (např. O kohoutkovi a slepičce nebo Červená karkulka) nebo známých knížek a televizních seriálů (Star track, Harry Potter, Červený trpaslík, Pán času, ). Občas se objeví hry s kuriózním námětem. Jeden student naprogramoval hru Život, ve které se hráč na startu narodí a prostory jsou jednotlivé životní etapy (nemluvně, školka, školák, středoškolák, ). Cílem hry je úspěšně umřít a do té doby zanechat hojné a dobře zaopatřené potomstvo. Jedna studentka naprogramovala hru představující studium na vysoké škole. Prostory byly jednotlivé semestry a k tomu, aby se další semestr sousedem stal aktuálního, musel hráč-student splnit jisté úkoly nasbírat potřebné objekty, kterými zde byly absolvované zkoušky. Jeden student vozíčkář naprogramoval hru, jejímž cílem bylo dostat se ráno z domova do školy, přičemž se na cestě objevovaly různé náhodné překážky (nefungující výtah do Metra, autobus nepřizpůsobený přepravě vozíčkářů, atd.). Díky náhodně se vyskytujícím překážkám se mohlo stát, že občas hra nešla úspěšně dohrát a hráč ten den do školy nedorazil. Jak vidíte, námětů je nepřeberné množství a je jenom na vaší fantazii, abyste vymysleli takový, aby vás návrh příslušného programu také trochu bavil. 1.3 Shrnutí co jsme se naučili V kapitole jste se seznámili s koncepcí hry, o jejímž návrhu si budeme povídat ve zbytku knihy 49R_Adventura.doc verze 0.13.5299, uloženo: ne 12.4.15 21:45 Strana 20 z 240

Kapitola 2: Začínáme testy 21 2. Začínáme testy Kapitola 2 Začínáme testy Co se v kapitole naučíme V této kapitole si ukážeme, co bychom měli dělat před tím, než začneme programovat vlastní hru. Zejména se soustředíme na přípravu testů, které budou prověřovat správnost vytvořených programů. Přitom budeme mít na mysli, že každý ze studentů ve třídě bude vyvíjet vlastní verzi hry, takže bychom měli testy připravit tak, aby co nejjednodušeji otestovali kteroukoliv z vyvíjených her. V průběhu kapitoly se vám budu snažit ukázat, jak můžete takovéto řešení navrhnout. Řada čtenářů má komplex z toho, že oni by to tak vymyslet nedokázali. Nenechte se tím zviklat. Všechno chce jistou zkušenost. Až budete zkušenější, nebudou vám takovéto konstrukce dělat problémy a dost možná, že byste nakonec dokázali požadované řešení navrhnout lépe než já. Snažte se jenom sledovat tok mých úvah a porozumět tomu, proč jsem se rozhodl použít prezentované řešení. Kdybyste náhodou ztratili nit, nezoufejte. Zkuste začít od závěrečného shrnutí toho, co by měl znát tvůrce hry, a časem se můžete k této analýze vrátit. 2.1 Koncepce frameworku Abych studentům umožnil se soustředit na vlastní návrh hry a nemuseli se rozptylovat některými pomocnými činnostmi a abych jim (a s nimi i sobě) umožnil co nejsnadněji kontrolovat dodržení všech požadavků, vytvořil jsem speciální framework, který obsahuje řadu datových typů zjednodušujících návrh programu i jeho následné testování a vyhodnocení korektnosti jeho návrhu. 49R_Adventura.doc verze 0.13.5299, uloženo: ne 12.4.15 21:45 Strana 21 z 240