Írjunk karakteres képernyőn egyszerű eszközökkel megjelenő, egyenrangú útkereszteződés forgalmát szimuláló, programot. A négy irányból érkező forgalmat egy-egy láncolt listában rögzítsük. Ha a programot megállítjuk, akkor az aktuális forgalmi helyzetet mentse lemezre, a következő indításkor erről a forgalmi helyzetről induljon a program. A járműveket a haladási irányba mutató háromszög szemléltesse, az autók legyenek véletlen színűek, járművek megjelenését mi idézzük elő, a megfelelő irányba mutató nyíl megnyomásával. Az áthaladásnál a járművek tartsák be a KRESZ előírásait. Az útkereszteződés elhagyása után a járművek mozgását már nem kell szemléltetni.

 

A program egy futási képe:

 

 

A program listája:

 

Program XRoad;              

Uses NewDelayCrt, CrtPlus;
Const LSzM=4;
      O1  =39;
      S2  =12;
      O3  =42;
      S4  =14;
      RV  =500;
      HV  =2000;

Type
     RecMut= ^Rec;
     Rec   = Record
               Ch  : Char;
               Szin: Byte;
               KMutRecMut;
             End;

     KepHelyRecord
                Kar,
                Atr: Byte;
              End;
     Scr    = Array[1..25,1..80] Of KepHely;

Var
    ARec  : Rec;
    URecM,
    ARecM : RecMut;

    KocsiTArray[1..LSzM] Of RecMut
    FNev  : File Of Rec;
    DNev  : String
    Kep   : Scr Absolute $B800:0;

Procedure Felfuz(URecM:RecMut);
Var Szel:Byte; 
Begin
  Case URecM^.Ch Of 
    #31:Szel:=1;
    #17:Szel:=2;
    #30:Szel:=3;
    #16:Szel:=4;
  End;
  If KocsiT[Szel]=Nil Then 
  KocsiT[Szel]:=URecM 
  Else
  Begin
    ARecM:=KocsiT[Szel]; 
    While ARecM^.KMut<>Nil Do 
    ARecM:=ARecM^.KMut
    ARecM^.KMut:=URecM
  End
End;

