Delphi & Pascal (česká wiki)
Přejít na: navigace, hledání
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2">
<meta name="author" lang="cs" content="Aleš Kučík">
<title>HRA LODĚ</title>
<link rel="stylesheet" href="../index.css" type="text/css" />
</head>
 
<body>
<a href="www.trsek.com/cover/ales/lode"><h1>HRA LODĚ - download</h1></a>
 
 
<p>Autor: Aleš Kučík </p>
 
<pl>Skupina: 104</p>
 
<p>E-mail: <a href="mailto:ales.prog@centrum.cz">ales.prog@centrum.cz</a>
</p>
 
 
<h2>Zadání semestrální práce</h2>
 
<p>Vytvořit program pro hru LODĚ. Program by měl umožnit hru
dvou protihráčů nebo i hru proti počítači. Každý hráč má dvě hrací plochy
stejné velikosti. V levé ploše jsou rozmístěny hráčovy lodě, které si zde
sám na začátku rozmístí, a v průběhu hry se zde ještě zobrazují zásahy a
minutí. V pravé ploše se v průběhu hry zobrazují hráčovy zásahy a minutí.
Vítězem se stává ten, kdo první zničí všechny protihráčovy lodě.</p>
 
 
<h2>Analýza</h2>
 
<p>Je nutné vytvořit nějaké herní prostředí. Dále je třeba
dostatečně ošetřit vstupní a výstupní operace. Rozhodl jsem se pro výstup
v textovém módu a vládání pomocí myši a klávesnice.</p>
 
<p>Aby mohl hrát člověk proti počítači, je nutné vytvořit
nějakého protihráče. Rozhodl jsem se hned pro tři druhy protihráčů - ŠTÍSTKO,
LOGIK a PODVODNÍK. Jejich názvy naznačují jejich implementaci. </p>
 
<p>Zajímavé by také bylo, kdyby jednotliví hráči mohli hrát
proti sobě (počítač proti počítači atd.)</p>
 
 
<p>Hráči jsou jednotlivé objekty, které v datové části
obsahují obě hrací plochy a jsou schopny mezi sebou komunikovat.</p>
 
<p>Celý program se skládá z několika modulů - MOUSE01
(ovládání myši), MCRT01 (ovládání v/v), TMENU01 (jednoduché menu), HRACI
(obsahuje objekty hráčů). </p>
 
 
<p>Sestavení celého programu nejlépe nastíní obrázek:</p>
 
<p><TT><pre>
 ____________
|BESTLODE.PAS|
|------------|         __________
|   MCRT01   |<-------|  MCRT01  |
|            |        |__________|     _________
|  TMENU01   |<---------------+-------| TMENU01 |
|            |     _________  |       |---------|
|   HRACI    |<---|  HRACI  | |------>|  MCRT01 |
|____________|    |---------| | +---->| MOUSE01 |
                  | MCRT01  |<+ |     |_________| 
                  |         |   |
                  | MOUSE01 |<--|     
                  |_________|   |
                               _|_______
                              | MOUSE01 |
                              |_________|
</pre></TT></p>
 
<p>(V horní části je název modulu a v dolní části jsou
vypsány moduly, které sám používá.)</p>
 
 
<h2>Popis implementace</h2>
 
<p>MOUSE01 - modul pro ovládání myši. Použil jsem, už dříve
hotovou jednotku, kterou jsem trochu upravil a doplnil jsem komentáře. Myslím,
že není třeba se zde rozepisovat.</p>
 
 
<p>TMENU01 - modul pro vytvoření a ovládání jednoduchého menu. Je
možno přidávat nebo odebírat jednotlivé položky. Ovládání je možné pomocí
klávesnice a myši. Vrací pořadové číslo vybrané položky.</p>
 
 
<p>Použité metody:</p>
 
<p>Init(xx,yy:byte) - inicializace menu, nutno zadat pozici
zobrazeni menu</p>
 
<p>NewItem(s:string) - přidá na konec novou položku, s = text
položky </p>
 
