Program Numeropeli;
uses Crt;

CONST
    tyhja=-32768;
    tahti=32767;
    maxind=9;

TYPE indtype = 1..maxind;
     solmuos = ^solmu;
     solmu   = RECORD
                  arvo:Integer;
                  ind :Indtype;
                  oikveli:solmuos;
               END;
     puu     = ^puutaso;
     puutaso = RECORD
                  ylataso:puu;
                  siirrot:solmuos;
                  parasarvo:INTEGER;
               END;
VAR
    quit        : BOOLEAN;
VAR
    kayttamattomat:     puu;    {Solmuja ei tuhota ja luoda yhtenään, vaan laitetaan ja}
                                {otetaan kayttamattomat listaan}
    kayttamattsolmut:   solmuos;
    koneenlaatat,
    pelaajanlaatat,
    taso,
    maxtaso,
    koneyht,pelayht :	Integer;
    koneenvuoro,
    pelipaattyi,
    konesarakkeittain:   BOOLEAN;
    tahtirivi,
    tahtisara,
    edtahtirivi,
    edtahtisara     :   indtype;
    alkutilanne     :   ARRAY [1..maxind,1..maxind] OF INTEGER;
    pelilauta       :   ARRAY [1..maxind,1..maxind] OF INTEGER;
    odotus          :   char;
    ind				:	Integer;
    oletus			: 	BOOLEAN;
FUNCTION TASOPARILLINEN:BOOLEAN;
BEGIN
  TASOPARILLINEN:=(taso MOD 2=0)
END;
FUNCTION SARAKESIIRTO:BOOLEAN;
BEGIN
  IF TASOPARILLINEN THEN SARAKESIIRTO:=konesarakkeittain
                    ELSE SARAKESIIRTO:=NOT(konesarakkeittain)
END;
PROCEDURE MUUTALAUTATILANNE(siirto:indtype);
BEGIN
     pelilauta[tahtirivi,tahtisara]:=tyhja;
     IF SARAKESIIRTO THEN
        BEGIN
            pelilauta[siirto,tahtisara]:=tahti;
            tahtirivi:=siirto;
        END ELSE
            BEGIN
                pelilauta[tahtirivi,siirto]:=tahti;
                tahtisara:=siirto;
            END;
END;

PROCEDURE KONESIIRTAA;
VAR alkuind:indtype;
    pelipuu,
    uusitaso:puu;
    pojat:solmuos;
    parasind:indtype;
PROCEDURE PERULAUTATILANNE(siirto:indtype);
BEGIN
     pelilauta[tahtirivi,tahtisara]:=alkutilanne[tahtirivi,tahtisara];
     IF SARAKESIIRTO
        THEN
           BEGIN
                pelilauta[siirto,tahtisara]:=tahti;
                tahtirivi:=siirto;
           END
        ELSE
           BEGIN
                pelilauta[tahtirivi,siirto]:=tahti;
                tahtisara:=siirto;
           END;
END;
PROCEDURE TUHOATASOSOLMU(VAR os:puu);
BEGIN
  os^.ylataso:=kayttamattomat;
  kayttamattomat:=os;
END;
PROCEDURE UUSITASOSOLMU(VAR os:puu);
BEGIN
  IF kayttamattomat=NIL THEN NEW(os)
  ELSE BEGIN
         os:=kayttamattomat;
         kayttamattomat:=kayttamattomat^.ylataso;
         os^.ylataso:=NIL;
       END;
END;
PROCEDURE UUSISOLMU(VAR os:solmuos);
BEGIN
  IF kayttamattsolmut=NIL THEN NEW(os)
  ELSE
    BEGIN
      os:=kayttamattsolmut;
      kayttamattsolmut:=kayttamattsolmut^.oikveli;
      os^.oikveli:=NIL;
    END;
END;
PROCEDURE TUHOASOLMU(VAR os:solmuos);
BEGIN
  os^.oikveli:=kayttamattsolmut;
  kayttamattsolmut:=os;
END;
PROCEDURE RAKENNASEURAAVATASO;
VAR  solmu,vika:solmuos;
            ind:indtype;
     laattaarvo:INTEGER;
BEGIN
  pojat:=NIL;
  taso:=taso+1;
  FOR ind:=1 TO maxind DO
    BEGIN
      IF SARAKESIIRTO THEN laattaarvo:=pelilauta[ind,tahtisara]
       ELSE laattaarvo:=pelilauta[tahtirivi,ind];
      IF laattaarvo<>tyhja THEN
         IF laattaarvo<>tahti THEN
            BEGIN
              UUSISOLMU(solmu);
              IF TASOPARILLINEN THEN
                 solmu^.arvo:=pelipuu^.siirrot^.arvo+laattaarvo
               ELSE solmu^.arvo:=pelipuu^.siirrot^.arvo-laattaarvo;
              solmu^.ind:=ind;
              IF pojat=NIL THEN  { Vasta ensimmäinen solmu jonoon }
                BEGIN
                  pojat:=solmu;
                  vika:=pojat;
                END
             ELSE
                BEGIN
                  vika^.oikveli:=solmu;
                  solmu^.oikveli:=NIL;
                  vika:=solmu;
                END;
            END;
       END;
       IF pojat=NIL THEN  { Ei päästy enää jatkamaan eli päädyttiin  }
          BEGIN           { lehtisolmuun, jonka arvo kerrotaan kymme- }
             taso:=taso-1;{ nellä.                                    }
             pelipuu^.siirrot^.arvo:=pelipuu^.siirrot^.arvo*10;
          END
        ELSE
          BEGIN
            UUSITASOSOLMU(uusitaso);
            uusitaso^.ylataso:=pelipuu;
            uusitaso^.siirrot:=pojat;
            IF TASOPARILLINEN THEN uusitaso^.parasarvo:=-MAXINT
                              ELSE uusitaso^.parasarvo:=MAXINT;
            MUUTALAUTATILANNE(uusitaso^.siirrot^.ind);
            pelipuu:=uusitaso;
          END;
