prosim vas dostali sme taku ulohu ze spravit akvarium, kazda ryba("*") sa ma pohybovat po akvariu nahodnymi smermi vselijako, ak sa stretu 2 na rovnakej pozicii ma prebehnut bud zozranie, cize o jednu ubudne alebo rozmnozenie, cize jedna pribudne, ja som to aj spravil lenze ja ani neviem ci to ide, skusal som spustit program a kazdu chvilu to printscreenoval a ratal som ich, skoro stale mi vysiel zakladny pocet(20), iba raz som ich naratal 19, mohol by sa na to niekto pozriet pls? K+ zaiste
program projekt;
uses crt;
type pos=record
x:integer;
y:integer;
znak:char;
smer:integer;
end;
var ryby:array[1..100] of pos;
i,pocet,xpom,ypom,cin,pomocna:integer;
test:boolean;
begin
clrscr;
randomize;
test:=false;
pocet:=5;
{priradovanie znakov, pozicie, smeru}
for i:=1 to pocet do begin
ryby[i].znak:='*';
ryby[i].x:=random(40);
ryby[i].y:=random(40);
ryby[i].smer:=random(4);
end;
{vypisovanie na poziciach}
for i:=1 to pocet do begin
goToXy(ryby[i].x, ryby[i].y);
write(ryby[i].znak);
end;
repeat
{pohyby}
for i:=1 to pocet do begin
{pohyb smerom hore}
if ryby[i].smer=0 then begin
if ryby[i].y=0 then ryby[i].y:=1 else ryby[i].y:=ryby[i].y-1;
end;
{pohyb smerom dole}
if ryby[i].smer=1 then begin
if ryby[i].y=40 then ryby[i].y:=39 else ryby[i].y:=ryby[i].y+1;
end;
{pohyb smerom vpravo}
if ryby[i].smer=2 then begin
if ryby[i].x=40 then ryby[i].x:=39 else ryby[i].x:=ryby[i].x+1;
end;
{pohyb smerom vlavo}
if ryby[i].smer=3 then begin
if ryby[i].x=0 then ryby[i].x:=1 else ryby[i].x:=ryby[i].x-1;
end;
end;
delay(250);
clrscr;
{vypisovanie na poziciach}
for i:=1 to pocet do begin
goToXy(ryby[i].x, ryby[i].y);
write(ryby[i].znak);
end;
{rozmnozenie/zozranie}
xpom:=ryby[1].x;
ypom:=ryby[1].y;
for i:=2 to pocet do begin
if xpom=ryby[i].x then begin
if ypom=ryby[i].y then begin
cin:=random(2)+1;
if cin=1 then begin
pomocna:=pocet+1;
end;
if cin=2 then begin
pomocna:=pocet-1;
end;
test:=true;
end;
end;
end;
{vytvorenie novych ryb}
for i:=pocet to pomocna do begin
ryby[i].znak:='*';
ryby[i].smer:=random(4);
ryby[i].x:=random(40);
ryby[i].y:=random(40);
end;
{testovanie ci prebehlo rozmnozenie/zozranie}
if test=true then begin
pocet:=pomocna;
test:=false;
end;
{zmena smeru}
for i:=1 to pocet do begin
ryby[i].smer:=random(4);
end;
until keypressed;
end.
robíš dve chyby
1) ak si to aj print screenuješ, nič nezistíš. Ich počet či miznú alebo sa tvoria si vedieš iba v premennej počet. Neničíš alebo nevytváraš nové skutočne (čo by bolo aj dosť náročné, musel by si to prerobiť objektovo alebo dynamicky spraviť to pole). Čiže to či sa rodia/umierajú zistíš iba vypísaním premennej pocet
2) porovnávaš iba prvú rybu s ostatnými n-1. Tieto ostatné navzájom už neporovnávaš.
takze prerobil som to takto nieako(editnuty prvy prispevok), stale neviem prist na to ako spravit to aby to porovnalo aj s inymi ale obcas sa mi stane taka vec ked spustim program ze niekto * sa ako keby spoja a teraz on ich pise aj 2,3,4 vedla seba, v com to moze byt?
program projekt;
uses crt;
type pos=record
x:integer;
y:integer;
znak:char;
smer:integer;
end;
var ryby:array[1..100] of pos;
i,pocet,xpom,ypom,cin,pomocna,j:integer;
test:boolean;
begin
clrscr;
randomize;
test:=false;
pocet:=5;
{priradovanie znakov, pozicie, smeru}
for i:=1 to pocet do begin
ryby[i].znak:='*';
ryby[i].x:=random(40);
ryby[i].y:=random(40);
ryby[i].smer:=random(4);
end;
{vypisovanie na poziciach}
for i:=1 to pocet do begin
goToXy(ryby[i].x, ryby[i].y);
write(ryby[i].znak);
end;
repeat
{pohyby}
for i:=1 to pocet do begin
{pohyb smerom hore}
if ryby[i].smer=0 then begin
if ryby[i].y=0 then ryby[i].y:=1 else ryby[i].y:=ryby[i].y-1;
end;
{pohyb smerom dole}
if ryby[i].smer=1 then begin
if ryby[i].y=40 then ryby[i].y:=39 else ryby[i].y:=ryby[i].y+1;
end;
{pohyb smerom vpravo}
if ryby[i].smer=2 then begin
if ryby[i].x=40 then ryby[i].x:=39 else ryby[i].x:=ryby[i].x+1;
end;
{pohyb smerom vlavo}
if ryby[i].smer=3 then begin
if ryby[i].x=0 then ryby[i].x:=1 else ryby[i].x:=ryby[i].x-1;
end;
end;
delay(250);
clrscr;
{vypisovanie na poziciach}
for i:=1 to pocet do begin
goToXy(ryby[i].x, ryby[i].y);
write(ryby[i].znak);
end;
{rozmnozenie/zozranie}
for i:=1 to pocet do begin
for j:=1 to pocet do begin
if i<>j then begin
if ryby[i].x=ryby[j].x then begin
if ryby[i].y=ryby[j].y then begin
cin:=random(2)+1;
if cin=1 then begin
pomocna:=pocet+1;
end;
if cin=2 then begin
pomocna:=pocet-1;
end;
end;
end;
test:=true;
end;
end;
end;
{vytvorenie novych ryb}
if pocet<pomocna then begin
for i:=pocet to pomocna do begin
ryby[i].znak:='*';
ryby[i].smer:=random(4);
ryby[i].x:=random(40);
ryby[i].y:=random(40);
end;
end;
if pocet>pomocna then begin
for i:=pomocna downto pocet do begin
ryby[i].znak:='*';
ryby[i].smer:=random(4);
ryby[i].x:=random(40);
ryby[i].y:=random(40);
end;
end;
{testovanie ci prebehlo rozmnozenie/zozranie}
if test=true then begin
pocet:=pomocna;
test:=false;
end;
{zmena smeru}
for i:=1 to pocet do begin
ryby[i].smer:=random(4);
end;
until keypressed;
end.
ryby prejdu 2 kroky a obraz skonci, Black screen uz len dalej ,uz ma to zacina stvat...
EDIT: prerobil som riadok s vytvaranim novych ryb, zistil som ze tam moze nastat crash ak je pomocna mensia ako pocet
program projekt;
uses crt;
type pos=record
x:integer;
y:integer;
znak:char;
smer:integer;
end;
var ryby:array[1..100] of pos;
i,pocet,xpom,ypom,cin,pomocna,j:integer;
test:boolean;
begin
clrscr;
randomize;
test:=false;
pocet:=5;
{priradovanie znakov, pozicie, smeru}
for i:=1 to pocet do begin
ryby[i].znak:='*';
ryby[i].x:=random(40);
ryby[i].y:=random(40);
ryby[i].smer:=random(4);
end;
{vypisovanie na poziciach}
for i:=1 to pocet do begin
goToXy(ryby[i].x, ryby[i].y);
write(ryby[i].znak);
end;
repeat
{pohyby}
for i:=1 to pocet do begin
{pohyb smerom hore}
if ryby[i].smer=0 then begin
if ryby[i].y=0 then ryby[i].y:=1 else ryby[i].y:=ryby[i].y-1;
end;
{pohyb smerom dole}
if ryby[i].smer=1 then begin
if ryby[i].y=40 then ryby[i].y:=39 else ryby[i].y:=ryby[i].y+1;
end;
{pohyb smerom vpravo}
if ryby[i].smer=2 then begin
if ryby[i].x=40 then ryby[i].x:=39 else ryby[i].x:=ryby[i].x+1;
end;
{pohyb smerom vlavo}
if ryby[i].smer=3 then begin
if ryby[i].x=0 then ryby[i].x:=1 else ryby[i].x:=ryby[i].x-1;
end;
end;
delay(250);
clrscr;
{vypisovanie na poziciach}
for i:=1 to pocet do begin
goToXy(ryby[i].x, ryby[i].y);
write(ryby[i].znak);
end;
{rozmnozenie/zozranie}
pomocna:=0;
for i:=1 to pocet do begin
for j:=1 to pocet do begin
if i<>j then begin
if (ryby[i].x=ryby[j].x) and (ryby[i].y=ryby[j].y) then begin
cin:=random(2)+1;
if cin=1 then begin
pomocna:=pocet+1;
end;
if cin=2 then begin
pomocna:=pocet-1;
end;
end;
end;
end;
end;
for i:=1 to pocet+pomocna do ryby[i].znak:='*';
for i:=pocet+pomocna to pocet do ryby[i].znak:=' ';
pocet:=pocet+pomocna;
for i:=1 to pocet do begin
ryby[i].smer:=random(4);
ryby[i].x:=random(40);
ryby[i].y:=random(40);
end;
{testovanie ci prebehlo rozmnozenie/zozranie}
{zmena smeru}
for i:=1 to pocet do begin
ryby[i].smer:=random(4);
end;
until keypressed;
end.
Nechcem sa vam tu do toho miesat, lebo ten program velmi nechapem Ale -=wolf=-: mozes tam pridat proceduru pre skrytie kurzora (len pre krasu, verim tomu ze spolu s audiotrackom prgm urcite zvladnete )
kurzor ma zaujima najmenej, jedine o co mi ide je aby program fungoval
2audiotrack: mas to pekne spravene, konecne sa uz tie ryby pohynaju dookola nie len 1 ci 2 krat ale problem je ten ze zadam napriklad pocet 5 a ta 5. urobi tusim 1 krok a potom je zrazu cierna a mam uz len 4, aktualne ten program vyzera takto:
program projekt;
uses crt;
type pos=record
x:integer;
y:integer;
znak:char;
smer:integer;
end;
var ryby:array[1..100] of pos;
i,pocet,xpom,ypom,cin,pomocna,j:integer;
test:boolean;
begin
clrscr;
randomize;
pomocna:=0;
test:=false;
pocet:=5;
{priradovanie znakov, pozicie, smeru}
for i:=1 to pocet do begin
ryby[i].znak:='*';
ryby[i].x:=random(40);
ryby[i].y:=random(40);
ryby[i].smer:=random(4);
end;
{vypisovanie na poziciach}
for i:=1 to pocet do begin
goToXy(ryby[i].x, ryby[i].y);
write(ryby[i].znak);
end;
repeat
{pohyby}
for i:=1 to pocet do begin
{pohyb smerom hore}
if ryby[i].smer=0 then begin
if ryby[i].y=0 then ryby[i].y:=1 else ryby[i].y:=ryby[i].y-1;
end;
{pohyb smerom dole}
if ryby[i].smer=1 then begin
if ryby[i].y=40 then ryby[i].y:=39 else ryby[i].y:=ryby[i].y+1;
end;
{pohyb smerom vpravo}
if ryby[i].smer=2 then begin
if ryby[i].x=40 then ryby[i].x:=39 else ryby[i].x:=ryby[i].x+1;
end;
{pohyb smerom vlavo}
if ryby[i].smer=3 then begin
if ryby[i].x=0 then ryby[i].x:=1 else ryby[i].x:=ryby[i].x-1;
end;
end;
delay(250);
clrscr;
{vypisovanie na poziciach}
for i:=1 to pocet do begin
goToXy(ryby[i].x, ryby[i].y);
write(ryby[i].znak);
end;
{rozmnozenie/zozranie}
for i:=1 to pocet do begin
for j:=1 to pocet do begin
if i<>j then begin
if (ryby[i].x=ryby[i+j].x) and (ryby[i].y=ryby[i+j].y) then begin
cin:=random(2)+1;
if cin=1 then begin
pomocna:=pomocna+1;
end;
if cin=2 then begin
pomocna:=pomocna-1;
end;
end;
test:=true;
end;
end;
end;
{vytvorenie novych ryb}
for i:=1 to pocet+pomocna do begin
ryby[i].znak:='*';
end;
for i:=pocet+pomocna to pocet do begin
ryby[i].znak:=' ';
end;
for i:=pocet to pocet+pomocna do begin
ryby[i].x:=random(40);
ryby[i].y:=random(40);
end;
pocet:=pocet+pomocna;
{testovanie ci prebehlo rozmnozenie/zozranie}
{zmena smeru}
for i:=1 to pocet do begin
ryby[i].smer:=random(4);
end;
until keypressed;
end.
Nechce sa mi to pozerať celé, ale všimol som si, že tam nijako neriešiš prípad, že obe ryby sú v rozmedzí 1 .. počet a jedna z nich bola zožraná. Síce tam meníš počet tých rýb, ale zo zoznamu neodstraňuješ tú, ktorú odstrániť máš (ale tie, čo sú na konci).
PS: Možno by si tam mohol použiť funkcie a case, bolo by to prehľadnejšie.