HRA LODĚ - download

Autor: Aleš Kučík

Skupina: 104

E-mail: ales.prog@centrum.cz

Zadání semestrální práce

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

Analýza

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.

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.

Zajímavé by také bylo, kdyby jednotliví hráči mohli hrát proti sobě (počítač proti počítači atd.)

Hráči jsou jednotlivé objekty, které v datové části obsahují obě hrací plochy a jsou schopny mezi sebou komunikovat.

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áčů).

Sestavení celého programu nejlépe nastíní obrázek:

 ____________
|BESTLODE.PAS|
|------------|         __________
|   MCRT01   |<-------|  MCRT01  |
|            |        |__________|     _________
|  TMENU01   |<---------------+-------| TMENU01 |
|            |     _________  |       |---------|
|   HRACI    |<---|  HRACI  | |------>|  MCRT01 |
|____________|    |---------| | +---->| MOUSE01 |
                  | MCRT01  |<+ |     |_________| 
                  |         |   |
                  | MOUSE01 |<--|     
                  |_________|   |
                               _|_______
                              | MOUSE01 |
                              |_________|

(V horní části je název modulu a v dolní části jsou vypsány moduly, které sám používá.)

Popis implementace

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.

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.

Použité metody:

Init(xx,yy:byte) - inicializace menu, nutno zadat pozici zobrazeni menu

NewItem(s:string) - přidá na konec novou položku, s = text položky

Choice:byte - vrací číslo zvolené položky

Done - ukončí menu

MCRT01 - modul pro ovládání vstupních/výstupních operací. Je to trochu upravená moje dřívější jednotka.

Nejčastěji použité procedury/funkce:

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.

procedure ErrorMes(s:string) - zobrazí hlášení a čeká na stisk libovolné klávesy. Parametrem s se předává text hlášení.

function YesNo:boolean - při stisku kláves 'A','a' vrací hodnotu true, při stisku kláves 'N','n' vrací hodnotu false

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.

procedure CursorOn - zobrazí kurzor normální velkosti

procedure CursorOff - skryje kurzor

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

OHRAC - základní objekt

Data:

plocha1, plocha2 - pole představující hrací plochy hráče

Metody:

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.

procedure Rozestaveni - automatické rozestavení lodí v hrací ploše

procedure ZobrazeniPlochy - zobrazí hrací plochy hráče

procedure Strelba(var x,y:byte) - abstraktní metoda, je u každého hráče jiná, parametry x, y vrací souřadnice střelby

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.

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.

function Prohral:boolean - metoda testuje jestli zbývají hráči ještě nějaké lodě. Vrací true pokud zbývají a false pokud ne.

OCLOVEK - objekt zajišťující hru člověka.

Data:

zpet:boolean - indikátor předčasného ukončení hry

Metody:

constructor Init(zvuky,zobr:boolean) - nastaví indikátor předčasného konce hry a volá zděděnou metodu INIT.

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.

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.

OSTISTKO - objekt zajišťující hru počítače.

Data:

policek:word - počet poliček hracího pole, používá se při střelbě

Metody:

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.

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.

OPODVODNIK - objekt zajišťující hru počítače.

Data:

lode:word - počet políček obsazených loděmi

prazdne:word - počet neobsazených políček

Metody:

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.

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.

OLOGIK - hra počítače.

Data:

polehodnot:tpolehodnot - pole je pro jednoduchost o dvě políčka větší v každém směru a obsahuje hodnoty typu integer.

Metody:

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 nejvyšší hodnotou a jeho pozice je vrácena parametry x,y.

Hodnocení políček: 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í.

Uživatelský návod

Hru je možné ovládat klávesnicí i myší, stačí se přidržet nápovědy v dolním řádku obrazovky.

Závěr

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.