END;
PROCEDURE PURAPUUTA;
PROCEDURE POISTASOLMU;
VAR apusolmu:solmuos;
    arvo:Integer;
BEGIN
  arvo:=pelipuu^.siirrot^.arvo;
  IF TASOPARILLINEN THEN
     BEGIN IF arvo>pelipuu^.parasarvo THEN
          BEGIN
            pelipuu^.parasarvo:=arvo;
            IF taso=2 THEN parasind:=pelipuu^.siirrot^.ind;
          END;
     END
  ELSE
     IF arvo1 THEN
  BEGIN
    pelipuu^.ylataso^.siirrot^.arvo:=pelipuu^.parasarvo;
    apu:=pelipuu;
    pelipuu:=pelipuu^.ylataso;
    TUHOATASOSOLMU(apu);
    taso:=taso-1;
    POISTASOLMU; { Poistetaan myos isasolmu }
    IF taso>1 THEN IF taso=2 THEN PERULAUTATILANNE(alkuind)
              ELSE PERULAUTATILANNE(pelipuu^.ylataso^.ylataso^.siirrot^.ind);
  END;
END;
BEGIN { purapuuta }
 IF taso=maxtaso THEN
                   BEGIN
                     WHILE pelipuu^.siirrot<>NIL DO POISTASOLMU;
                     PERULAUTATILANNE(pelipuu^.ylataso^.ylataso^.siirrot^.ind);
                     NOUSETASOLTAYLOS;
                     IF pelipuu^.siirrot<>NIL THEN
                          MUUTALAUTATILANNE(pelipuu^.siirrot^.ind);
                     pojat:=pelipuu^.siirrot;
                   END
 ELSE
   BEGIN
     IF pelipuu^.siirrot=NIL THEN
        WHILE (pelipuu^.siirrot=NIL)AND(taso>1) DO NOUSETASOLTAYLOS
     ELSE BEGIN
            POISTASOLMU;
            IF taso=2 THEN PERULAUTATILANNE(alkuind)
            ELSE PERULAUTATILANNE(pelipuu^.ylataso^.ylataso^.siirrot^.ind);
          END;
     pojat:=pelipuu^.siirrot;
     IF taso<>1 THEN IF pojat<>NIL
                        THEN MUUTALAUTATILANNE(pelipuu^.siirrot^.ind);
   END;
END;
BEGIN { konesiirtaa }
	write('Odota. Mietin.');
     taso:=1;
     IF konesarakkeittain THEN alkuind:=tahtirivi
                          ELSE alkuind:=tahtisara;
     UUSITASOSOLMU(pelipuu);
     UUSISOLMU(pojat);
     pojat^.arvo:=koneenlaatat-pelaajanlaatat;
     IF konesarakkeittain THEN pojat^.ind:=tahtisara
                          ELSE pojat^.ind:=tahtirivi;
     pelipuu^.siirrot:=pojat;
     pelipuu^.parasarvo:=MAXINT;
     RAKENNASEURAAVATASO;
     IF pojat<>NIL THEN
        BEGIN
       
          IF pojat^.oikveli=NIL THEN parasind:=pojat^.ind
          ELSE
            WHILE taso>1 DO
                BEGIN
                  WHILE (pojat<>NIL)AND(taso= -15) AND (pelilauta[ind,tahtisara] <= 15)) THEN BEGIN
							oletus:=FALSE;
							WRITELN (oletus);
							WRITE (pelilauta[ind,tahtisara], '  ');
						END; 	
						ind:=ind+1;
					END;
				UNTIL (ind > maxind) OR (oletus = FALSE); 
				IF oletus=TRUE THEN pelipaattyi:=TRUE;		            
            END;
            piirra;
            IF (NOT koneenvuoro) THEN BEGIN            	
                IF NOT pelipaattyi THEN BEGIN
                	LUENAPPAINPAINALLUS;
                END;
            END;
          UNTIL pelipaattyi OR quit;

         IF pelipaattyi THEN BEGIN
            IF (pelaajanlaatat>koneenlaatat) THEN BEGIN
            	WRITELN('Onneksi olkoon! Voitit!!');
            END;
            IF (pelaajanlaatat=koneenlaatat) THEN BEGIN
            	WRITELN('Wau! Tasapeli. Se ei kuitenkaan riitä 10 euron saamiseen :(');
            END;
            IF (pelaajanlaatat