{

                      A Darázs-modell szimulációja.

  Programspecifikáció:

    Input:

        paraméterek - N darázs-szám

                      K az 1. dobozban levő darazsak száma (a többi a 2.-ban)

        tájékoztató file sorokra tördelve

        beavatkozás - billentyžkkel (nagy és kisbetžk nem különböznek)

                      'c' = csendes üzemmód;      'n' = normál  üzemmód;

                      'l' = lépésenkénti üzemmód; 'v' = vége

    Output:

        karakteres képernyőn = tájékoztató lapozott szövege

        grafikus képernyőn   = eseménytér (a két doboz a bennük levő

                               darazsakkal)

                               grafikonablakok:

                               1. Eloszlás   (az 1. dobozban relatíve

                                  hányszor volt 0, 1, ... db darázs)

                               2. Idődiagram (az 1. dobozban levő darazsak

                                  száma a 0., az 1., ... időegységben; ill.

                                  az utolsó valahány időegységben)

}

Program Szimulacio;

 

{ -------------------------------------------------------------------------

        Szimulációs program. (A fizikai... szimulációhoz.)

 

        Keretprogram.

  ------------------------------------------------------------------------- }

  Uses

       Newdelay,Crt,Graph;

  Const

      MaxDB    = 140;

      MaxDb2   =  12; {~sqrt(MaxDb)}

  Type

      TKepModok  =(Grafikus,Szoveges);

      TUzemModok =(Normal,Lepesenkenti,Csendes,Vege);

      THisztAblak= Record

                     bfx, bfy, jax, jay : Word;

                     cim                : String[32];

                     adatok             : Array [0..MaxDB] of Word;

                     adatdb             : Word;

                     leptek             : Real;

                   End;

 

  Const

      Fejlec = ' Szimuláció '; FejHossz = Length(Fejlec);

      HelpSor= ' V/v: vége , L/l: lépésenként , N/n: normál , C/c: csendes ';

      Path   = 'c:\langs\tp7\bgi\';

  Var

      KepMod  : TKepModok;

      UzemMod : TUzemModok;

      Graf1,

      Graf2   : THisztAblak;

        {Szimulációs adatok: paraméterek, reprezentáció...}

      T       : Integer;

      N, K    : Integer;

      Darazs  : Array [1..MaxDB] of Record

                                      doboz    :1..2;

                                      holX,holY: Word

                                    End;

      darazsMaxX,

      darazsMaxY,

      darazsMeret: Word;

      dobozTerkep: Array [1..2,1..MaxDb2,1..MaxDb2] of (Szabad,Foglalt);

      darazsKep  : Array [1..4000] of Byte;

      buf : Array [1..30000] of byte; {Képernyőmentéshez.

                                       Csak globálisan lehet ekkora adatot

                                       tárolni a STACK OVERFLOW hiba nélkül}

 

    {Ablakok, grafikonok kezelése: -----------------------------------------}

 

  Procedure ABlakLetrehozas(Var Graf : THisztAblak;

                            Const bx,by,jx,jy : Word; c : String;

                                  aDb:Word; l : Real);

    Var

        i : Integer;

  Begin

    With Graf do                               {VGA-kártyát feltételezve!}

    Begin

      cim:=c;

      bfx:=bx; bfy:=by; jax:=jx; jay:=jy;

      adatdb:=aDb;

      leptek:=l;

      For i:=0 to Maxdb do  adatok[i]:=0;

    End;

  End; {ABlakLetrehozas}

 

  Procedure AblakRajzolas(Const Graf : THisztAblak);

    Var

        cx,cy : Integer;

  Begin

    SetViewPort(0,0,GetMaxX,GetMaxY,ClipOn);

    With Graf do

    Begin

      Rectangle(bfx,bfy,jax,jay);

      cx:=(jax-bfx) div 2+bfx; cy:=TextHeight(' ')+bfy;

      OutTextXY(cx,cy,cim);{feltéve: SetTextJustify(CenterText,TopText)}

    End;

  End; {AblakRajzolas}

 

  Procedure TeljesGrafikon(Const Graf : THisztAblak);

    {A Graf ablakba a hisztogram újrarajzolása}

    Var i  : Integer;

        osz: Word;

  Begin

    With Graf do

    Begin

      osz:=((jax-bfx) div adatdb);

      SetFillStyle(EmptyFill,Black{bármi});

      Bar(bfx+2,bfy+TextHeight(' ')+10,jax-2,jay-2);

      SetFillStyle(SolidFill,GetMaxColor);

      For i:=0 to adatdb-1 do

        bar(bfx+osz*(i)+2,trunc(jay-adatok[i]*leptek),

            bfx+osz*(i+1)+1,jay);

    End;

  End; {TeljesGrafikon}

 

  Procedure EloszlasFv(Szam: Word; Var Graf:THisztAblak);

    {A Szam-adik hisztogram-oszlop eggyel növekszik}

    Var

        osz : Word;

  Begin

    With Graf do

    Begin

      Inc(Adatok[Szam]);

      If Adatok[Szam]*leptek<(jay-bfy-TextHeight(' ')-10) then

      Begin

        If UzemMod<>Csendes then

          {nem csendes üzemmódban:}

        Begin

          osz:=((jax-bfx) div (N+1));

          bar(bfx+osz*(Szam)+2,Trunc(jay-adatok[Szam]*leptek),

              bfx+osz*(Szam+1)+1,jay);

        End

      End

         Else

      Begin

        leptek:=leptek/2;  TeljesGrafikon(Graf);

      End;

    End;

  End; {EloszlasFv}

 

  Procedure IdoDiagram(Szam: Word; Var Graf:THisztAblak);

    {Az IdoDiagram jobbra egy Szam magasságú oszloppal bővül,

     vagy shift-elődnek oszlopai eggyel balra, majd bővül}

    Var osz : Word;

        i   : Integer;

  Begin

    With Graf do

    Begin

 

      (*ide kell a kód*)

 

    End;

  End; {IdoDiagram}

 

  Procedure DarazsTorles(Const doboz,holX,holY: Word);

    Var

       kX: Word;

  Begin

    If UzemMod<>Csendes then

    Begin   {nem csendes üzemmódban:}

      If doboz=1 then kX:=20

                 Else kX:=(GetMaxX div 2)+20;

      Bar(kX+darazsMeret*(holX-1),20+darazsMeret*(holY-1),

          kX+darazsMeret*holX-1,20+darazsMeret*holY-1);

    End;

  End; {DarazsTorles}

 

  Procedure DarazsRajzolas(Const doboz,holX,holY: Word);

    Var

       kX: Word;

  Begin

    If UzemMod<>Csendes then

    Begin   {nem csendes üzemmódban:}

      If doboz=1 then kX:=20

                 Else kX:=(GetMaxX div 2)+20;

      PutImage(kX+darazsMeret*(holX-1),20+darazsMeret*(holY-1),

               darazsKep,NormalPut);

    End;

  End; {DarazsRajzolas}

 

  Procedure OsszesDarazs;

    Var

       i,j: Word;  RegiUzemMod: TUzemModok;

  Begin

    RegiUzemMod:=UzemMod;

    UzemMod:=Normal; {ideiglenes beállítva, a rajzolás érdekében}

    {a darazsak újrarajzolása:}

 

    (*ide kell a kód*)

 

    UzemMod:=RegiUzemMod; {visszaállítva}

  End; {OsszesDarazs}

 

    {----------------------------------------- Ablakok, grafikonok kezelése}

 

    {Karakteres képernyö- és billentyü-kezelés: ----------------------------}

 

  Procedure BillentyureVar(Var c: Char);

    {* Billentyüfigyelés

     * Várakozáskijelzés

     * Üzemmódbeállítás}

  Begin

    If KepMod=Szoveges then

    Begin

      c:='-';

      Repeat

        Case c of

          '|': c:='/';

          '/': c:='-';

          '-': c:='\';

          '\': c:='|';

        End;

        Window(1,1,80,25); GotoXY(35,25); Write('Lapozhatunk?',c);

        Delay(100);

      Until KeyPressed;

      c:=ReadKey;

    End

      Else

    Begin

      If UzemMod=Lepesenkenti Then

      Begin

        c:=ReadKey;

        Case c of

          'n','N': UzemMod:=Normal;

          'l','L': UzemMod:=Lepesenkenti;

          'c','C': UzemMod:=Csendes;

          'v','V': UzemMod:=Vege;

        End

      End

        Else

      If KeyPressed then

      Begin

        c:=ReadKey;

        Case c of

          'n','N': UzemMod:=Normal;

          'l','L': UzemMod:=Lepesenkenti;

          'c','C': UzemMod:=Csendes;

          'v','V': UzemMod:=Vege;

        End

      End

    End

  End; {BillentyureVar}

 

  Procedure SzovegesLap;

    {Standard méretü, keretes, címes, karakteres-képernyö}

    Var

       i : Integer;

  Begin

    If KepMod=Grafikus then RestoreCrtMode;

    KepMod:=Szoveges;

    Window(1,1,80,25); ClrScr;

    For i:=2 to 79 do

    Begin

      GotoXY(i,1); Write('-'); GotoXY(i,24); Write('-');

    End;

    For i:=1 to 24 do

    Begin

      GotoXY(1,i); Write('-'); GotoXY(80,i); Write('-');

    End;

    HighVideo;

    GotoXY(40-(FejHossz div 2),1); Write(Fejlec);

    NormVideo;

    Window(3,3,78,23);

  End; {SzovegesLap}

 

    {----------------------------  Karakteres képernyö- és billentyü-kezelés}

 

    {A lényeghez tartozó eljárások és függvények: --------------------------}

 

  Procedure Tajekoztato;

    {Tájékoztató lapozott kiírása a képernyöre file-ból}

    Const

       TajekoztatoFile = 'darazs.hlp';

    Var

       c  : Char;

       s  : Byte;

       sor: String[80];

       tf : Text;

  Begin

      {A tájékoztató szövege:}

 

    (*ide kell a kód*)

 

  End; {Tajekoztato}

 

  Procedure Inicializalas;

    {Paraméterbeolvasás

     Grafikon-parametrizálás

     Eseménytér inicializálása}

    Var

       i,j,

       holX,

       holY,

       n2   : Integer;

       gd,gm: Integer;

       dDb  : Byte;

       d    : Array [1..8] of Record x,y:Byte End;

  Begin

 

      {Paraméterbeolvasás innen hiányzik: N, K értéke}

    SzovegesLap;

 

    (*ide kell a kód*)

 

 

      {Grafikon-parametrizálás:}

    gd:=Detect;    InitGraph(gd,gm,Path);    ClearViewPort;

    AblakLetrehozas(Graf1,10,250,310,460,'Eloszlás',N+1,5);

    AblakLetrehozas(Graf2,330,250,630,460,'Változás',0,(460-250-20)/N);

 

      {Eseménytér inicializálása:}

      {darázskép-generálás:}

      {N-hez közeli, annál nem kisebb négyzetszám keresése:}

    n2:=Trunc(Sqrt(N));

    While n2*n2<N do Inc(n2);

    darazsMaxX:=n2; darazsMaxY:=n2; darazsMeret:=(GetMaxY-30) div (2*n2);

    i:=ImageSize(0,0,darazsMeret-1,darazsMeret-1);

    If i>4000 then Halt(1); {Túl nagy méretü darázskép kellene!!!!}

    {Darázskép-generálás:}

