PROGRAM TicTacTrace_pas(input,output);
{Markus Schaber - Berechnen der Spielpositionen in TicTacToe
 Nicht auf Basis des TicTacToe-Spiels aus dem Web erstellt.}

TYPE TSpieler=(keiner,O,X);
     TFeld=ARRAY[1..9] OF TSpieler;

VAR Positionen:ARRAY[keiner..X] OF LONGINT;
    i:TSpieler;
    j:Integer;
    PseudoFeld:TFeld;

FUNCTION Check(Feld:TFeld):TSpieler;
{Testet, ob in dem Feld eine Mhle existiert}
CONST Muhlen : ARRAY[1..8] OF ARRAY[1..3] OF INTEGER=((1,2,3),(4,5,6),(7,8,9),(1,4,7),(2,5,8),(3,6,9),(1,5,9),(3,5,7));
VAR sieger:TSpieler;
    i:Integer;
begin
     for i:=1 to 8 DO BEGIN{alle acht Mhlen testen}
         sieger:=Feld[Muhlen[i,1]];
         if sieger<>keiner THEN {Wenn erstes Feld der Mhle besetzt}
            if sieger=Feld[Muhlen[i,2]] THEN {beide andere Felder zurckgeben}
               if sieger=Feld[Muhlen[i,3]] THEN BEGIN
                  Check:=sieger; {Spieler der Mhle zurckgeben}
                  exit;
               end
     END;
     Check:=keiner;{noch gibts keine Mhle}
end;

PROCEDURE TraceTicTac(Feld:TFeld;pos:INTEGER);
VAR i:TSpieler;
    sieger:TSpieler;
BEGIN
     IF pos>9 then exit;
     write(pos);{rekursionstiefe ausgeben}
     FOR i:=keiner to X DO BEGIN

         Feld[pos]:=i;
         sieger:=Check(Feld);

         positionen[sieger]:=positionen[sieger]+1;

         IF sieger=keiner then
            TraceTicTac(Feld,pos+1);
     END;
     write(chr(8),' ',chr(8)); {rekursionstiefe wieder lschen}

END;

begin
     for i:=keiner to X do positionen[i]:=0;
     for j:=1 to 9 do PseudoFeld[j]:=keiner;
     writeln;
     writeln('TicTacTrace - Berechnen der Spielpositionen von TicTacToe');
     writeln;

     TraceTicTac(PseudoFeld,1);

     writeln;
     writeln('"legale" Spielpositionen:',positionen[O]+positionen[X]+positionen[keiner]);
     writeln('davon:');
     writeln('Gewinnsituationen fr O :',positionen[O]);
     writeln('Gewinnsituationen fr X :',positionen[X]);
     writeln('(noch) nicht entschieden:',positionen[keiner]);
end
.