pascal - had

HackForum

pascal - had#
začal sem psát svoji první hru - hada ale nejak me nenapadá jak ho "mazat" (aby měl konstantvní delku) a tak mi pořád přibývá a přibývá a ... hodim sem zdroják a kdyby někdo měl nějaký nápad tam sem s ním prosím...

P.S. v pascalu nejsem nějak extra pokročilý tzn. knihovnu graph sem jen zlehka zkoukl a zatím ji nepoužívám a neumím pracovat s objekty...

tady je zdroják:

program had;
uses windows,crt;
const up=#72;
down=#80;
left=#75;
right=#77;
esc=#27;
clanek_hada='o';
clanek_ramecku='*';
rychlost=100;

var x,y:byte;
klavesa:char;
a:integer;
score:integer;

label kolo;

//procedury


procedure hlavicka;
begin
textcolor(lightred);
writeln(' Snake by Michael Hartman');
writeln(' -------------------------------------------
-----------------------------------');
end;



procedure vytvoreni_ramecku;
begin

textcolor(cyan);

y:=2;
repeat
y:=y+1;
x:=1;
gotoxy(x,y);
write(clanek_ramecku);
until y = 25;

y:=2;
repeat
y:=y+1;
x:=79;
gotoxy(x,y);
write(clanek_ramecku);
until y = 25;

x:=0;
repeat
x:=x+1;
y:=25;
gotoxy(x,y);
write(clanek_ramecku);
until x = 79;

x:=0;
repeat
x:=x+1;
y:=3;
gotoxy(x,y);
write(clanek_ramecku);
until x = 79;
end;



procedure konec_ramecku;
begin
MessageBox (0, 'Tak a ted tvuj had narazil! Hra koncí!' , 'Konec hraciho pole!', 0 + MB_ICONHAND + MB_SYSTEMMODAL);
clrscr;
hlavicka;
vytvoreni_ramecku;
x:=20;
y:=12;
gotoxy(x,y);
textcolor(lightred);

case score of
0..65: write ('Hmm.. Nic moc - ');
66..100: write ('To ujde - ');
101..160: write ('To je slusny - ');
161..260: write ('Blahopreji - ');
else
begin
write ('Supeeer - ');
sound(500);
delay(500);
end
end;
writeln('dosahl jsi score ',score,'!');
score:=0;
readkey;
end;



procedure doleva;
begin
repeat
x:=x-1;
if x < 2 then begin konec_ramecku; goto kolo; end;
gotoxy(x,y);
write(clanek_hada);
score:=score+1;
delay(rychlost);
if keypressed then klavesa:=readkey;
if klavesa=esc then halt;
until (klavesa = up) or (klavesa = down);
end;



procedure doprava;
begin
repeat
x:=x+1;
if x > 78 then begin konec_ramecku; goto kolo; end;
gotoxy(x,y);
write (clanek_hada);
score:=score+1;
delay(rychlost);
if keypressed then klavesa:=readkey;
if klavesa=esc then halt;
until (klavesa = up) or (klavesa = down);
end;



procedure dolu;
begin
repeat
y:=y+1;
if y > 24 then begin konec_ramecku; goto kolo; end;
gotoxy(x,y);
write (clanek_hada);
score:=score+1;
delay(rychlost);
if keypressed then klavesa:=readkey;
if klavesa=esc then halt;
until (klavesa = left) or (klavesa = right);
end;



procedure nahoru;
begin
repeat
y:=y-1;
if y < 4 then begin konec_ramecku; goto kolo; end;
gotoxy(x,y);
write (clanek_hada);
score:=score+1;
delay(rychlost);
if keypressed then klavesa:=readkey;
if klavesa=esc then halt;
until (klavesa = left) or (klavesa = right);
end;








{***MAIN***}
begin
kolo:
cursoroff;
klavesa:=' ';
clrscr;
hlavicka;
vytvoreni_ramecku;
textcolor(lightgreen);
x:=12;
y:=8;
gotoxy (x,y);

a:=0;
repeat
a:=a+1;
write(clanek_hada);
until a = 5;

x:=16;
y:=8;
gotoxy (x,y);

repeat
if keypressed then klavesa:=readkey;

case klavesa of
left: doleva;
right: doprava;
down: dolu;
up: nahoru;
end;
until (klavesa = esc);
end.
(odpovědět)
polly | 62.245.78.*1.11.2007 20:52
re: pascal - had#
jelikož tady nefunguje odsazení tak tady je soubor *.pas

[link]
(odpovědět)
polly | 62.245.78.*1.11.2007 20:57
re: pascal - had#
drz si v poli vsechny pozice, kde mel had hlavu a kdyz bude dost dlouhej (v poli bude dost polozek), tak je z toho pole postupne vyndavej a na tu pozici vypisuj ten samej znak ale cerne.

----------
Harvie's blog: [link] g33k-shop: [link] fs: [link]
Registered GNU/LINUX user #468114 [link]

(odpovědět)
Harvie | E-mail | Website | ICQ 2837829781.11.2007 22:57
re: pascal - had#
díky za radu... zatím neumim pracovat s polema ale podívám se na ně a pak napíšu jak to dopadlo...
(odpovědět)
polly | 62.245.78.*2.11.2007 7:05
re: pascal - had#
chybka za chybkou ...
(odpovědět)
xtrip. | 82.113.62.*2.11.2007 9:52
re: pascal - had#
Kreslení rámečku - osu, která se nemění, stačí definovat pouze jednou, a ne pokaždé v cyklu znova.
Jinak mi přijde, že procedury doleva, doprava, nahoru, dolu jsou tak nějak už základní myšlenkou špatně (tedy rozčlenění na procedury pro jednotlivé směry je dobré, ale ten vnitřek těch procedur obsahuje věci, které by měly být někde jinde, navíc ty šílené skoky jsou hrozné - begin konec, goto kolo, end - mám strach, aby nezůstávalo něco na zásobníku!).
Doporučuji v proceduře klávesy nenačítat - míst, kde se klávesa (joystick, cokoliv) čte, by v programu mělo být co nejmíň, nejlepší je, když je takové místo jenom jedno. V případě nějakých úprřav programu se pak mění jen to jedno místo, třeba v případě, že se mění vstupní zařízení a podobně...
Procedura směru by měla obstarat posun hada o jedno políčko daným směrem a konec. Žádné setrvávání v proceduře, protože pak do ní (tedy do všech čtyř pro různé směry) musíš cpát všechno, co by mohlo být jinak mimo v jediné kopii.
Pak už jen nějaký test, zda had nenarazil - ale na to stačí samostatná procedura, které stačí sdělit, z jakého směru had přišel. A ta může testovat i náraz do "žrádla", až ho do hry přidáš...
Jinak k těm směrům, polohu hlavy lze měnit pouhými dvěma příkazy, pokud ti kompilátor převádí booleany na 0 a 1 : X=X+(stisknuta klávesa vpravo)-(stisknuta klávesa vlevo)
(odpovědět)
gugumaa | 195.113.79.10/10.0.10.*2.11.2007 10:50
re: pascal - had#
diky všem za rady... nejak jsem to udělal had už funguje... ale když jdu do dalšího kola tak v jednom bode nastane chyba (označeno v zdrojovim kodu) a taky když sežere potravu tak sem mu tam nehodí další potrava - to taky nechápu proč...

tady je zdroják

program had;
uses windows,crt;
const up=#72;
down=#80;
left=#75;
right=#77;
esc=#27;
clanek_hada='o';
clanek_ramecku='*';
rychlost=100;

type pozice=array[1..3200] of integer;

var x,y:byte;
klavesa:char;
hlava_x:pozice;
hlava_y:pozice;
i:integer;
delka_hada:word;
x_potrava,y_potrava:byte;

label kolo;


//procedury


procedure hlavicka;
begin
textcolor(lightred);
writeln(' Snake by Michael Hartman');
writeln(' -------------------------------------------
-----------------------------------');


textcolor(cyan);

y:=2;
repeat
y:=y+1;
x:=1;
gotoxy(x,y);
write(clanek_ramecku);
until y = 25;

y:=2;
repeat
y:=y+1;
x:=79;
gotoxy(x,y);
write(clanek_ramecku);
until y = 25;

x:=0;
repeat
x:=x+1;
y:=25;
gotoxy(x,y);
write(clanek_ramecku);
until x = 79;

x:=0;
repeat
x:=x+1;
y:=3;
gotoxy(x,y);
write(clanek_ramecku);
until x = 79;
end;



procedure konec_ramecku;
begin
MessageBox (0, 'Tak a ted tvuj had narazil! Hra koncí!' , 'Konec hraciho pole!', 0 + MB_ICONHAND + MB_SYSTEMMODAL);
clrscr;
hlavicka;
end;



procedure kontrola_narazu(x,y:byte);
begin
if (y < 5) or (y > 23) or (x < 3) or (x > 77) then
begin
konec_ramecku;
goto kolo;
end;
end;




procedure doleva;
begin
x:=x-1;
gotoxy(x,y);
write(clanek_hada);
end;



procedure doprava;
begin
x:=x+1;
gotoxy(x,y);
write (clanek_hada);
end;



procedure dolu;
begin
y:=y+1;
gotoxy(x,y);
write (clanek_hada);
end;



procedure nahoru;
begin
y:=y-1;
gotoxy(x,y);
write (clanek_hada);
end;


procedure potrava;
begin
randomize;
x_potrava:=random(72);
y_potrava:=random(18);
gotoxy(x_potrava+3,y_potrava+5);
write('x');
end;


{***MAIN***}
begin
clrscr;
hlavicka;
cursoroff;
kolo:
delka_hada:=8;
klavesa:=' ';
textcolor(lightgreen);
x:=12;
y:=8;
gotoxy (x,y);

potrava;
repeat
if keypressed then klavesa:=readkey;

case klavesa of
left: doleva;
right: doprava;
down: dolu;
up: nahoru;
end;


i:=i+1;
hlava_x:=x;
hlava_y:=y;
gotoxy(hlava_x[i-delka_hada],hlava_y[i-delk
a_hada]);
textcolor(black);
write('o'); //misto kde pri dalším kole dojde k chybe

if (x_potrava+4 = x) and (y_potrava+5 = y) then
begin
potrava;
delka_hada:=delka_hada+1;
end;

textcolor(lightgreen);
gotoxy(x,y);
kontrola_narazu(x,y);
delay(rychlost);
until (klavesa = esc);
end.
(odpovědět)
polly | 62.245.78.*2.11.2007 17:22
re: pascal - had#
další z věcí je že to pole prostě jednou dojde...
(odpovědět)
polly | 62.245.78.*2.11.2007 17:39
re: pascal - had#
Kua, má délku 3200, to je víc, než se vleze na obrazovku... implementuj to jako frontu!
Kouknu, kde je chyba.
(odpovědět)
gugumaa | 195.113.79.10/10.0.10.*2.11.2007 17:48
re: pascal - had#
ano má delku 3200 a muze mit i vic ale v dalším kole bude zase přibývat... a třeba po 20ti kolech přeteče... a jídlo už se ukazuje.. byla chyba v tom že se vypisovalo černě... ale proč neni pak další kolo to netušim... chyba nastane u příkazu write
(odpovědět)
polly | 62.245.78.*2.11.2007 17:53
re: pascal - had#
To kreslení rámečku:
x:=1; //x stačí definovat tu
y:=2;
repeat
y:=y+1;
gotoxy(x,y); //a už se s x nemusí hýbat (šetří čas a proměnná se tolik neopotřebuje :o)
write(clanek_ramecku);
until y = 25;

Proč za mainem dáváš gotoxy někam, když dřív, než něco vytiskneš, dáváš v potravě gotoxy někam jinam? Zbytečný příkaz navíc.

hlava_x:=x;
hlava_y:=y; - nechybí tam něco? pole=byte?

na začátku není definovaná hodnota i - kdoví, kam do pole ti to směřuje? Hlavně v těch dalších kolech...

Jinak s tím žrádlem, chyba je v těch konstantách +3, +4, +5, +5 - když se ke žrádlu přiblížíš v jedné ose (y), tak žrádlo sežere a objeví se nové, v druhé ose (x) žrádlo nesežere, a proto se neobjeví nové - jenom ho smazal z obrazovky. Žrádlo by se objevilo, kdybys jel o jednu pozici vedle žrádla. Všimni si, že se ti liší hodnoty, které k souřadnicím žrádla přičítáš, v místě, kde žrádlo kreslíš, a v místě, kde žrádlo testuješ - právě tohle opakování různých konstant a úprav proměnných ve zdrojáku je častý zdroj chyb (stačí jeden překlep a je to v prdeli).

Ještě to vysvětlím s tou frontou.


(odpovědět)
gugumaa | 195.113.79.10/10.0.10.*2.11.2007 18:02
re: pascal - had#
upravil sem to kreslení rámečku i potravu a na začátku definuju hodnutu i na 0. kdbys vysvetlil tu frontu byl bych ti vděčnej a eště nechápu tohle:
hlava_x:=x;
hlava_y:=y; - nechybí tam něco? pole=byte?

co tam mam opravit? (je to první pole co sem v životě udělal tak fakt nevim...)
(odpovědět)
polly | 62.245.78.*2.11.2007 18:14
re: pascal - had#
Existují dvě datové struktury - fronta a zásobník.
Zásobník někde začíná a má nějaký prostor, kam může růst. Když na něj něco nahážu, tak při odebírání beru to, co jsem na něj naposledy přidal (jako pokládání na hromádku a braní z hromádky). Když na něj něco přidávám a ubírám, chová se takhle: ("#" prvek, "." volná pozice)
#####....... <-#
######...... ->#
#####.......
Pokud přidávám nad míru...
#########...
##########..
###########.
############
############X - stack overflow, přepsal jsem něco, co jsem neměl.
No a fronta, to je jako fronta, kro první přijde, ten i první odejde:
#-> #......
#-> ##.....
a pak
#-> ####### ->#
Ty to musíš implementovat právě tím druhým způsobem. Stačí omezená délka pole (teoreticky maximálně počet políček v hadím rámečku - víc políček had zabírat prostě nemůže).
Protože při přidávání do fronty a odebírání z ní se prvky jakoby posouvají
9-> 8765432
9876543 ->2
a pohybování všemi prvky pole není dobrý nápad (při každém pohybu hlavy hada o jedno políčko hýbat 3200 integerů, tedy 6 kilobajty paměti, je šílená ztráta stojového času), implementuj si pointer na začátek a konec fronty (*) a jimi po tom poli pohybuj. Asi tak:
* *
7-> ..123456..
* *
..1234567.
8->
* *
..12345678
->9
* *
9.12345678
->1
* *
9..2345678
DOufám, že je tomu rozumět...
(odpovědět)
gugumaa | 195.113.79.10/10.0.10.*2.11.2007 18:17
re: pascal - had#
Kua obrázky... někam si to zkopíruj a převeď na proporční text (font Courier, System, Lucida console, ...), ať se v tom vyznáš.
(odpovědět)
gugumaa | 195.113.79.10/10.0.10.*2.11.2007 18:18
re: pascal - had#
představoval bych si hlava_x=x;
protože hlava_x je pole, a x je byte, ať je aspoň jasné, jaký prvek toho pole měníš (snad neměníš pole celé).
(odpovědět)
gugumaa | 195.113.79.10/10.0.10.*2.11.2007 18:21
re: pascal - had#
já myslim že sem to pochopil... potřebuju misto dvou polí (na souřadnice x a na y) dvě fronty akorát nerozumim tomu jak to udělat ve zdrojáku...
prostě jak to zapsat v "pascalštině"..
(odpovědět)
polly | 62.245.78.*2.11.2007 18:22
re: pascal - had#
a taky nevim jak upravit zdroják tak aby fungovalo i další kolo...
(odpovědět)
polly | 62.245.78.*2.11.2007 18:23
re: pascal - had#
tak sem si o tý frontě něco našel... ale naučit se jí používat mi asi chvíly zabere...
(odpovědět)
polly | 62.245.78.*2.11.2007 18:38
re: pascal - had#
No ono teoreticky stačí jedno pole na ukládání x,y,x,y,x,y,x,y - sudé položky jsou pak y a liché x. Ale to je věc implementace - dvě pole nejsou chyba.
Tož nadefinuju si pole a pointery
pole_x[1..maximum] of něco
pole_y[1..maximum] of něco
pointer_hlava:=1
pointer_ocas:=1 //na začátku je had jen jednopolíčkový, ale...
delka_hada:=8 //sis nadefinoval.
... //tož had se hejbne

pointer_hlava:=pointer_hlava+1
if (pointer_hlava >= maximum) then {pointer_hlava=1}
pole_x[pointer_hlava]:=x
pole_y[pointer_hlava]:=y

... // no a teď na ten ocas. Jak spočítat délku hada? hodíme na to funkci

pocas:=pointer_ocas
phlava:=pointer_hlava //protože funkce je destruktivní k phlava, nechceme si zničit pointer_hlava
if (phlava<pocas} then {phlava=phlava+maximum}
rozdil:=phlava-pocas //abychom odečítali menší od většího. A už známe délku hada od hlavy k ocasu.

No a mazání ocasu:
if (rozdil<delka_hada) then
{nic - necháme hada narůst}
else
{
gotoxy(pole_x[pointer_ocas],pole_y[pointer_
ocas]; smaž políčko; pointer_ocas:=pointer_ocas+1;
if (pointer_ocas >= maximum]) then {pointer_ocas=1}
}

{} = begin end
(odpovědět)
gugumaa | 195.113.79.10/10.0.10.*2.11.2007 18:55
re: pascal - had#
Do dalšího kola by to mělo chodit, pokud jsi opravil test sežrání žrádla a tu černou barvu. Kdyžtak si dej definici barvy těsně před tisk žrádla do funkce potrava.
(odpovědět)
gugumaa | 195.113.79.10/10.0.10.*2.11.2007 19:00
re: pascal - had#
promin ale fakt přestávám chápat... nevim co znamená ten pointer a k čemu slouží... a test sežrání žrádla sem opravil... ale další kolo neni... dalším kolem myslim když hráč narazí do stěny tak potom už nemůže hrát dál... nemáš kdyžtak icq? moje je 202-764-560
(odpovědět)
polly | 62.245.78.*2.11.2007 19:12
re: pascal - had#
Pointer je "ukazovátko" - ukazuju si, kde v tom poli mám začátek a konec fronty - pointery jsou ty hvězdičky na obrázcích (v C se pointer značí hvězdičkou u jména proměnné).
Zavádí se kvůli tomu, aby se nemuselo hýbat s frontou - místo toho si hýbu jen těmi dvěma ukazovátky, když do fronty něco přidám, hýbnu ukazatelem na jeden konec a přidám hodnotu do prvku pole, na které ukazuje, naopak při vybírání z fronty si vyzvednu prvek z místa, kam mi ukazuje udruhé ukazovátko, a posunu ho na další prvek.
Z toho zdrojáčku to snad pochopíš - mimochodem, najdeš, kde jsem udělal chybu? - chybí mi tam inicializace toho úplně prvního políčka ve frontě (
pole_x[1]:=x;
pole_y[1]:=y;
)
S tím nárazem do stěny nevím - vůbec se mi nelíbí ta filozofie vyskakovat z podprogramu (procedury) jinak než breakem nebo returnem (jinak se bojím, že se budou na zásobníku hromadit návratové adresy, pokud ne něco horšího). Jestli dobře koukám do programu - nečeká náhodou na klávesu? Jinak na začátku nového kola - nevím, jak jsi mezitím zdroják upravoval - neresetuješ pole a proměnnou i. Otestovat v práci nemůžu (no Pascal, sorry), koukám na to jen z hlavy.
(odpovědět)
gugumaa | 195.113.79.10/10.0.10.*2.11.2007 20:13
re: pascal - had#
Kdyžtak pro inspiraci skoukni SNAKE.PAS tady v tom archivu - [link]
(všimni si třeba pole screen[], kam si zrcadlí všechno, co se objevuje na obrazovce)
(odpovědět)
gugumaa | 195.113.79.10/10.0.10.*2.11.2007 20:30
re: pascal - had#
no to s tou frontou a pointerama asi necham na jindy až budu o něco pokročilejší ale jak nefunguje to nové kolo to bude možná tim že neresetuju ty pole... nevim totiž jak se takové pole resetuje... stejně je ale zvláštní že k chybě dojde při výpisu toho znaku... když to write ('o'); zakomentuju tak to běží (akorát se ten had nemaže)...
(odpovědět)
polly | 62.245.78.*2.11.2007 22:52
re: pascal - had#
Netiskneš to někam mimo obrazovku? (nějaké úchylné hodnoty v těch neinicializovaných polích, na které ukazuje nějaká úchylná hodnota v tom neinicializovaném i)
(odpovědět)
gugumaa | 89.24.4.*4.11.2007 9:28
re: pascal - had#
čekl bych že jo a řešením je resetovat ty pole ale pořád jsem nepřišel na to jak se to dělá...
(odpovědět)
polly | 62.245.78.*4.11.2007 17:11
re: pascal - had#
Lidsky řečeno - dělá se to tak, že si nastavíš, jak je had dlouhý a kde se nachází.
Už jsem to sem psal:
pointer_hlava:=1
pointer_ocas:=1
pole_x[1]:=x;
pole_y[1]:=y;
a to je celá inicializace.
Ty se svým "i" neděláš vůbec nic, to se pak nediv. JAké máš hodnoty i a prvku hlava_x a hlava_y v okamžiku startu druhého kola?
(odpovědět)
gugumaa | 195.113.79.10/10.0.10.*4.11.2007 17:52
re: pascal - had#
ja to ale nemam jako frontu... mam to jenom jako ty pole... a ty pointery musim asi deklarovat ve var že? jaký je to typ? pro jistotu sem hodim aktuální zdroják at vidíme oba to samí...

program had;
uses windows,crt;
const up=#72;
down=#80;
left=#75;
right=#77;
esc=#27;
clanek_hada='o';
clanek_ramecku='*';
rychlost=100;

type pozice=array[1..1500] of byte;


var x,y:byte;
klavesa:char;
hlava_x,hlava_y:pozice;
i:integer;
delka_hada:word;
x_potrava,y_potrava:byte;
score:longint;

label kolo;


//procedury


procedure hlavicka;
begin
textcolor(lightred);
writeln(' Snake by Michael Hartman');
writeln(' -------------------------------------------
-----------------------------------');


textcolor(cyan);

y:=2;
x:=1;
repeat
y:=y+1;
gotoxy(x,y);
write(clanek_ramecku);
until y = 25;

y:=2;
x:=79;
repeat
y:=y+1;
gotoxy(x,y);
write(clanek_ramecku);
until y = 25;

x:=0;
y:=25;
repeat
x:=x+1;
gotoxy(x,y);
write(clanek_ramecku);
until x = 79;

x:=0;
y:=3;
repeat
x:=x+1;
gotoxy(x,y);
write(clanek_ramecku);
until x = 79;
end;



procedure konec_ramecku;
begin
MessageBox (0, 'Tak a ted tvuj had narazil! Hra koncí!' , 'Konec hraciho pole!', 0 + MB_ICONHAND + MB_SYSTEMMODAL);
clrscr;
hlavicka;
gotoxy(25,12);
textcolor(27);
writeln ('Dosahl jsi score: ',score-500,'!');
// score:=0;
readkey;
clrscr;
hlavicka;
end;



procedure kontrola_narazu(x,y:byte);
begin
if (y < 5) or (y > 23) or (x < 3) or (x > 77) then
begin
konec_ramecku;
goto kolo;
end;
end;




procedure doleva;
begin
x:=x-1;
gotoxy(x,y);
write(clanek_hada);
end;



procedure doprava;
begin
x:=x+1;
gotoxy(x,y);
write (clanek_hada);
end;



procedure dolu;
begin
y:=y+1;
gotoxy(x,y);
write (clanek_hada);
end;



procedure nahoru;
begin
y:=y-1;
gotoxy(x,y);
write (clanek_hada);
end;


procedure potrava;
begin
randomize;
x_potrava:=random(72);
y_potrava:=random(18);
gotoxy(x_potrava+3,y_potrava+5);
textcolor(yellow);
write('x');
delka_hada:=delka_hada+1;
score:=score+500;
end;




{***MAIN***}
begin
clrscr;
hlavicka;
cursoroff;
kolo:

(*

pointer_hlava:=1
pointer_ocas:=1
hlava_x:=12;
hlava_y:=8;

*)




score:=0;
i:=0;
delka_hada:=8;
klavesa:=' ';
textcolor(lightgreen);
x:=12;
y:=8;

potrava;
repeat
score:=score+1;
if keypressed then klavesa:=readkey;
case klavesa of
left: doleva;
right: doprava;
down: dolu;
up: nahoru;
end;

i:=i+1;
hlava_x:=x;
hlava_y:=y;
gotoxy(hlava_x[i-delka_hada],hlava_y[i-delk
a_hada]);
write(' '); //misto kde pri dalším kole dojde k chybe
textcolor(lightgreen);

if (x_potrava+3 = x) and (y_potrava+5 = y) then
begin
potrava;
end;

gotoxy(x,y);
kontrola_narazu(x,y);
delay(rychlost);
until (klavesa = esc);
end.
(odpovědět)
polly | 62.245.78.*4.11.2007 18:08
re: pascal - had#
Typ pointeru dej jaký chceš - podle rozsahu. Z logiky věci stačí celočíselný typ, znaménko nepotřebuješ.
(odpovědět)
gugumaa | 195.113.79.10/10.0.10.*5.11.2007 7:38
re: pascal - had#
Pro inspiraci:
(neladil jsem to - psáno z hlavy, tak otestuj a oprav)


program had;
uses windows,crt;
const up=#72; down=#80; left=#75; right=#77; esc=#27;
clanek_hada='o'; clanek_ramecku='*'; mezera:=" ";
rychlost=100;
maximum=1332 /* 18x74 je pocet policek na hraci plose */

type pozice=array[1..maximum]

var x,y:byte;
klavesa:char;
hlava_x,hlava_y:pozice;
pointer_hlava:=longint
pointer_ocas:=longint
delka_hada:word;
x_potrava,y_potrava:byte;
score:longint;

label kolo;

//procedury

procedure hlavicka;
begin
textcolor(lightred);
writeln(' Snake by Michael Hartman');
writeln(' -------------------------------------------
-----------------------------------');
textcolor(cyan);

y:=2;
x:=1;
repeat
y:=y+1;
ramecek
until y = 25;

y:=2;
x:=79;
repeat
y:=y+1;
ramecek
until y = 25;

x:=0;
y:=25;
repeat
x:=x+1;
ramecek
until x = 79;

x:=0;
y:=3;
repeat
x:=x+1;
gotoxy(x,y);
ramecek
until x=79;
end;

procedure ramecek
gotoxy(x,y);
write(clanek_ramecku);
return

procedure konec_ramecku;
begin
MessageBox (0, 'Tak a ted tvuj had narazil! Hra koncí!' , 'Konec hraciho pole!', 0 + MB_ICONHAND + MB_SYSTEMMODAL);
clrscr;
hlavicka;
gotoxy(25,12);
textcolor(27);
writeln ('Dosahl jsi score: ',score-500,'!');
// score:=0; nebylo by lepsi pocitat skore nejak jinak, nez mit ulozeno o 500 vic?
readkey;
clrscr;
hlavicka;
end;

procedure doleva;
begin
x:=x-1;
end;

procedure doprava;
begin
x:=x+1;
end;

procedure dolu;
begin
y:=y+1;
end;

procedure nahoru;
begin
y:=y-1;
end;


procedure potrava;
begin
randomize;
x_potrava:=random(72);
y_potrava:=random(18);
gotoxy(x_potrava+3,y_potrava+5);
textcolor(yellow);
write('x');
delka_hada:=delka_hada+1;
score:=score+500;
end;

function kontrola_narazu(x,y): boolean;
begin
if (y < 5) or (y > 23) or (x < 3) or (x > 77) then
kontrola_narazu:=true else kontrola_narazu:=false;
end;

function delkahada (pocas, phlava):integer;
if (phlava<pocas) then phlava:=phlava+maximum
delkahada:=phlava-pocas;
end;

{***MAIN***}
begin
clrscr;
hlavicka;
cursoroff;
kolo:

x:=random(72)+3; //at je to trochu zajimavejsi,
y:=random(18)+5; //zacinat na nahodne zvolene pozici
pointer_hlava:=1
pointer_ocas:=1
hlava_x[pointer_hlava]:=x;
hlava_y[pointer_hlava]:=y;
score:=0;
delka_hada:=8;
klavesa:=' ';
textcolor(lightgreen);
potrava;
repeat
score:=score+1;
if keypressed then klavesa:=readkey;
case klavesa of
left: doleva;
right: doprava;
down: dolu;
up: nahoru;
end;
gotoxy(x,y);
write(clanek_hada);
pointer_hlava:=pointer_hlava+1;
if (pointer_hlava >= maximum) then (pointer_hlava:=1);
hlava_x[pointer_hlava]:=x
hlava_y[pointer_hlava]:=y
rozdil:=delkahada(pointer_hlava, pointer_ocas);
if (rozdil>delka_hada) then
begin
gotoxy(hlava_x[pointer_ocas],hlava_y[pointe
r_ocas]);
write(mezera);
pointer_ocas:=pointer_ocas+1;
if (pointer_ocas >= maximum]) then pointer_ocas:=1;
end;
textcolor(lightgreen);
if (x_potrava+3 = x) and (y_potrava+5 = y) then potrava;
if kontrola_narazu(x,y)= true then begin konec_ramecku; goto kolo;end;
delay(rychlost);
until (klavesa = esc);
end.
(odpovědět)
gugumaa | 195.113.79.10/10.0.10.*5.11.2007 16:12
re: pascal - had#
díky moc, tohle mi fakt pomohlo... sice tam toho bylo potřeba opravit celkem dost a části toho kodu vůbec nerozumim ( LOL :-D ) ale opravil sem to a běhá další kolo atp. jedinej problem je že ten had nenarůstá :-( zkusim přijít na to čim to je ale jak řikam - kusu toho celýho nerozumim...
(odpovědět)
polly | 62.245.78.*5.11.2007 18:09
re: pascal - had#
Cele to nestoji za nic, takhle se v Pascalu neprogramuje, to je jak nejaky QBasic ci podobne zaostaly jazyk, prvni chyba jsou nazvy promennych a procedur, druha chyba je uses windows,crt, dalsi chyba je goto (nepatri tam ani jeden), x := x + 1 je demence - neznas inc(x) ? a ten repeat je take spatne, nahore ma byt for a dole while + dalsi z mnoha tvych chyb je, ze nenastavujes sam textovy rezim a nezjistujes si MaxX ani MaxY a take si nemohu dovolit nevytknout delay() ktery nefunguje spolehlive (lisi ve v DOS i Windows), mel by se uzivat RTC.
(odpovědět)
XxX- | 62.77.121.*5.11.2007 18:46
re: pascal - had#
XxX: promin že s pascalem začínam a neumim ho jako ty...
(odpovědět)
polly | 62.245.78.*5.11.2007 19:14
re: pascal - had#
No je těžké to nějak učesat, pokud se má nechat trocha původního kódu a ne napsat to celé znova - což by bylo asi lepší.
Znovu, lépe, radostněji...
(odpovědět)
gugumaa | 195.113.79.10/10.0.10.*5.11.2007 19:32
re: pascal - had#
chápu že ten kod neni ideální ale bojim se že i kdybych to celé psal znovu tak bych se o moc lepšího výsledku nedobral...
(odpovědět)
polly | 62.245.78.*6.11.2007 7:08
re: pascal - had#
Ja osobne pascal vubec nemam rad , prijde mi k nicemu a serou nas s nim na IT oboru... misto toho, aby do nas hustili Cecko :)) sice ho uz celkem umim, ale rozhodne by to bylo zajimavejsi nez tehle pascvil...

polly: osobne nvm, proc to chces naprogramovat zrovna v pascalu :))