<p>Choice:byte - vrací číslo zvolené položky</p>
 
<p>Done - ukončí menu</p>
 
 
<p>MCRT01 - modul pro ovládání vstupních/výstupních operací. Je
to trochu upravená moje dřívější jednotka.</p>
 
 
<p>Nejčastěji použité procedury/funkce:</p>
 
<p>function GetKey:integer - vrací číslo stisknuté klávesy. Ošetřuje
i speciální klávesy, které nejprve posílají znak číslo 0 a potom další.
Rozlišení je provedeno přičtením 256 k hodnotě znaku.</p>
 
<p>procedure ErrorMes(s:string) - zobrazí hlášení a čeká na
stisk libovolné klávesy. Parametrem s se předává text hlášení.</p>
 
<p>function YesNo:boolean - při stisku kláves 'A','a' vrací hodnotu true, při stisku kláves 'N','n' vrací hodnotu false</p>
 
<p>function YesNoQ(s:string):boolean - zobrazí dotaz a čeká na
stisk kláves 'a,'A' pro ANO (pak vrátí true) nebo 'n','N' pro NE (pak vrátí
false). Parametrem s se předává text otázky.</p>
 
<p>procedure CursorOn - zobrazí kurzor normální velkosti</p>
 
<p>procedure CursorOff - skryje kurzor</p>
 
 
<p>HRACI - modul obsahuje několik objektů, které jsou potomky základního
objektu OHRAC, kvůli kompatibilitě. Dále popíšu jen základní data a metody
objektů.</p>
 
 
<p>OHRAC - základní objekt</p>
 
<p>Data:</p>
 
<p>plocha1, plocha2 - pole představující hrací plochy hráče </p>
 
 
<p>Metody:</p>
 
<p>constructor Init(zvuky,zobr:boolean) - inicializuje objekt,
volá metodu ROZESTAVENI, indikuje zda-li se budou hrát zvuky a budou-li se
zobrazovat hrací plochy daného objektu.</p>
 
<p>procedure Rozestaveni - automatické rozestavení lodí v hrací ploše</p>
 
<p>procedure ZobrazeniPlochy - zobrazí hrací plochy hráče</p>
 
<p>procedure Strelba(var x,y:byte) - abstraktní metoda, je u každého hráče jiná,
parametry x, y vrací souřadnice střelby</p>
 
 
<p>function Hra(h:POHrac;var
konec:boolean):boolean - metoda zajišťující základní běh hry. Parametrem h
dostane ukazatel na protihráče a parametrem konec se indikuje předčasné
ukončení hry. Metoda HRA volá metody ZOBRAZENIPLOCHY, STRELBA, kde získá souřadnice
střelby. Pomocí ukazatele na soupeře h zavolám soupeřovu metodu TREFA, která
vrací true, pokud jsem se trefil, nebo false, pokud jsem minul. Také se volá
soupeřova metoda PROHRAL, která vrací true, pokud má soupeř potopeny všechny lodě,
nebo false, pokud mu nějaké lodě zbývají. Stejnou hodnotu vrátí samotná metoda
HRA, pomocí které v hlavním programu indikuji stav hry.</p>
 
 
<p>function Trefa(x,y:byte):boolean - parametry x,y předám souřadnice střelby a
metoda TREFA vrátí hodnotu true, pokud jsem se trefil, a naopak. Dále v hráčově
hracím poli zapíše minutí nebo zásah.</p>
 
<p>function Prohral:boolean - metoda testuje jestli zbývají hráči ještě nějaké lodě.
Vrací true pokud zbývají a false pokud ne.</p>
 
 
<p>OCLOVEK - objekt zajišťující hru člověka. </p>
 
<p>Data:</p>
 
<p>zpet:boolean - indikátor předčasného ukončení hry</p>
 
 
<p>Metody:</p>
 
<p>constructor Init(zvuky,zobr:boolean) - nastaví indikátor
předčasného konce hry a volá zděděnou metodu INIT.</p>
 
