unit zaisti;

interface

  { inicializuojamas žaidimas ir parenkama suma, kurią reikia pasiekti }
  procedure init (var didsuma : longint; var priesininko_ejimas : integer);
  {atliekamas ėjimas ir sužinomas priešininko ėjimas}
  procedure eiti (mano_ejimas : integer; var priesininko_ejimas : integer);

implementation

  var f : text;
      suma, dsuma : longint;
      laimejai : boolean;
      atsimink_priesininko_ejima : integer;

  function labai_gudrus_priesininko_ejimas (mano_ejimas : integer) : integer;
    var ejimas : integer;
  begin
    randomize;
    repeat
      ejimas := random(6) + 1;
    until ejimas <> mano_ejimas;
    writeln (f, 'priešininko ėjimas: ', ejimas);
    atsimink_priesininko_ejima := ejimas;
    labai_gudrus_priesininko_ejimas := ejimas;
  end;

  {inicializuojamas žaidimas ir parenkama suma, kurią reikia pasiekti}
  procedure init (var didsuma : longint; var priesininko_ejimas : integer);
    var fi : text;
  begin
    assign (fi, 'init.in');
    reset (fi);
    readln (fi, didsuma, priesininko_ejimas);
    close (fi);
    writeln (f, 'didsuma = ', didsuma, ', pirmasis priešininko ėjimas - ', priesininko_ejimas);

    dsuma := didsuma;
    suma := priesininko_ejimas;
  end;

  {atliekamas ėjimas ir sužinomas priešininko ėjimas}
  procedure eiti (mano_ejimas : integer; var priesininko_ejimas : integer);
  begin
    writeln (f, 'tavo ėjimas: ', mano_ejimas);
    if (mano_ejimas < 1) or (mano_ejimas > 6) or
       (mano_ejimas = atsimink_priesininko_ejima)
      then
        begin
          writeln (f, 'nekorektiškas ėjimas!');
          halt;
        end;
    suma := suma + mano_ejimas;
    if (suma > dsuma)
      then halt;
    if (suma = dsuma)
      then
        begin
          laimejai := true;
          halt;
        end;
    priesininko_ejimas := labai_gudrus_priesininko_ejimas (mano_ejimas);
    suma := suma + priesininko_ejimas;
    if (suma > dsuma)
      then
        begin
          laimejai := true;
          halt;
        end;
    if (suma = dsuma)
      then halt;
  end;

  var ExitSave : pointer;

  procedure ZaidimoPabaiga; far;
  begin
    write (f, 'zaidimo pabaiga! ');
    if (not laimejai)
      then writeln (f, 'pralaimėjote')
      else writeln (f, 'laimėjote');
    close (f);
    ExitProc := ExitSave;
  end;

begin
  laimejai := false;

  assign (f, 'losimas.log');
  rewrite (f);
  writeln (f, '--- žaidimas prasideda ---');

  ExitSave := ExitProc;
  ExitProc := @ZaidimoPabaiga;
end.
