uses Crt; type tab = array[1..3,1..3] of char; wsk_wezla = ^wezel; wezel = record plansza: tab; galez1,galez2,galez3, galez4,galez5,galez6, galez7,galez8,galez9: wsk_wezla end; var opcja,n_opcja,gl: wsk_wezla; i,j,pole,rotacja: byte; znak: char; function wyg(wsk_linii: wsk_wezla; znak_wyg: char): boolean; var r,c,z: byte; begin wyg := false; for r := 1 to 3 do begin z := 0; for c := 1 to 3 do if wsk_linii^.plansza[r,c] = znak_wyg then z := z + 1; if z = 3 then begin wyg := true; {writeln('wiersz');} break end; end; for c := 1 to 3 do begin z := 0; for r := 1 to 3 do if wsk_linii^.plansza[r,c] = znak_wyg then z := z + 1; if z = 3 then begin wyg := true; {writeln('kolumna');} break end; end; z := 0; for r := 1 to 3 do if wsk_linii^.plansza[r,r] = znak_wyg then z := z + 1; if z = 3 then begin wyg := true; {writeln('przekatna nr. 1');} end; z := 0; for r := 1 to 3 do if wsk_linii^.plansza[r,4-r] = znak_wyg then z := z + 1; if z = 3 then begin wyg := true; {writeln('przekatna nr. 2');} end end; procedure N_Wezel(pocz,nast: wsk_wezla; rows,cols,nr_pola,poziom: byte; var rot: byte; znak: char); var wi,wj,o: byte; begin if (pocz^.plansza[rows,cols] = ' ') and (rows = 1) and (cols = 1) then begin {writeln('galez 1');} New(nast); nast^.plansza := pocz^.plansza; pocz^.galez1 := nast; inc(nr_pola); nast^.plansza[rows,cols] := znak; if znak = 'X' then znak := '0' else znak := 'X' end else if (pocz^.plansza[rows,cols] = ' ') and (rows = 1) and (cols = 2) then begin {writeln('galez 2');} New(nast); nast^.plansza := pocz^.plansza; pocz^.galez2 := nast; inc(nr_pola); nast^.plansza[rows,cols] := znak; if znak = 'X' then znak := '0' else znak := 'X' end else if (pocz^.plansza[rows,cols] = ' ') and (rows = 1) and (cols = 3) then begin {writeln('galez 3');} New(nast); nast^.plansza := pocz^.plansza; pocz^.galez3 := nast; inc(nr_pola); nast^.plansza[rows,cols] := znak; if znak = 'X' then znak := '0' else znak := 'X' end else if (pocz^.plansza[rows,cols] = ' ') and (rows = 2) and (cols = 1) then begin {writeln('galez 4');} New(nast); nast^.plansza := pocz^.plansza; pocz^.galez4 := nast; inc(nr_pola); nast^.plansza[rows,cols] := znak; if znak = 'X' then znak := '0' else znak := 'X' end else if (pocz^.plansza[rows,cols] = ' ') and (rows = 2) and (cols = 2) then begin {writeln('galez 5');} New(nast); nast^.plansza := pocz^.plansza; pocz^.galez5 := nast; inc(nr_pola); nast^.plansza[rows,cols] := znak; if znak = 'X' then znak := '0' else znak := 'X' end else if (pocz^.plansza[rows,cols] = ' ') and (rows = 2) and (cols = 3) then begin {writeln('galez 6');} New(nast); nast^.plansza := pocz^.plansza; pocz^.galez6 := nast; inc(nr_pola); nast^.plansza[rows,cols] := znak; if znak = 'X' then znak := '0' else znak := 'X' end else if (pocz^.plansza[rows,cols] = ' ') and (rows = 3) and (cols = 1) then begin {writeln('galez 7');} New(nast); nast^.plansza := pocz^.plansza; pocz^.galez7 := nast; inc(nr_pola); nast^.plansza[rows,cols] := znak; if znak = 'X' then znak := '0' else znak := 'X' end else if (pocz^.plansza[rows,cols] = ' ') and (rows = 3) and (cols = 2) then begin {writeln('galez 8');} New(nast); nast^.plansza := pocz^.plansza; pocz^.galez8 := nast; inc(nr_pola); nast^.plansza[rows,cols] := znak; if znak = 'X' then znak := '0' else znak := 'X' end else if (pocz^.plansza[rows,cols] = ' ') and (rows = 3) and (cols = 3) then begin {writeln('galez 9');} New(nast); nast^.plansza := pocz^.plansza; pocz^.galez9 := nast; inc(nr_pola); nast^.plansza[rows,cols] := znak; if znak = 'X' then znak := '0' else znak := 'X' end else inc(nr_pola); pocz := nast; inc(poziom); {if wyg(pocz,'X') = true or wyg(pocz,'0') = true then begin} {for wi := 1 to 3 do begin for wj := 1 to 3 do write(pocz^.plansza[wi,wj]:4); writeln; end; writeln('---------------------------------------------------'); readln;} { Do analizowania :) } {end;} if cols < 3 then inc(cols) else if (cols = 3) and (rows < 3) then begin cols := 1; inc(rows) end else if (cols = 3) and (rows = 3) then begin cols := 1; rows := 1 end; if (nr_pola < 9) and (wyg(pocz,'X') = false) and (wyg(pocz,'0') = false) then N_Wezel(pocz,nast,rows,cols,nr_pola,poziom,rot,znak); if nr_pola = 9 then rot := poziom - 2 else if (wyg(pocz,'X') = true) or (wyg(pocz,'0') = true) then rot := poziom - 1; {writeln('rot ',rot,' poziom ',poziom);} if (poziom > 0) and (poziom <= rot) then begin o := 1; while o < (9 - poziom) do begin if cols < 3 then inc(cols) else if (cols = 3) and (rows < 3) then begin cols := 1; inc(rows) end else if (cols = 3) and (rows = 3) then begin cols := 1; rows := 1 end; nr_pola := 0; N_Wezel(pocz,nast,rows,cols,nr_pola,poziom,rot,znak); inc(o) end end; dec(poziom) end; procedure Spr_Wezla(var pocz: wsk_wezla); var l_rows,l_cols: byte; begin pocz := pocz^.galez1; pocz := pocz^.galez2; pocz := pocz^.galez3; pocz := pocz^.galez4; pocz := pocz^.galez5; pocz := pocz^.galez6; pocz := pocz^.galez9; for l_rows := 1 to 3 do begin for l_cols := 1 to 3 do write(pocz^.plansza[l_rows,l_cols]:4); writeln end end; begin ClrScr; opcja := nil; n_opcja := nil; gl := nil; New(opcja); New(gl); for i := 1 to 3 do for j := 1 to 3 do opcja^.plansza[i,j] := ' '; opcja^.galez1 := nil; opcja^.galez2 := nil; opcja^.galez3 := nil; opcja^.galez4 := nil; opcja^.galez5 := nil; opcja^.galez6 := nil; opcja^.galez7 := nil; opcja^.galez8 := nil; opcja^.galez9 := nil; gl := opcja; writeln('Struktura drzewa decyzyjnego do gry Kólko i Krzyzyk'); writeln('"X" - komp, "0" - gracz'); writeln('KORZEN'); for i := 1 to 3 do begin for j := 1 to 3 do write(gl^.plansza[i,j]:4); writeln end; writeln('jest pusty co odpowiada pustej planszy.'); rotacja := 0; N_Wezel(opcja,n_opcja,1,1,0,0,rotacja,'X'); { jedena z galezi drzewa - Krzyzyk i Kólko } Spr_Wezla(gl); writeln(wyg(gl,'X')); { Sprawdzenie przypadkowego wezla lub liscia } writeln('WYGRAŁ KOMPUTER :)'); for i := 1 to 3 do begin for j := 1 to 3 do write(gl^.plansza[i,j]:4); writeln end; writeln('To jest polowa gry :)') end.