<p>procedure Strelba(var x,y:byte) - čte souřadnice zadané hráčem (zadané z klávesnice nebo myší), zkontroluje je a předá parametry x,y.</p>
 
<p>function Hra(h:POHrac;var konec:boolean):boolean - předefinovaná metoda původního
objetu OHRAC má podobnou strukturu, navíc jen ošetřuje jiným způsobem možnost
předčasného konce hry.</p>
 
 
<p>OSTISTKO - objekt zajišťující hru počítače.</p>
 
<p>Data:</p>
 
<p>policek:word - počet poliček hracího pole, používá se při střelbě</p>
 
 
<p>Metody:</p>
 
<p>constructor Init(zvuky,zobr:boolean) - spočítá množství
políček hracího pole, uloží je v proměnné "policek" a zavolá zděděnou
metodu Init.</p>
 
<p>procedure Strelba(var x,y:byte) - náhodně zvolí jedno z prázdných
políček (proměnná "policek") a zjistí jeho pozici v hracím poli.
Tuto pozici vrátí parametry x,y.</p>
 
 
<p>OPODVODNIK - objekt zajišťující hru počítače.</p>
 
<p>Data:</p>
 
<p>lode:word - počet políček obsazených loděmi</p>
 
<p>prazdne:word - počet neobsazených políček</p>
 
 
<p>Metody:</p>
 
<p>function Hra(h:POHrac;var konec:boolean):boolean - při první hře si přečte
soupeřovu hrací plochu a místa obsazená lodí si označí ve svém pravém hracím
poli a spočítá počet obsazených a prázdných políček.</p>
 
<p>procedure Strelba(var x,y:byte) - nejprve náhodně zvolí číslo od 0 do 3, když
padne 0, tak se trefí, jinak se netrefí. Tím docílím pravděpodobnosti zásahu 1:4.
Potom se už volají jen procedury, které buď vrátí pozici s lodí, nebo
prázdnou pozici.</p>
 
 
<p>OLOGIK - hra počítače.</p>
 
<p>Data:</p>
 
<p>polehodnot:tpolehodnot - pole je pro jednoduchost o dvě
políčka větší v každém směru a obsahuje hodnoty typu integer.</p>
 
 
<p>Metody:</p>
 
<p>procedure Strelba(var x,y:byte) - střelba probíhá na základě
ohodnocených políček, kdy se náhodně vybere políčko s&nbsp;nejvyšší hodnotou a
jeho pozice je vrácena parametry x,y. </p>
 
<p><i>Hodnocení políček:</i> Postupně jsou probírána "všechna" políčka pravé hrací plochy, vejdou-li se na danou pozici postupně lodě všech velikostí (za prázdné políčko se pokládá
i pole označené jako zasáhnuté) je hodnota pozic, které by daná loď obsadila,
zvětšena o jednu. Tak dosáhnu nejpravděpodobněji obsazených pozic. Navíc, je-li
v pravé hrací ploše označen zásah, je k levé a pravé přiléhající
pozici přičteno 6 a k horní a dolní přiléhající pozici 5. Tím dosáhnu
odhalení větších lodí a skupin lodí.</p>
 
 
<h2>Uživatelský návod</h2>
 
<p>Hru je možné ovládat klávesnicí i myší, stačí se přidržet
nápovědy v dolním řádku obrazovky.</p>
 
 
<h2>Závěr</h2>
 
<p>Závěrem bych chtěl říci, pokud se nechcete hned naštvat, tak
nehrajte s "podvodníkem". Hrajete-li s "logikem" nikdy neseskupte lodě do
jednoho chumlu, protože jakmile se tam jednou trefí, už nepřestane (tedy skoro).
Také je zajímavé (asi 5 minut) sledovat úspěšnost jednotlivých algoritmů. Díky
semestrální práci jsem měl možnost procvičit si práci s objekty. Také jsem
se procvičil v hledání různých chyb. Dále jsem si ověřil, že vymyšlení
stručného a vhodného komentáře, je těžší než kratší slohová práce.</p>
 
 
 
</body>
 
</html>