[program]Tutorial Pascal - Lectia 5 - Starfield

[program]Tutorial Pascal - Lectia 5 - Starfield

Postby DarkByte » 27 Jan 2010, 01:15

Program exemplu - Star Field


Lectia 5 (din tutorialele de Pascal)


Acesta este un exemplu de (mic) program care arata o parte din potentialul primelor cinci tutoriale de Pascal postate pana in acest moment.

Creat si testat doar pe Borland Pascal 7.0, deci sa nu va aud ;))

Urmeaza codul:
  1. uses crt, graph;
  2. type star = record
  3.               X, Y, Z: Integer;
  4.               { pozitia si departarea "stelei" }
  5.             end;
  6.  
  7. const N = 250; {numarul de "stele"}
  8.  
  9. var gd, gm: Integer; {init graphics mode}
  10.     i, Sx, Sy: integer;
  11.     stars: array[1 .. N] of star;
  12.  
  13.   procedure InitStars; {initializeaza "N" stele : pozitie si departare}
  14.   var i: Integer;
  15.   begin
  16.     Sx := GetMaxX; {numarul de coloane in modul grafic}
  17.     Sy := GetMaxY; {numarul de linii in modul grafic}
  18.  
  19.     Randomize;
  20.     for i := 1 to N do
  21.       begin
  22.         stars[i].X := Random(Sx - 9) + 5; {pozitia}
  23.         stars[i].Y := Random(Sy - 9) + 5;
  24.         stars[i].Z := Random(250) + 1;    {departarea trebuie sa fie}
  25.       end;                                {cat mai aleatorie la inceput}
  26.   end;
  27.  
  28.   procedure MoveStars;
  29.   var i, X, Y, Z: Integer;
  30.       color, speed: Byte;
  31.       pause: Boolean;
  32.   begin
  33.     pause := False;
  34.     speed := 5;
  35.     repeat {bucla infinita ... este oprita daca se apasa tasta Escape}
  36.       if not pause then
  37.       for i := 1 to N do
  38.         begin
  39.           X := round((stars[i].X * 256) / stars[i].Z) + Sx shr 1; {calcularea pozitiei unei stele, in functie de Z (adancime)}
  40.           Y := round((stars[i].Y * 256) / stars[i].Z) + Sy shr 1; {shr 1 = div 2. Shift pe biti catre dreapta, adica impartire intreaga la 2}
  41.           SetColor(Black);
  42.           Rectangle(X, Y, X+1, Y+2);
  43.  
  44.           if (X < 2) or (X > Sx - 2) or {daca "steaua" iese din monitor,}
  45.              (Y < 2) or (Y > Sy - 2) or {ii schimbam pozitia si departarea}
  46.              (stars[i].Z < 10) then
  47.             begin
  48.               stars[i].X := Random(Sx - 9) + 5;
  49.               stars[i].Y := Random(Sy - 9) + 5;
  50.               stars[i].Z := Random(20) + 230; {departarea trebuie sa fie maxima}
  51.             end;
  52.           Dec(stars[i].Z);
  53.  
  54.           X := Round((stars[i].X * 256) / stars[i].Z) + Sx shr 1; {noua coloana a "stelei"}
  55.           Y := Round((stars[i].Y * 256) / stars[i].Z) + Sy shr 1; {noua linie a "stelei"}
  56.  
  57.           case (stars[i].Z div 3) of  {cu cat "steaua" e mai departata,}
  58.             65: color := DarkGray;    {cu atat e mai inchisa la culoare}
  59.             35: color := LightGray;
  60.             20: color := White;
  61.           end;
  62.  
  63.           SetColor(color);
  64.           if stars[i].Z > 120
  65.             then PutPixel(X, Y, color)     {cu cat e mai aproape steaua,}
  66.             else Rectangle(X, Y, X+1, Y+1) {cu atat e mai mare}
  67.         end;
  68.  
  69.       if KeyPressed then
  70.         begin
  71.           case UpCase(ReadKey) of
  72.             #27 : Break;               {s-a apasat Escape, asa ca iesim}
  73.             'P' : pause := not pause;  {s-a apasat P, punem pauza - sau o scoatem}
  74.             '+' : if (speed > 1) then  {plus - crestem viteza}
  75.                     dec(speed);
  76.             '-' : if (speed < 80) then {minus - scadem viteza}
  77.                     inc(speed);
  78.           end;
  79.         end;
  80.  
  81.       Delay(speed);
  82.     until False;
  83.   end;
  84.  
  85. begin
  86.   gd := 0;
  87.   InitGraph(gd, gm, '');
  88.  
  89.   InitStars;
  90.   MoveStars;
  91.  
  92.   CloseGraph;
  93. end.


Functiile si procedurile legate de afisare le voi explica intr-un tutorial separat.

Screenshot din timpul rularii programului:
pascal star field graph




Surse si executabil (fisierul EGAVGA.BGI inclus !)-

Atentie: Daca folositi Windows Vista sau Windows Seven, cititi acest articol despre DOSBox.

6 points / 2 votes
Image

If you can't learn to do something well, learn to enjoy doing it poorly !
User avatar
DarkByte
Admin
 
Joined: 29 Dec 2009
Points: 71

Re: [program]Tutorial Pascal - Lectia 5 - Starfield

Postby nutzu2010 » 27 Feb 2010, 23:44

asta e chiar misto..sper sa fac si eu asa ceva peste cativa ani...

0,0 points / 0 votes
nutzu2010
Bit
 
Joined: 27 Feb 2010
Points: 0


Return to Tutoriale Pascal

Who is online

Users browsing this forum: No registered users and 0 guests

cron