Auto ktore prejde na semafor-pascal

Programovacie jazyky, rady, poradňa...
boarderpp
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 321
Registrovaný: 25 jan 2006, 10:16
Bydlisko: Poprad

Auto ktore prejde na semafor-pascal

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

Potreboval by som v pascale jednoduchy niejaky nakres akoze auto aktore zastane pri semafore a ked sa na semafore zapali svedlo tak auto prejde, alebo nieco take neviem :? dopredu dakujem
hojko
Site Admin
Site Admin
Používateľov profilový obrázok
Príspevky: 38514
Registrovaný: 24 apr 2004, 18:29
Bydlisko: Európa
Kontaktovať používateľa:

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

Chces algoritmus alebo script??? Lebo pokial ide o algoritmus, tak len jednoducha podmienka. Pokial ide o script, tak by som to riesil len v textovom rezime, v tom by som si spravil krizovatku a pomocou gotoxy + write by som znazornil auto. Jeho body by som nasledne prekry ciernou farbou a posunul ho o 1 bod dalej.
boarderpp
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 321
Registrovaný: 25 jan 2006, 10:16
Bydlisko: Poprad

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

ja som skor myslel ze mi to niekto spavi :?
hojko
Site Admin
Site Admin
Používateľov profilový obrázok
Príspevky: 38514
Registrovaný: 24 apr 2004, 18:29
Bydlisko: Európa
Kontaktovať používateľa:

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

Pascal som nevidel par rokov a tak by mi to trochu trvalo, ale myslim, ze to nie je nic zlozite a je to robota na 10 minut.
snake2
Medium Professional
Medium Professional
Príspevky: 1211
Registrovaný: 01 mar 2006, 20:27

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

Kód: Vybrať všetko

uses crt,graph;
var m,d,i,a :integer;        {ak pouzivas DEV-pascal, tak d a m su typu "smallint"}
    z: byte;

procedure auto(k,j:integer);
  begin
    circle(k-20,j,20);
    circle(k-20,j,15);
    circle(k-150,j,20);
    circle(k-150,j,15);
    arc(k-150,j,0,180,30);
    arc(k-20,j,0,180,30);
    line(k-120,j,k-50,j);
    ellipse(k-100,j-25,15,160,60,50);
    ellipse(k-100,j-25,10,170,50,40);
    rectangle(k-102,j-32,k-98,j-65);
    line(k-150,j-32,k-50,j-32);
    ellipse(k-40,j-8,0,91,50,30);
    ellipse(k-150,j-8,100,180,30,35);
  end;

procedure zelena;
begin
 rectangle(400,150,450,250); setfillstyle(1,2);
 setcolor(2); ellipse(425,168,0,360,13,13);
 floodfill(425,168,2);
 setcolor(15);
 ellipse(425,197,0,360,13,13);
 ellipse(425,228,0,360,13,13);
end;

procedure oranzova;
begin
 setcolor(15);
 rectangle(400,150,450,250);
 ellipse(425,168,0,360,13,13);
 setfillstyle(1,14); setcolor(14);
 ellipse(425,197,0,360,13,13);
 floodfill(425,197,14);
 setcolor(15);
 ellipse(425,228,0,360,13,13);
end;

procedure cervena;
begin
 setcolor(15);
 rectangle(400,150,450,250);
 ellipse(425,168,0,360,13,13);
 ellipse(425,197,0,360,13,13);
 setcolor(12);
 ellipse(425,228,0,360,13,13);
 setfillstyle(1,12);
 floodfill(425,228,12);
 setcolor(15);
end;
begin


 setcolor(15);
 z:=1;
 clrscr;
 initgraph(d,m,'cesta k egavga.bgi');
 i:=-80;
 randomize;
  repeat
   clrscr;
   cleardevice;                                
   z:=random(4);
   a:=i;
   if a>770 then repeat
                  a:=a-770;
                 until a<770;
   line(0,420,640,420);
   auto(a,400);
   case z of
    1 : zelena;
    2 : oranzova;
    3 : cervena;
    end;
   i:=i+10;
  until i=400;
  if z=1 then begin outtextXY(500,150,'POKRACUJ !!!'); zelena; end
         else if z=2 then begin outtextXY(500,150,'POZOR !!!'); oranzova; end
                     else begin outtextXY(500,150,'STOJ !!!'); cervena; end;



  readkey;
end.
tu mas nieco, co som robil velmi davno a teraz by som to uplne inak riesil.. najhorsie asi na tom je to, ze to je robene cez "cleardevice" ( po kazdom kroku sa vymaze obrazofka a animacne to potom moc dobre nevypada . Skus to sspravit cez GETimage a PUTimage ..

pohraj sa s tym :D
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 »

A namiesto Elipse+FloodFill použi radšej FillElipse.
boarderpp
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 321
Registrovaný: 25 jan 2006, 10:16
Bydlisko: Poprad

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

pocuj nemozholby si mi to tu hodit na rar lebo nemam doma pascal ze ako to je pls :) inac dik
boarderpp
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 321
Registrovaný: 25 jan 2006, 10:16
Bydlisko: Poprad

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

