Auto ktore prejde na semafor-pascal
Auto ktore prejde na semafor-pascal
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
- Príspevky: 38514
- Registrovaný: 24 apr 2004, 18:29
- Bydlisko: Európa
- Kontaktovať používateľa:
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.
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.
pohraj sa s tym
-
audiotrack
VIP
- Príspevky: 25958
- Registrovaný: 09 sep 2005, 18:39
- Kontaktovať používateľa:
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íš?boarderpp napísal:pocuj nemozholby si mi to tu hodit na rar lebo nemam doma pascal ze ako to je plsinac dik
ahoj
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)
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.htmlRe: ahoj
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
Takže som špeciálne kvôli tebe spustil Windows a Pascal.Gregi napísal:Inak, ak by sa tam dalo cosi zlepsit, prosim napiste mi co a akoNech sa cosi i priucim od mistrov
(dost mam rad minimalizaciu, tak poradte kde ubrat bajtiky)
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í
Ahoj
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
. 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:
Tu je PAS po uprave:
- Prílohy
-
- S1.rar
- Semafor < 20 kB
- (729 Bajtov) 81 stiahnutí
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;Ja
Tak som to tam doplnil a vyslo to: 19360 B po kompilacii
.
Tisicere diky. Nemas este cosi v kapse ako to minimalizovat?
Avsak toto stale neviem pochopit "Port[$03DA] and 8" 
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.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
]
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
ahoj
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?)
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 ...