----------
Niemand ist so gut,wie er denkt ;)
(odpovědět)
Darth | E-mail23.11.2007 13:53
re: pascal - had#
Darth: nic jinýho neumim ;)
(odpovědět)
polly | 62.245.78.*23.11.2007 18:58
re: pascal - had#
Pak bych osobne byt tebou rozhodne se vykaslal na pascvil a makal na cecku :) podle me se uci mnohem lip nez tohle a naucis se na tom dobry programatorsky zasady...

----------
Niemand ist so gut,wie er denkt ;)
(odpovědět)
Darth | E-mail23.11.2007 19:57
re: pascal - had#
přemýšlel sem o tom... ale C tim že je nižší programovací jazyk než pascal tak obsahuje mnohem víc zkratek a je (podle mě) složitější na pochopení... to v pascalu neni... tam mam read, write, begin, end, while atd atd... a časem bych přešel na ObjectPascal... Nebo myslíš že je to blbost a mam doopravdy začit s C nebo jeho odnoží (C++, C#) ?
(odpovědět)
polly | 62.245.78.*23.11.2007 20:29
re: pascal - had#
nizsi nez pascal?:D coze?:D ja delam v C++ . Docela by me zajimalo, jak bys napsal treba sockety pro pascal, muze byt zajimavy :P ale naprosto na nic :P bez do C++

----------
Niemand ist so gut,wie er denkt ;)
(odpovědět)
Darth | E-mail25.11.2007 17:29
re: pascal - had#
btw v C++ mas cin , cout , int main(void) {} , while , for ;) cykly sou podobny ;) nic slozityho :P