Procedure Lemezrol
Begin
  Assign(FNev,DNev);{$I-}Reset(FNev);{$I+}
    If IOResult=0 Then 
    While Not EOF(FNevDo 
    Begin
      Read(FNev,ARec); 
      URecM:=New(RecMut); 
      With URecMDo 
      Begin
        Ch  := ARec.Ch; 
        Szin:= ARec.Szin
        KMut:= Nil
      End;
      Felfuz(URecM); 
    End
    Else 
    ReWrite(FNev);
  Close(FNev); 
End;

Procedure Lemezre; 
Var I:Byte; 
Begin
  Assign(FNev,DNev);ReWrite(FNev); 
    For I:=1 To LSzM Do 
    Begin
      ARecM:=KocsiT[I];
      While ARecM<>Nil Do 
      Begin
        With ARec Do 
        Begin
          Ch  :=ARecM^.Ch
          Szin:=ARecM^.Szin;
          KMut:=Nil
        End;
        Write(FNev,ARec); 
        ARecM:=ARecM^.KMut
      End;
    End;
  Close(FNev); 
End;

Procedure Kepernyo
Begin
  Szinek(Black,LightGray);
  ClrScr;

  Szinek(LightGray,Black); 
  Window(10,3,71,23);
  ClrScr;

  GoToXY(25,1);
  Write('Útkereszteződés');

  GoToXY(10,21);
  Write('Autó megjelen
ése: Nyilakkal  Kilépés: ESC');

  Szinek(Green,Black);
  Window(12,4,37,11); 

  ClrScr;

 
 Window(44,4,69,11); 

  ClrScr;

 
 Window(12,15,37,22); 

  ClrScr;

 
 Window(44,15,69,22); 
  ClrScr;

  Window(1,1,80,25); 


  Kep[25,1].Atr:=0;
  Tunj;
End;

Procedure Kepre;
Var I, 

    H, 
    S :Longint
Begin
  For I:= 4 To 11 Do Kep[I,O1].Kar:=32; 
  For I:=44 To 69 Do Kep[S2,I].Kar:=32;
  For I:=15 To 22 Do Kep[I,O3].Kar:=32;
  For I:=10 To 37 Do Kep[S4,I].Kar:=32;

  For I:=1 To LSzM do 
  Begin
    S:=0; 
    ARecM:=KocsiT[I]; 
    While ARecM<>Nil Do 
    With ARecMDo
    Begin
      Case I Of 
        1:Begin 
            H:=11-S;
            If H>3 Then 
            Begin
              Kep[H,O1].Kar:=31;
              Kep[H,O1].Atr:=Szin
            End;
          End;
        2:Begin
            H:=44+2*S; 
            If H<70 Then 
            Begin
              Kep[S2,H].Kar:=17;
              Kep[S2,H].Atr:=Szin
            End;
          End;
        3:Begin
            H:=15+S;
            If H<23 Then
            Begin
              Kep[H,O3].Kar:=30;
              Kep[H,O3].Atr:=Szin
            End;
          End;
        4:Begin
            H:=37-2*S;
            If H>11 Then
            Begin
              Kep[S4,H].Kar:=16;
              Kep[S4,H].Atr:=Szin
            End;
          End;
      End;
      ARecM:=ARecM^.KMut
      Inc(S); 
    End;
  End;
End;

Procedure Levesz(N:Byte); 
Var I: Byte; 
Begin
  If KocsiT[N]=Nil Then Exit
  KocsiT[N]:=KocsiT[N]^.KMut
  Case N Of
    1:Begin 
        For I:=S2 To S4 Do 
        Begin
          Kep[I,O1]:=Kep[I-1,O1]; 
          Kep[I-1,O1].Kar:=32; 
          Delay(RV); 
        End;
        Kep[I,O1].Kar:=32; 
      End;
    2:Begin
        For I:=O3+1 DownTo O1-1 Do
        Begin
          Kep[S2,I]:=Kep[S2,I+1];
          Kep[S2,I+1].Kar:=32;
          Delay(RV);
        End;
        Kep[S2,I].Kar:=32;
      End;
    3:Begin
        For I:=S4 DownTo S2 Do
        Begin
          Kep[I,O3]:=Kep[I+1,O3];
          Kep[I+1,O3].Kar:=32;
          Delay(RV);
        End;
        Kep[I,O3].Kar:=32;
      End;
    4:Begin
        For I:=O1-1 To O3+1 Do
        Begin
          Kep[S4,I]:=Kep[S4,I-1];
          Kep[S4,I-1].Kar:=32;
          Delay(RV);
        End;
        Kep[S4,I].Kar:=32;
      End;
  End;
  Kepre
End;

Function Valasztas:Byte; 
Var I, 
    M, 
    V: Byte;
    P:  Array[1..LSzM] Of Byte;
Begin
  M:=0;
  For I:=1 To LSzM Do P[I]:=0;
  For I:=1 To LSzM Do If KocsiT[i]<>Nil Then Inc(M);
  Case M Of
    LSzMValasztas:=Random(LSzM)+1; 
       0: Valasztas:=0; 
    Else
      Begin
        If (KocsiT[1]<>NilAnd 
        (KocsiT[LSzM]=Nil
        Then P[1]:=1;
        For I:=2 To LSzM Do 
        If (KocsiT[I]<>NilAnd 
        (KocsiT[I-1]=Nil
        Then P[I]:=1; 
        Repeat 
          V:=Random(LSzM)+1;
        Until P[V]=1; 
        Valasztas:=V;
      End;
  End;
End;

Procedure Vezerlo;
Var Bill:Char;
Begin
  Repeat
    If Not KeyPressed Then 
    Begin
      Levesz(Valasztas);
      Delay(HV)
    End;
    If KeyPressed Then Bill:=ReadKey;
    If Bill=#27 Then Exit
    If Bill=#0 Then
    Begin
      Bill:=ReadKey
      If Bill In [#72,#75,#77,#80] Then
      Begin
        URecM:=New(RecMut);
        With URecMDo
        Begin
          Case Bill Of
            #72: Ch:=#30;
            #75: Ch:=#17;
            #77: Ch:=#16;
            #80: Ch:=#31;
          End;
          Szin:=Random(16);
          If Szin=7 Then Szin:=15;
          Szin:=16*LightGray+Szin
          KMut:=Nil;
        End;
        Felfuz(URecM);
        Kepre;
        Delay(RV);
      End;
    End;
  Until False;
End;

Begin
  DNev:='XRoad.Dat';
  Lemezrol;
  Kepernyo;
  Kepre;
  Randomize;
  Vezerlo;
  Lemezre;
  Szinek(Black,LightGray);

  ClrScr;
End
.