ludia nemozte mi stym pomoct???
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 »

boarderpp napísal:pocuj nemozholby si mi to tu hodit na rar lebo nemam doma pascal ze ako to je pls :) inac dik
nemáš ani len ten poondiaty pascal nahodený a prídeš sem drzo pýtať nech ti to niekto spravi. Dostaneš napísaný zdroják, ešte je ti málo a chceš exe. Potrebuješ to ty a nie my, tak by si si aspoň ten pascal mohol stiahnúť čo ma jedno mega a zkompilovať to sám, nemyslíš? :evil:
boarderpp
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 321
Registrovaný: 25 jan 2006, 10:16
Bydlisko: Poprad

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

mam pascal len clovek co to napise som myslel ze to ma aj ako save v pascale a to by nebol problem poslat
Gregi
Light Star
Light Star
Príspevky: 224
Registrovaný: 24 mar 2005, 11:34

ahoj

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

Tak som cosi spachal:
do riadku: InitGraph (Gd, Gm, ''); musis medzi uvodzovky napisat (ak to nemas prednastavene v PASCALe) celu cestu k suboru egavga.bgi. Inak Ti to nepojde zkompilovat. Ostatne je klasika.
Tak tu to je i s EXE (ten nakopiruj do adresara i s egavga.bgi a spustis to)

Kód: Vybrať všetko

http://muj.edisk.cz/soubor/stahni/58636/semafor.zip_19.75kB.html
boarderpp
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 321
Registrovaný: 25 jan 2006, 10:16
Bydlisko: Poprad

Re: ahoj

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

Gregi napísal:Tak som cosi spachal:
do riadku: InitGraph (Gd, Gm, ''); musis medzi uvodzovky napisat (ak to nemas prednastavene v PASCALe) celu cestu k suboru egavga.bgi. Inak Ti to nepojde zkompilovat. Ostatne je klasika.
Tak tu to je i s EXE (ten nakopiruj do adresara i s egavga.bgi a spustis to)

Kód: Vybrať všetko

http://muj.edisk.cz/soubor/stahni/58636/semafor.zip_19.75kB.html

Neeeem tak to ti feest dakujem je to viac nez guuuut dik :D
Gregi
Light Star
Light Star
Príspevky: 224
Registrovaný: 24 mar 2005, 11:34

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

Inak, ak by sa tam dalo cosi zlepsit, prosim napiste mi co a ako ;-) Nech sa cosi i priucim od mistrov :wink: (dost mam rad minimalizaciu, tak poradte kde ubrat bajtiky)
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 »

Gregi napísal:Inak, ak by sa tam dalo cosi zlepsit, prosim napiste mi co a ako ;-) Nech sa cosi i priucim od mistrov :wink: (dost mam rad minimalizaciu, tak poradte kde ubrat bajtiky)
Takže som špeciálne kvôli tebe spustil Windows a Pascal. :wink:
Tie GetImage a PutImage funkcie sú tam podľa mňa zbytočné. Boli by rozumné v prípade, že by to auto prekrývalo nejaké pozadie. V tom tvojom programe prekrýva iba čiernu plochu, takže kľudne stačí aj prekreslenie tej plochy na čierno.
Možno si to použil kvôli blikaniu pri prekreslovaní. Ale blikanie je zvyčajne v takýchto programoch spôsobené tým, že sa zmeny na obrazovke robia súčasne s tým, ako sa na monitore prekresľuje.
Jediné riešenie je, počkať si na Vertical Retrace (teda čas, kedy sa lúč v obrazovke iba presúva a nič nevykresluje). Pozri si program semafor.pas
Ten druhý je ešte mierne upravený tak, aby auto postupne zrýchľovalo.
Prílohy
semafor.rar
(1.27 KiB) 92 stiahnutí
Gregi
Light Star
Light Star
Príspevky: 224
Registrovaný: 24 mar 2005, 11:34

Ahoj

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

Tak som si pozrel to tvoje riesenie a hovrim, ze je velmi pekne a elegantne. Avsak akosi tomu nerozumiem. No dalo by sa tam vylepsit urcite este par veci. Niektore som si dovolil urobit a celkovo mi to uz vychadza pod 20 kB :wink: . Kvoli DELAY sa musi stale pouzit jednotka CRT, ktoru tam samozrejme nechcem a tak som to i dal. Este to tak dajako nahradit napr. asm prerusenim na x cyklov. ALe to tiez nemam tusenia, ako :( Nevedel by si mi poradit este s tymto?
Tu je PAS po uprave:
Prílohy
S1.rar
Semafor &lt; 20 kB
(729 Bajtov) 81 stiahnutí
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 »

Urob nejakú takúto funkciu (ak chceš, aby bol vstup ako pri delay budeš musieť tú konštantu ktorou sa delí upraviť)

Kód: Vybrať všetko

procedure WDelay(t: Integer);
var
  i: Integer;
  
begin
	for i := to (t div 50 ) do begin
		WaitNextRetrace;
	end;
end;
Gregi
Light Star
Light Star
Príspevky: 224
Registrovaný: 24 mar 2005, 11:34

Ja

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

Tak som to tam doplnil a vyslo to: 19360 B po kompilacii :) .
Tisicere diky. Nemas este cosi v kapse ako to minimalizovat? ;-)