----------
Niemand ist so gut,wie er denkt ;)
(odpovědět)
Darth | E-mail25.11.2007 17:30
re: pascal - had#
pokud vím tak v C se dají řešit opravdu nižší záležitosti než v pascalu. A taky jsem kdesi zaslech, by kdosi i třeba sokety pro pascal napsal celkem slušně :-)

a vaše diskuze o "zkratkách" působí značně legračně :-D

----------
Get enlightened!
(odpovědět)
mr.Crow | E-mail | Website25.11.2007 17:48
re: pascal - had#
Darth: sockety v pascalu? a v cem je jako problem? slysel jsi nekdy o FreePascalu + Indy? Nemluv o necem, o cem nevis nic.
(odpovědět)
( I ) | 85.132.198.*25.11.2007 18:24
re: pascal - had#
mno abych pravdu řek tak mi sockety nic neřikaj :-D

dneska sem se koukal na dinamický datový typy a vubec to nachapu takže o tom o čem tu pišete vy se mi muže zatim nechat jenom zdat :-D
(odpovědět)
polly | 62.245.78.*25.11.2007 18:30
re: pascal - had#
hledam Ip adress na admin php lug -/gemmin-request Nt Pasworder's-http//php .inlux.org
(odpovědět)
haribo 45 | 89.176.94.*27.11.2007 22:07
re: pascal - had#
( I ) : zkus poradne cist , psal jsem , ze by me zajimalo , jak by to udelal , ne ze to nejde , a taky sem psal, ze by to mohlo byt zajimave , takze v klidu ;) Mne proste prijde jednodussi a efektivnejsi to vsechno psat v C++ . Ne , ze to nejde v pascalu. Je to muj nazor , tak si nech svy blby kecy, nikdo na ne neni zvedavej dikes ;)

mr.Crow : to verim :P

----------
Niemand ist so gut,wie er denkt ;)
(odpovědět)
Darth | E-mail28.11.2007 8:51
re: pascal - had#
Nooo me celkem ty blby kecy zajimaj .. :D jasne pisu sem o 4 roky pozdeji, ale tak neva .. :D ... ty blby kecy muzou bet poucijici casto :P ... a zajimalo by me jestli si odmaturoval z toho IT oboru :P .. sem tam taky ale v 1. no :D :P ...(vim ze pisu prehnane smajliky, je to pak hrozne cist .. :( , ale neumim to jinak, takze se omlouvam)
(odpovědět)
blabla | 89.203.223.*20.12.2011 21:40
re: pascal - had#
Je mi tě líto.

Protože píšeš jako debil, protože tě (nejspíš) zajímá pascal a protože si fakt myslíš že někdo z nich sem ještě chodí.
(odpovědět)
Bystroushaak_ | 83.208.175.*21.12.2011 9:15

Zpět
Svou ideální brigádu na léto najdete na webu Ideální brigáda
 
 
 

 
BBCode