Akvarium v pascale(doladenie chyb)

Programovacie jazyky, rady, poradňa...
metthal
Guru wannabe
Guru wannabe
Používateľov profilový obrázok
Príspevky: 2475
Registrovaný: 26 jan 2006, 18:32
Bydlisko: Nitra / Brno

Akvarium v pascale(doladenie chyb)

Príspevok od používateľa metthal »

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

Kód: Vybrať všetko

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.
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Príspevok od používateľa audiotrack »

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š.
metthal
Guru wannabe
Guru wannabe
Používateľov profilový obrázok
Príspevky: 2475
Registrovaný: 26 jan 2006, 18:32
Bydlisko: Nitra / Brno

Príspevok od používateľa metthal »

teraz ked si mi to povedal tak mi to uz dava zmysel, diky moc, K+, ja sa to pokusim prerobit

EDIT: pls ako spravim nieco ako porovnanie vsetkych dohromady? to je milion podmienok nie?
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Príspevok od používateľa audiotrack »

podmienok bude rovnaký počet ako teraz, len tam bude o jeden cyklus viac
metthal
Guru wannabe
Guru wannabe
Používateľov profilový obrázok
Príspevky: 2475
Registrovaný: 26 jan 2006, 18:32
Bydlisko: Nitra / Brno

Príspevok od používateľa metthal »

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?
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Príspevok od používateľa audiotrack »

chcel by si odo mňa vela aby som si pamätal ako to bolo pred editovaním, tak si fakt nepamätám čo si tam zmenil :)
k tomu cyklu, skús nejak takto:

Kód: Vybrať všetko

   for i:=1 to pocet do begin
      for j:=1 to pocet do begin
         if i<>j then begin
           //tu porovnavas obe suradnice ryb: ryby[i] a ryby[j]
         end;
      end;
   end;
samozrejme zmiznú ti aj riadky xpom:=ryby[1].x; a ypom:=ryby[1].y;

to zgrupovanie rýb či čo si to písal nejak neviem čo myslíš. Skús to viac opísať, prípadne mi hoď obr.
metthal
Guru wannabe
Guru wannabe
Používateľov profilový obrázok
Príspevky: 2475
Registrovaný: 26 jan 2006, 18:32
Bydlisko: Nitra / Brno

Príspevok od používateľa metthal »

prerobene na nasledovny sposob:

Kód: Vybrať všetko

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
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Príspevok od používateľa audiotrack »

skús takto:

Kód: Vybrať všetko

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.
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Príspevok od používateľa BX »

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 :))

Kód: Vybrať všetko

procedure hide;
var reg:registers;
begin
       reg.ah:=1;
       reg.ch:=32;
       intr($10,reg);
end;
Ak to poznas tak prepacte za spam...

// OK to bol len pokus :)
metthal
Guru wannabe
Guru wannabe
Používateľov profilový obrázok
Príspevky: 2475
Registrovaný: 26 jan 2006, 18:32
Bydlisko: Nitra / Brno

Príspevok od používateľa metthal »

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:

Kód: Vybrať všetko

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.
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Príspevok od používateľa audiotrack »

ja som tam mal nastavenie pomocnej na nulu pred rátaním, tebe to niekde zmizlo ( pomocna:=0; )
metthal
Guru wannabe
Guru wannabe
Používateľov profilový obrázok
Príspevky: 2475
Registrovaný: 26 jan 2006, 18:32
Bydlisko: Nitra / Brno

Príspevok od používateľa metthal »

je to asi 3 riadky pod beginom :lol: tam to asi nema byt co? :lol:

EDIT: upravil som to a stale su 4.. tam je error niekde inde
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Príspevok od používateľa audiotrack »

môže, nevšimol som si to
metthal
Guru wannabe
Guru wannabe
Používateľov profilový obrázok
Príspevky: 2475
Registrovaný: 26 jan 2006, 18:32
Bydlisko: Nitra / Brno

Príspevok od používateľa metthal »

audiotrack pls nenapada ta nieco? lebo mne uz dosli napady, urobil som max co som mohol, dalej uz moje skusenosti s pascalom nesahaju...
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Príspevok od používateľa chrono »

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.
metthal
Guru wannabe
Guru wannabe
Používateľov profilový obrázok
Príspevky: 2475
Registrovaný: 26 jan 2006, 18:32
Bydlisko: Nitra / Brno

Príspevok od používateľa metthal »

funkcie sme sa este neucili, akurat sme si ich spominali ale robili sme zatial iba procedure a case v neviem akom zmysle ho mam pouzit...

BTW: uz to ani nerieste lebo prave som to odozvdal, dostal som 1 a je to:D
Napísať odpoveď