Kód: Vybrať všetko

program SEMAFOR;
uses Graph;
var
  a, i, j, x, Gd, Gm: Integer;

const
  farba: array [0..11] of Byte = (4,6,2,
                                  12,6,2,
                                  12,14,2,
                                  4,6,10);

procedure Pozadie;
begin
  SetColor (6);
  Bar (0,400,640,420);
  MoveTo (0,400);
  LineTo (640,400);
end;

procedure Auto(x: Integer);
begin
  SetFillStyle (1,15);
  MoveTo (x,390);
  LineRel (0,-40);
  LineRel (40,-5);
  LineRel (10,-30);
  LineRel (100,0);
  LineRel (30,30);
  LineRel (50,7);
  LineRel (10,10);
  LineRel (5,28);
  LineRel (-245,0);
  MoveTo (x+60,390);
  LineTo (x+170,390);
  FillEllipse (x+40,380,20,20);
  FillEllipse (x+190,380,20,20);
end;

procedure WaitNextRetrace;
begin
  repeat until (Port[$03DA] and 8)=0;
  repeat until (Port[$03DA] and 8)<>0;
end;

procedure Wdelay (t: Integer);
var k: Integer;
begin
  for k:=0 to (t div 40) do WaitNextRetrace
end;

BEGIN
  Gd:=Detect;
{$I-}
  InitGraph (Gd,Gm,'');
{$I+}
  ClearDevice;
  Pozadie;
  Auto (x);
  Bar (500,0,640,300);
  for i:=0 to 3 do begin
    Wdelay (2500);
    for j:=0 to 2 do begin
      SetFillStyle (1,farba[i*3+j]);
      FillEllipse (570,50+j*100,45,45);
    end;
  end;
  while x<640 do begin
    Auto (x);
    WaitNextRetrace;
    SetFillStyle (1,0);
    Bar (x,315,x+245,399);
    x:=x+a div 16;
    inc (a);
    if (a>80) then a:=80;
  end;
  ReadLn;

END.
Avsak toto stale neviem pochopit "Port[$03DA] and 8" :cry:
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 »

Akú verziu Pascalu používaš ? Lebo keď som skompiloval tú tvoju prvú verziu, tak bol môj výsledný súbor menší ako tvoj (ale to môže byť aj nastaveniami pri kompilovaní).

Ten port $03DA je na grafickej karte. Tretí bit určuje, či karta vo vertikálnom zatemnení (ak je 1) alebo sa obsah obrazovky vykresluje (0). Skús si nájsť nejaké informácie o EGA/VGA kartách na internete.

Funguje to tak (tá funkcia), že sa číta ten port z grafickej karty. Ak je tretí bit 1, tak sa monitor nachádza vo vertikálnom zatemnení (a nič sa nezobrazuje). Počkáme kým sa niečo zobrazovať začne (to je ten prvý cyklus repeat until). Potom počkáme na ďalšie v-blank (to je ten druhý cyklus). Keby sme nepočkali na zobrazovanie, mohlo by sa stať (a na dnešných počítačoch by sa to kvôli ich rýchlosti stávalo), že v prípade, že by tam bolo iba čakanie na v-blank, tak by sa mohlo počas jedného zatemnenia zobraziť aj viac snímkov (to preto, že po zobrazení jedného, by sa obrazovka ešte stále nachádzala vo vertikálnom zatemnení). Preto po každom zobrazení počkáme, kým sa obrazovka prekreslí a zastaneme až na nasledujúcom zatemnení (takže počkáme jeden celý snímok).
[ale na internete nájdeš aj obsiahlejšie a presnejšie vysvetlenia :) ]
Gregi
Light Star
Light Star
Príspevky: 224
Registrovaný: 24 mar 2005, 11:34

ahoj

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

Ahoj.
Tak ja som na toto pouzil Turbo Pascal 7.0 (Dos). Inak skusim sa pohrat s nastaveniami pre kompilaciu, ale neviem co by to mohlo byt.
Za vysvetlenie dakujem a konecne som to pochopil. A hlavne ten port ... ;-) To and je ale stvrty bit (8 - 00001000). Tak teraz neviem. Ale to uz si dohladam. Este raz dakujem. A nevies este o dajakej tej minimalizacii? (inak na kolko to zkompilovalo Tebe?)
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 »

Máš pravdu, je to štvrtý (ja som to počítal od nultého bitu [to vieš, C]). :)
Napísať odpoveď