Hra Had v DelphiX IV. - Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:



Delphi

Hra Had v DelphiX IV.

hra_had

2. dubna 2001, 00.00 | Poslední díl o tvorbě hry Had v DelphiX. Dnes si popíšeme pohyb hada, požírání potravy a kolizi se stěnou nebo potravou. Pokud se vám nechce nic programovat, můžete si stáhnout již hotovou hru!



V minulém díle jsme si ukázali, jak zkrotit klávesnici, a proto bychom si dnes měli ukázat, jak také zkrotit hada. Myslím tedy jeho pohyb, jelikož se pořád ještě nehýbe. Tak se do toho dáme.

Pohyb hada

Začneme rovnou vytvořením procedury UpdateHada, která se nám postará právě o jeho pohyb, popř. ještě prodloužení. Princip pohybu bude jednoduchý, budeme probírat články od posledního do prvního a vždy mu přiřadíme hodnotu článku o 1 nižší. Nakonec nám zbyde článek 0, kterému nemůžeme žádný článek -1 přiřadit, jelikož neexistuje, a proto mu přiřadíme novou pozici podle proměnné smer. Zde je již obrázek a zdrojový kód procedury UpdateHada:



Procedure TForm1.UpdateHada; var i:integer; begin for i:=DelkaHadu DownTo 1 do begin Had[i]:=Had[i-1]; end; // nastavení nové pozice 1. článku hada (hlavičky) if smer = nahoru then Had[0].y:=Had[0].y-1; if smer = dolu then Had[0].y:=Had[0].y+1; if smer = doprava then Had[0].x:=Had[0].x+1; if smer = doleva then Had[0].x:=Had[0].x-1; end;


Pokud jste tak ještě neudělali, odstraňte button z minulého projektu a do procedury DXTimer1.OnTimer přidejte před řádek kreslení hada řádek pro jeho update - UpdateHada. Ještě nezapomeňte nastavit interval u DXTimeru na nějakou normální hodnotu, např. 100, aby Vám had hned na začátku nezmizel z plochy. Projekt uložte a spusťte.
Pokud had reaguje na stisk šipek a zatáčí, je vše v pořádku. Samozřejmě můžete projíždět sami sebou i mimo plochu displeje, jelikož to ještě není nijak ošetřeno. Také nemůžete žrát potravu a na tu se podíváme hned jako první.

Sbírání potravy

Nyní bychom si měli ještě definovat pár proměnných, a to: score (to je snad jasné), ScoreAdd - kolik bodů budeme přičítat ke skóre při sežrání potravy (závisí na nastavené obtížnosti) a nakonec ještě Zdelsit typu boolean, které nám řekne, zda máme v proceduře UpdateHada hada prodloužit, či pouze posunout.
Sbírání potravy provedeme jednoduchým způsobem, a to tak, že rovnou v proceduře UpdateHada budeme testovat, zda se hlavička hada nachází na pozici potravy. Pokud ano, přičteme ScoreAdd ke Score, nastavíme novou pozici potravy procedurou SetNewZradlo a proměnnou Zdelsit nastavíme na true (změnu délky hada si probereme v další kapitole, proto nastavení proměnné zdelsit nemá zatím žádný větší význam). V proceduře Form1.OnCreate si ještě jednotlivé proměnné nastavíme - Score:=0; ScoreAdd:=8; Zdelsit:=false a do procedury UpdateHada již můžeme vložit následující kód:

 
// nenajel had náhodou na žrádlo ? if (Had[0].x = Zradlo.x) and (Had[0].y = Zradlo.y) then begin SetNewZradlo; // zdelšit hada Zdelsit:=true; // přidat score Score:=Score+ScoreAdd; end;


Pokud nyní projekt spustíte, a najedete s hadem na potravu, objeví se někde jinde a přičte se Vám skóre, které si však nemůžete nikde prohlédnout, ale víte, že existuje :) Pokud tomu nevěříte, zkuste si např. na formulář dát label, přejmenovat jej na ScoreLabel a do procedury UpdateHada přidat za testování, zdali najel had na žrádlo tento řádek, který zajistí, že své skóre uvidíte:


ScoreLabel.Caption:='Score: '+IntToStr(Score);


Změna délky hada

Konečně jsme se k tomu dostali. Tedy prodloužení hada. Ještě před posunutím přidáme následující kód, který zajistí, že článku DelkaHadu+1 přiřadíme hodnotu článku DelkaHadu (před kód pro posunutí přidáváme toto proto, že při přepisování hodnot článků se hodnota článku posledního změní, a my potřebujeme tuto starou).

 
if Zdelsit then begin Had[DelkaHadu+1]:=Had[DelkaHadu]; end;