(*

    egy egyszerü:

*)

    For i:=3 to darazsMeret-3 do

      For j:=3 to darazsMeret-3 do

      Begin

        PutPixel(i,j,Random(16));

      End;

(*

    a fenti lehet egy fokkal szebb is...

*)

      {Darázskép mentése:}

    GetImage(0,0,darazsMeret-1,darazsMeret-1,darazsKep); ClearViewPort;

      {Darazsak elhelyezése a Darazs[1..N]-ban, DobozTerkep[,,]-ben:}

 

    (*ide kell a kód*)

 

  End; {Inicializalas}

 

  Procedure KezdoKepernyo;

    {Grafikus kép inicializálása:

       * CimAblak: cim kiírása

       * IdöAblak: T kiírása

       * HalpAblak: Help-sor kiírása

       * GrafikonAblakok: üresen

       * EseményTérAblak: kezdő állapotban}

    Var

       ct   : String;

       lct,

       cx,cy: Integer;

       gd,gm,

       gFejHossz: Integer;

  Begin

      {A grafikus kép inicializálása:}

    KepMod:=Grafikus;

    gd:=Detect;    InitGraph(gd,gm,Path);    ClearViewPort;

    gFejHossz:=FejHossz*TextWidth(' ');

    SetTextJustify(CenterText,TopText);

    SetLineStyle(SolidLn,0,{NormWidth}ThickWidth);

    SetViewPort(0,0, GetMaxX,GetMaxY, ClipOn);

    Rectangle(6,6, GetMaxX-5,GetMaxY-5);

      {CimAblak: cím kiírása:}

    cx:=GetMaxX div 2; cy:=TextHeight(' ') div 2;

    SetViewPort(cx-(gFejHossz div 2)-8,0,

                cx+(gFejHossz div 2)+7,2*cy+7, ClipOn);

    ClearViewPort;

    Rectangle(4,2, gFejHossz+9,2*cy+5);

    OutTextXY((gFejHossz+15){6} div 2,4,Fejlec);

      {IdőAblak: T kiírása:}

 

    (*ide kell a kód*)

 

      {HelpAblak: Help-sor:}

    ct:=HelpSor; lct:=Length(ct)*TextWidth(' ');

    SetViewPort(cx-(lct div 2)-8,GetMaxY-TextHeight(' ')-6,

                cx+(lct div 2)+7,GetMaxY, ClipOn);

    ClearViewPort;

    Rectangle(2,2, lct+9,2*cy+5);

    OutTextXY((lct+15) div 2,4,ct);

      {GrafikonAblakok:}

    AblakRajzolas(Graf1);

    AblakRajzolas(Graf2);

    SetViewPort(0,0,GetMaxX,GetMaxY,ClipOn);

      {EseményTérAblak:}

    OsszesDarazs;

 

      {további ablakok:}

 

  End; {KezdoKepernyo}

 

  Procedure SzimulaciosLepes;

    {A lényeg}

    Var i,

        honnan,hova,

        holX,holY  : Integer;

  Begin

       {A lényeg innen hiányzik:}

 

    (*ide kell a kód*)

 

  End; {SzimulaciosLepes}

 

  Procedure EredmenyMegjelenites;

    Var

       ct  : String;

       lct : Integer;

  Begin

      {Idokiiras:}

 

    (*ide kell a kód*)

 

      {Grafikonok:}

    EloszlasFv(K,Graf1);

    IdoDiagram(K,Graf2);

  End; {EredmenyMegjelenites}

 

  Function VegeE: Boolean;

    Var

       c : Char;  RegiUzemMod: TUzemModok;

  Begin

    RegiUzemMod:=UzemMod;

    BillentyureVar(c);  {esetleges üzemmódváltás}

    If (RegiUzemMod=Csendes) And (c in ['n', 'N', 'l', 'L']) then

    Begin  {Grafikonfrissítés:}

      TeljesGrafikon(Graf1);

      TeljesGrafikon(Graf2);

      OsszesDarazs;

    End;

    VegeE:=(UzemMod=Vege) {And (automatikus végállapot érzékelés)}

  End; {VegeE}

 

  Procedure OsszefoglaloMegjelenites;

    Var

       c : Char;

  Begin

 

      {valami konklúzió innen hiányzik:}

 

    KepMod:=Szoveges; BillentyureVar(c); CloseGraph;

    SzovegesLap;

    GotoXY(25,10); Writeln('Itt a vége fuss el véle!!!!');

  End; {OsszefoglaloMegjelenites}

 

    {-------------------------- A lényeghez tartozó eljárások és függvények}

 

Begin

  UzemMod:=Lepesenkenti;

  Tajekoztato;

  Inicializalas; T:=0;

  KezdoKepernyo;

  EredmenyMegjelenites;

  While not VegeE do

  Begin

    SzimulaciosLepes;

    Inc(T);

    EredmenyMegjelenites;

  End;

  OsszefoglaloMegjelenites;

End.