Následovat bude posunutí, které jsem již popisoval výše, čímž se jednotlivé články posunou, tudíž se had prodlouží a nakonec ještě musíme zvětšit i proměnnou DelkaHadu, jinak bychom konečný článek neviděli. Zde je kód:

 
if Zdelsit then begin delkaHadu:=DelkaHadu+1; Zdelsit:=false; end;


Samozřejmě jsme také nastavili Zdelsit na false, jinak by totiž had neustále rostl, takže by za chvíli zaplnil celý displej (ostatně si to můžete vyzkoušet sami vymazáním řádku). Pro snadnější pochopení procedury je zde ještě obrázek:


Koliza hadu s ocasem a se zdí

A nakonec si ukážeme, jak zjistit, zda náhodou had nenajel do zdi, či do svého ocasu. Začneme se zdí. Jak víme, plocha hada, po které se může pohybovat má v x-ové ose hodnoty od nuly do 18 a v y-ové od nuly do 10. Budeme tedy testovat, zde se souřadnice článku Had[0] nenachází mimo tyto hodnoty. V konečné hře se při nárazu odskočí na jinou scénu, či se zapíše nový rekord. Jelikož však máme scénu zatím pouze jednu, přidáme si například řádek, který zajistí pípnutí PC-speakru. Pro ty, co nemají PC-speaker zapnutý (jako např. já) jsem přidal ještě jednu variantu, a to že pokud se bude hlavička hada nacházet mimo plochu, změní se pozadí formuláře na červenou barvu (pokud vjedete zpět, barva se opět změní na původní). Zde je již kód:


// nenarazil náhodou do stěny ??? if (had[0].x<0) or (had[0].x>18) or (had[0].y<0) or (had[0].y>10) then begin // vymazat a nahradit něčím jiným... Beep; Color:=clRed; end else color:=clBtnFace;


A nyní ještě kolize s vlastním ocasem. Princip bude podobný, pouze budeme procházet články Had[1]Had[DelkaHadu] a zkoumat, nenachází-li se hlavička hada na některém z nich. Opět přidáme pouze řádek beep. Tento kód samozřejmě ve své hře nahradíte něčím jiným. Zde tedy je:

 
// nenarazil náhodou sám do sebe ??? for i:=1 to DelkaHadu do begin if (Had[i].x = Had[0].x) and (Had[i].y = Had[0].y) then begin // nahradit !! Beep; end; end;


Nakonec přidám ještě malý bonus, který jsem přidal až ve verzi 1.3 (na mobilu je samozřejmě již od začátku) a vetšina her s podobným tématem jej také obsahuje. Jedná se o to, že pokud jedete např. doprava a zahnete doleva, nenajedete do svého těla a nezabijete se, ale jedete dál doprava. Budeme tedy zkoumat nultý a první článek hada a ještě k tomu směr. Kód je již potom jednoduchý, proto myslím nepotřebuje dalších komentářů (pozor, musíte jej přidat hned na začátek procedury !):

 
// natažení sám do sebe--... if (Had[1].x = Had[0].x-1) and // had jede doprava, a zabočí doleva (Had[1].y = Had[0].y) and (smer = doleva) then begin smer:=doprava; end else if (Had[1].x = Had[0].x+1) and // had jede doleva a zabočí doprava (Had[1].y = Had[0].y) and (smer = doprava) then begin smer:=doleva; end else if (Had[1].x = Had[0].x) and // had jede dolů a zabočí nahoru (Had[1].y = Had[0].y-1) and (smer = nahoru) then begin smer:=dolu; end else if (Had[1].x = Had[0].x) and // had jede nahoru a zabočí dolu (Had[1].y = Had[0].y+1) and (smer = dolu) then begin smer:=nahoru; end;


A to je konec dnešního článku, a zároveň konec našeho malého seriálu o tvorbě hry had. Teď si možná řeknete - už konec ? Ano. Cílem tohoto seriálu bylo vysvětlit algoritmus a postupy při tvorbě hry, jak s tím naložíte, to je již na vás. Nikdo vás nenutí, abyste dělali druhého hada z nokie, proč taky. Ale díky jednoduchosti kódu můžete udělat hada úplně odlišného, s více možnostmi, bonusy, pozadími, scénami a kdoví co ještě. Představivosti se meze nekladou, takže držím palce ať nějaká ta hra vznikne...

A pro ty, kteří chtějí vidět, jak nepřehledně může had vypadat (a jak také vypadá po dnešních úpravách) je zde malý obrázek:


Download
ZDE si můžete stáhnout dnes vytvořený program a jeho zdrojáky (261 kB)

Odkazy
ZDE můžete navštívit stránku hry Had, a stáhnout si aktuální verzi i se všemi vylepšeními

Obsah seriálu (více o seriálu):

Tématické zařazení:

 » Rubriky  » Delphi  

 » Rubriky  » Windows  

 

 

 

Nejčtenější články
Nejlépe hodnocené články

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: