uses Crt;
type
tab = array[1..3,1..3] of char;
tablica_gry = array[1..3,1..3] of char;
tablica_wezlow = array[1..9] of integer;
schowek = array[1..9] of integer;
Tablica_Wynikow = array[1..9] of integer;
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,zajete_pole,rotacja,wie,kol: byte;
indeks,start_rows,start_cols: byte;
l_win,l_lost,l_tie: word;
X,O: char;
gra: tab;
t_wezly: tablica_wezlow;
t_schowek: schowek;
Wyniki: Tablica_Wynikow;
korekta_wygranej,korekta_przegranej: boolean;
obrona: boolean;
function wyg(wsk_linii: tab; 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[r,c] = znak_wyg then
z := z + 1;
if z = 3 then begin wyg := true; { wiersz } break end;
end;
for c := 1 to 3 do
begin z := 0;
for r := 1 to 3 do
if wsk_linii[r,c] = znak_wyg then
z := z + 1;
if z = 3 then begin wyg := true; { kolumna } break end;
end;
z := 0;
for r := 1 to 3 do
if wsk_linii[r,r] = znak_wyg then z := z + 1;
if z = 3 then begin wyg := true; { przekatna nr. 1 } end;
z := 0;
for r := 1 to 3 do
if wsk_linii[r,4-r] = znak_wyg then z := z + 1;
if z = 3 then begin wyg := true; { przekatna nr. 2 } end
end;
function Nr_Wezla(w,k: byte): byte;
begin
if k mod 3 = 0 then
Nr_Wezla := w * k
else
Nr_Wezla := (w - 1) * 3 + k
end;
function Wyszukanie_Wzorca(pocz: wsk_wezla; tab_glowna: tab;
schow: schowek; wezly: tablica_wezlow): boolean;
var
wi,wj: byte;
znaleziono: boolean;
begin
znaleziono := false; Wyszukanie_Wzorca := false;
for wi := 1 to 3 do
begin
for wj := 1 to 3 do
if (((pocz^.plansza[wi,wj] = tab_glowna[wi,wj]) and (pocz^.plansza[wi,wj] <> ' '))
or ((pocz^.plansza[wi,wj] <> ' ') and (tab_glowna[wi,wj] = ' '))) then
znaleziono := true
else
if pocz^.plansza[wi,wj] <> tab_glowna[wi,wj] then
begin znaleziono := false; break end;
if znaleziono = false then break
end;
if znaleziono = true then
begin
for wi := 1 to 9 do
schow[wi] := wi;
for wi := 9 downto zajete_pole + 1 do
begin
if abs(wezly[schow[wi]]) = 9 then
pocz := pocz^.galez9;
if abs(wezly[schow[wi]]) = 8 then
pocz := pocz^.galez8;
if abs(wezly[schow[wi]]) = 7 then
pocz := pocz^.galez7;
if abs(wezly[schow[wi]]) = 6 then
pocz := pocz^.galez6;
if abs(wezly[schow[wi]]) = 5 then
pocz := pocz^.galez5;
if abs(wezly[schow[wi]]) = 4 then
pocz := pocz^.galez4;
if abs(wezly[schow[wi]]) = 3 then
pocz := pocz^.galez3;
if abs(wezly[schow[wi]]) = 2 then
pocz := pocz^.galez2;
if abs(wezly[schow[wi]]) = 1 then
pocz := pocz^.galez1
end;
for wi := 1 to 3 do
begin
for wj := 1 to 3 do
if pocz^.plansza[wi,wj] = tab_glowna[wi,wj] then
znaleziono := true
else
begin
znaleziono := false;
break
end;
if znaleziono = false then break
end
end;
Wyszukanie_Wzorca := znaleziono
end;
procedure Najlepszy_Ruch(tablica: tab; nr_pola: byte;
var wygrana,przegrana,remis: word; var korekt_wygr,korekt_prze: boolean);
begin
if wyg(tablica,O) = true then
begin
inc(przegrana);
korekt_prze := true;
korekt_wygr := false
end
else
if wyg(tablica,X) = true then
begin
inc(wygrana);
korekt_wygr := true;
korekt_prze := false
end
else
if nr_pola = 9 then
begin
inc(remis);
korekt_wygr := false;
korekt_prze := false
end
end;
procedure Spr_Wyg(var tablica: tab; var i1: byte; var j1: byte; znak: char);
begin
if (wyg(tablica,X) = false) and (wyg(tablica,O) = false) then
while i1 < 4 do
begin
j1 := 1;
while j1 < 4 do
begin
if tablica[i1,j1] = ' ' then
begin
tablica[i1,j1] := znak;
if wyg(tablica,X) then
break
else
if wyg(tablica,O) then
break
else
tablica[i1,j1] := ' '
end;
inc(j1)
end;
if wyg(tablica,X) or wyg(tablica,O) then break;
inc(i1)
end
end;
procedure Opcje(tablica: tab; wpom,pom,ilo,zaczynamy,nr_step: byte; bw,br: byte; znak_gracza: char;
var win,prz,rem: word; ent: boolean);
var
wi1, wj1: byte;
begin
wi1 := 1; wj1 := 1;
Spr_Wyg(tablica,wi1,wj1,znak_gracza);
if (wi1 = 4) and (wj1 = 4) then
begin
wi1 := 1; wj1 := 1;
if znak_gracza = O then znak_gracza := X else znak_gracza := O;
Spr_Wyg(tablica,wi1,wj1,znak_gracza);
if (wi1 < 4) and (wj1 < 4) then
begin
if znak_gracza = O then znak_gracza := X else znak_gracza := O;
tablica[wi1,wj1] := znak_gracza; bw := wi1; br := wj1;
if znak_gracza = O then znak_gracza := X else znak_gracza := O;
nr_step := nr_step + 1; pom := 1; wpom := wpom + 1
end
else
begin
if znak_gracza = O then znak_gracza := X else znak_gracza := O;
if (nr_step < 9) and (nr_step > zajete_pole) then
begin
if br < 3 then br := br + 1
else
if bw < 3 then
begin br := 1; bw := bw + 1 end
else
begin br := 1; bw := 1 end;
pom := pom + 1
end;
if ((tablica[bw,br] = ' ') and (zaczynamy = 0)) or ((tablica[bw,br] = ' ') and (zaczynamy = ilo)) then
begin
nr_step := nr_step + 1;
tablica[bw,br] := znak_gracza;
pom := 1; ent := true;
if znak_gracza = O then znak_gracza := X else znak_gracza := O;
if zaczynamy = 0 then zaczynamy := zaczynamy + 1;
if nr_step > zajete_pole then
wpom := wpom + 1
end
else
if tablica[bw,br] = ' ' then zaczynamy := zaczynamy + 1
end
end
else
begin
bw := wi1; br := wj1; nr_step := nr_step + 1; pom := 1; wpom := wpom + 1
end;
korekta_wygranej := false; korekta_przegranej := false;
Najlepszy_Ruch(tablica,nr_step,win,prz,rem,korekta_wygranej,korekta_przegranej);
{writeln;
if (nr_step = 9) or (wyg(tablica,'X') = true)
or (wyg(tablica,'0') = true) then
begin
writeln(bw,' ',br,' nr_step ',nr_step);
for wi1 := 1 to 3 do
begin
for wj1 := 1 to 3 do
write(tablica[wi1,wj1]:4);
writeln
end;
readln;
end;
writeln('przegrana: ',prz);}
if (nr_step < 9) and (wyg(tablica,X) = false) and (wyg(tablica,O) = false) then
Opcje(tablica,wpom,pom,ilo,zaczynamy,nr_step,bw,br,znak_gracza,win,prz,rem,ent);
if nr_step > zajete_pole + 1 then
begin
if pom = 1 then
if wpom > 1 then
tablica[bw,br] := ' '
end
else
if (ilo < 9 - nr_step) and (pom = 1) then
begin
ilo := ilo + 1;
tablica[bw,br] := ' ';
Opcje(tablica,0,0,ilo,0,nr_step-1,bw,br,X,win,prz,rem,false)
end
end;
procedure Spr_Wezla(pocz: wsk_wezla; nast: wsk_wezla; z_pola,w_r,k_c: byte; var p_wartosc: byte; schow: schowek;
wezly: tablica_wezlow; var wygra,przegra,remi: word; var tablica_wag: Tablica_wynikow);
var
l_rows,l_cols: byte;
begin
if (zajete_pole < 3) or (obrona = false) then
begin
korekta_wygranej := false; korekta_przegranej := false;
Najlepszy_Ruch(pocz^.plansza,z_pola,wygra,przegra,remi,korekta_wygranej,korekta_przegranej)
end;
for l_rows := 1 to 9 do
schow[l_rows] := l_rows;
for l_rows := 9 downto zajete_pole + 2 do
begin
if abs(wezly[schow[l_rows]]) = 9 then
begin
pocz := pocz^.galez9;
z_pola := z_pola - 1
end;
if abs(wezly[schow[l_rows]]) = 8 then
begin
pocz := pocz^.galez8;
z_pola := z_pola - 1
end;
if abs(wezly[schow[l_rows]]) = 7 then
begin
pocz := pocz^.galez7;
z_pola := z_pola - 1
end;
if abs(wezly[schow[l_rows]]) = 6 then
begin
pocz := pocz^.galez6;
z_pola := z_pola - 1
end;
if abs(wezly[schow[l_rows]]) = 5 then
begin
pocz := pocz^.galez5;
z_pola := z_pola - 1
end;
if abs(wezly[schow[l_rows]]) = 4 then
begin
pocz := pocz^.galez4;
z_pola := z_pola - 1
end;
if abs(wezly[schow[l_rows]]) = 3 then
begin
pocz := pocz^.galez3;
z_pola := z_pola - 1
end;
if abs(wezly[schow[l_rows]]) = 2 then
begin
pocz := pocz^.galez2;
z_pola := z_pola - 1
end;
if abs(wezly[schow[l_rows]]) = 1 then
begin
pocz := pocz^.galez1;
z_pola := z_pola - 1
end
end;
for l_rows := 1 to 3 do
for l_cols := 1 to 3 do
if pocz^.plansza[l_rows,l_cols] <> ' ' then
if gra[l_rows,l_cols] = ' ' then
if p_wartosc <> Nr_Wezla(l_rows,l_cols) then
begin
if ((zajete_pole < 3) and (obrona = true))
or ((zajete_pole < 4) and (obrona = false)) then
if obrona = true then
tablica_wag[p_wartosc] := przegra - wygra
else
tablica_wag[p_wartosc] := wygra - przegra;
if korekta_wygranej then
tablica_wag[p_wartosc] := tablica_wag[p_wartosc] - 1;
if korekta_przegranej then
tablica_wag[p_wartosc] := tablica_wag[p_wartosc] + 1;
p_wartosc := Nr_Wezla(l_rows,l_cols);
if ((obrona = true) and (zajete_pole >= 3))
or ((obrona = false) and (zajete_pole >= 4)) then
begin
tablica_wag[p_wartosc] := 0;
wygra := 0; remi := 0; przegra := 0;
Opcje(gra,0,0,1,0,z_pola-1,l_rows,l_cols,X,wygra,przegra,remi,false);
if obrona = false then
tablica_wag[p_wartosc] := wygra - przegra
else
tablica_wag[p_wartosc] := przegra
end;
wygra := 0; remi := 0; przegra := 0;
break
end
end;
function Wolne_Pole(pocz: wsk_wezla; var n_rows: byte; var n_cols: byte): boolean;
var
zatrzymanie: boolean;
wiersz,kolumna: byte;
begin
zatrzymanie := false; Wolne_Pole := false;
for wiersz := 1 to 3 do
begin
for kolumna := 1 to 3 do
if pocz^.plansza[wiersz,kolumna] = ' ' then
begin zatrzymanie := true; break end;
if zatrzymanie = true then
begin
n_rows := wiersz; n_cols := kolumna;
Wolne_Pole := zatrzymanie; break
end
end
end;
function Nowy_Ruch(pocz: wsk_wezla; var nast: wsk_wezla; var rows,cols,nr_pola: byte;
var znak: char; var wezly: tablica_wezlow): boolean;
begin
Nowy_Ruch := false;
if (pocz^.plansza[rows,cols] = ' ') and (rows = 1) and (cols = 1) then
begin
New(nast);
nast^.galez1 := pocz;
nast^.plansza := pocz^.plansza;
inc(nr_pola);
if znak = O then
wezly[nr_pola] := Nr_Wezla(rows,cols) * -1
else wezly[nr_pola] := Nr_Wezla(rows,cols);
nast^.plansza[rows,cols] := znak;
if znak = X then znak := O else znak := X
end
else
if (pocz^.plansza[rows,cols] = ' ') and (rows = 1) and (cols = 2) then
begin
New(nast);
nast^.galez2 := pocz;
nast^.plansza := pocz^.plansza;
inc(nr_pola);
if znak = O then
wezly[nr_pola] := Nr_Wezla(rows,cols) * -1
else wezly[nr_pola] := Nr_Wezla(rows,cols);
nast^.plansza[rows,cols] := znak;
if znak = X then znak := O else znak := X
end
else
if (pocz^.plansza[rows,cols] = ' ') and (rows = 1) and (cols = 3) then
begin
New(nast);
nast^.galez3 := pocz;
nast^.plansza := pocz^.plansza;
inc(nr_pola);
if znak = O then
wezly[nr_pola] := Nr_Wezla(rows,cols) * -1
else wezly[nr_pola] := Nr_Wezla(rows,cols);
nast^.plansza[rows,cols] := znak;
if znak = X then znak := O else znak := X
end
else
if (pocz^.plansza[rows,cols] = ' ') and (rows = 2) and (cols = 1) then
begin
New(nast);
nast^.galez4 := pocz;
nast^.plansza := pocz^.plansza;
inc(nr_pola);
if znak = O then
wezly[nr_pola] := Nr_Wezla(rows,cols) * -1
else wezly[nr_pola] := Nr_Wezla(rows,cols);
nast^.plansza[rows,cols] := znak;
if znak = X then znak := O else znak := X
end
else
if (pocz^.plansza[rows,cols] = ' ') and (rows = 2) and (cols = 2) then
begin
New(nast);
nast^.galez5 := pocz;
nast^.plansza := pocz^.plansza;
inc(nr_pola);
if znak = O then
wezly[nr_pola] := Nr_Wezla(rows,cols) * -1
else wezly[nr_pola] := Nr_Wezla(rows,cols);
nast^.plansza[rows,cols] := znak;
if znak = X then znak := O else znak := X
end
else
if (pocz^.plansza[rows,cols] = ' ') and (rows = 2) and (cols = 3) then
begin
New(nast);
nast^.galez6 := pocz;
nast^.plansza := pocz^.plansza;
inc(nr_pola);
if znak = O then
wezly[nr_pola] := Nr_Wezla(rows,cols) * -1
else wezly[nr_pola] := Nr_Wezla(rows,cols);
nast^.plansza[rows,cols] := znak;
if znak = X then znak := O else znak := X
end
else
if (pocz^.plansza[rows,cols] = ' ') and (rows = 3) and (cols = 1) then
begin
New(nast);
nast^.galez7 := pocz;
nast^.plansza := pocz^.plansza;
inc(nr_pola);
if znak = O then
wezly[nr_pola] := Nr_Wezla(rows,cols) * -1
else wezly[nr_pola] := Nr_Wezla(rows,cols);
nast^.plansza[rows,cols] := znak;
if znak = X then znak := O else znak := X
end
else
if (pocz^.plansza[rows,cols] = ' ') and (rows = 3) and (cols = 2) then
begin
New(nast);
nast^.galez8 := pocz;
nast^.plansza := pocz^.plansza;
inc(nr_pola);
if znak = O then
wezly[nr_pola] := Nr_Wezla(rows,cols) * -1
else wezly[nr_pola] := Nr_Wezla(rows,cols);
nast^.plansza[rows,cols] := znak;
if znak = X then znak := O else znak := X
end
else
if (pocz^.plansza[rows,cols] = ' ') and (rows = 3) and (cols = 3) then
begin
New(nast);
nast^.galez9 := pocz;
nast^.plansza := pocz^.plansza;
inc(nr_pola);
if znak = O then
wezly[nr_pola] := Nr_Wezla(rows,cols) * -1
else wezly[nr_pola] := Nr_Wezla(rows,cols);
nast^.plansza[rows,cols] := znak;
if znak = X then znak := O else znak := X
end
else
begin wie := rows; kol := cols;
Wolne_Pole(pocz,wie,kol);
rows := wie; cols := kol;
Nowy_Ruch := true
end
end;
procedure N_Wezel(pocz: wsk_wezla; nast: wsk_wezla; var p_war: byte; rows,cols,nr_pola,poziom: byte; var rot: byte; znak: char;
wezly: tablica_wezlow; schow: schowek; var tab_wag: Tablica_Wynikow);
var
wi,wj,o1: byte;
przeskok: boolean;
begin
przeskok := false;
if zajete_pole >= 3 then begin
wi := 1; wj := 1;
Spr_Wyg(pocz^.plansza,wi,wj,znak);
if (wi < 4) and (wj < 4) then
begin
rows := wi; cols := wj;
pocz^.plansza[rows,cols] := ' ';
przeskok := true
end
else
begin
if znak = X then znak := O else znak := X;
wi := 1; wj := 1;
Spr_Wyg(pocz^.plansza,wi,wj,znak);
if (wi < 4) and (wj < 4) then
begin
if znak = X then znak := O else znak := X;
rows := wi; cols := wj;
pocz^.plansza[rows,cols] := ' ';
przeskok := true
end
else
if znak = X then znak := O else znak := X end end;
if Nowy_Ruch(pocz,nast,rows,cols,nr_pola,znak,wezly) = true then
begin
przeskok := true;
Nowy_Ruch(pocz,nast,rows,cols,nr_pola,znak,wezly)
end;
pocz := nast;
inc(poziom);
if (wyg(pocz^.plansza,O) = true) or (wyg(pocz^.plansza,X) = true) or (nr_pola <= 9) then
if Wyszukanie_Wzorca(nast,gra,schow,wezly) then
Spr_Wezla(nast,pocz,nr_pola,rows,cols,p_war,schow,wezly,l_win,l_lost,l_tie,tab_wag);
if przeskok = false then
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^.plansza,X) = false) and (wyg(pocz^.plansza,O) = false) then
N_Wezel(pocz,nast,p_war,rows,cols,nr_pola,poziom,rot,znak,wezly,schow,tab_wag);
if nr_pola = 9 then rot := poziom - 2
else
if (wyg(pocz^.plansza,X) = true) or (wyg(pocz^.plansza,O) = true) then
if zajete_pole < 3 then
rot := poziom - 1
else rot := nr_pola - 3;
if (poziom > 0) and (poziom <= rot) then
begin
o1 := 0;
while o1 <= (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;
N_Wezel(pocz,nast,p_war,rows,cols,nr_pola,poziom,rot,znak,wezly,schow,tab_wag);
inc(o1)
end;
dec(poziom)
end
end;
procedure Wspolrzedne_Ruchu(pocz,nast: wsk_wezla; nr_n_pola:byte; znak: char;
pocz_wiersz,pocz_kolumna: byte; var wag_tab: Tablica_Wynikow; var rozm: integer);
var
we_rows,we_cols: byte;
begin
we_rows := 1; we_cols := 1;
Spr_Wyg(gra,we_rows,we_cols,X);
if (we_rows < 4) and (we_cols < 4) then
writeln('Wygrał: ',X)
else
begin
we_rows := 1; we_cols := 1;
Spr_Wyg(gra,we_rows,we_cols,O);
if (we_rows < 4) and (we_cols < 4) then
gra[we_rows,we_cols] := X
else
begin
rotacja := 0;
N_Wezel(pocz,nast,nr_n_pola,pocz_wiersz,pocz_kolumna,0,0,
rotacja,znak,t_wezly,t_schowek,wag_tab);
rozm := length(wag_tab)
end
end
end;
function Czy_Zajete(nr_indeks: byte; var optymalna: integer; var przechowywana: integer;
opcja: byte; znak: char): boolean;
var
wr,kc: byte;
begin
Czy_Zajete := false;
if nr_indeks mod 3 = 0 then
begin
wr := nr_indeks div 3;
kc := 3
end
else
begin
wr := (nr_indeks div 3) + 1;
kc := nr_indeks mod 3
end;
if opcja = 1 then
begin
if (gra[wr,kc] <> ' ') and ((wr <> 3) or (kc <> 3)) then
optymalna := przechowywana;
if (wr = 3) and (kc = 3) then Czy_Zajete := true
end
else
if opcja = 2 then
begin
if gra[wr,kc] = ' ' then
begin
przechowywana := przechowywana + 1;
Czy_Zajete := true
end
end
else
gra[wr,kc] := znak
end;
procedure Nowa_Tablica(var numery_pol: Tablica_Wynikow; opt_liczba,schowek: integer;
var nowy_rozmiar: integer; znak: char);
var
lokalne_i: byte;
begin
nowy_rozmiar := 0;
for lokalne_i := 1 to 9 do
if numery_pol[lokalne_i] = opt_liczba then
begin
if Czy_Zajete(lokalne_i,opt_liczba,schowek,2,znak) then
begin
numery_pol[schowek] := lokalne_i;
nowy_rozmiar := nowy_rozmiar + 1;
if schowek <> lokalne_i then numery_pol[lokalne_i] := 0
end
end
else
numery_pol[lokalne_i] := 0
end;
procedure X_Y(nr_pola: byte);
var
pi,pj: byte;
begin
if nr_pola mod 3 = 0 then
begin
pi := nr_pola div 3;
pj := 3
end
else
begin
pi := (nr_pola div 3) + 1;
pj := nr_pola mod 3
end;
gra[pi,pj] := X
end;
procedure Indeksy_Tablicy(rezultat: Tablica_Wynikow; first_comp: boolean; s_x,s_y,licz_pol: byte;
zacz_znak: char);
var
spr_liczba,pom_schowek,dl_tab: integer;
proce_i,proce_j,start_pole: byte;
begin
spr_liczba := 0; obrona := first_comp; dl_tab := 0;
for proce_i := 1 to 3 do
begin
for proce_j := 1 to 3 do
begin
start_pole := Nr_Wezla(proce_i,proce_j);
if gra[proce_i,proce_j] = ' ' then break
end;
if gra[proce_i,proce_j] = ' ' then break
end;
Wspolrzedne_Ruchu(opcja,n_opcja,start_pole,zacz_znak,s_x,s_y,rezultat,dl_tab);
writeln;
for proce_i := 1 to 9 do
write(rezultat[proce_i]:8);
writeln;
if obrona = false then
begin
proce_j := 1;
spr_liczba := -10000;
repeat
for proce_i := proce_j to 9 do
if spr_liczba < rezultat[proce_i] then
begin
pom_schowek := spr_liczba;
spr_liczba := rezultat[proce_i];
proce_j := proce_i;
if rezultat[proce_i] = 0 then break
end;
indeks := proce_i; proce_j := proce_j + 1
until Czy_Zajete(indeks,spr_liczba,pom_schowek,1,zacz_znak);
if licz_pol >= 4 then
if spr_liczba > 0 then
for proce_i := 1 to 9 do
if rezultat[proce_i] = 9 - licz_pol + 1 then
spr_liczba := rezultat[proce_i]
end
else
begin
proce_j := 1;
spr_liczba := rezultat[proce_j];
repeat
for proce_i := proce_j to 9 do
if spr_liczba > rezultat[proce_i] then
begin
pom_schowek := spr_liczba;
spr_liczba := rezultat[proce_i];
proce_j := proce_i;
if rezultat[proce_i] = 0 then break
end;
indeks := proce_i; proce_j := proce_j + 1
until Czy_Zajete(indeks,spr_liczba,pom_schowek,1,zacz_znak)
end;
if dl_tab <> 0 then
begin
dl_tab := 0;
Nowa_Tablica(rezultat,spr_liczba,0,dl_tab,zacz_znak);
writeln('Ewentualne numery pol od 1 do 9');
for proce_i := 1 to dl_tab do
write(rezultat[proce_i]:4);
randomize;
spr_liczba := random(dl_tab) + 1;
X_Y(rezultat[spr_liczba])
end
end;
procedure First_User;
begin
repeat
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] := ' ';
for i := 1 to 9 do
begin
t_wezly[i] := 0;
t_schowek[i] := 0;
Wyniki[i] := 0
end;
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;
l_win := 0; l_lost := 0; l_tie := 0;
writeln('Podaj współrzędne: ');
readln(i,j);
gra[i,j] := O;
writeln('Tablica po wstawieniu znaku przez gracza');
for wie := 1 to 3 do
begin
for kol := 1 to 3 do
write(gra[wie,kol]:4);
writeln
end;
zajete_pole := zajete_pole + 1;
if zajete_pole = 1 then
begin start_rows := i; start_cols := j end;
if zajete_pole < 9 then
begin
Indeksy_Tablicy(Wyniki,true,start_rows,start_cols,zajete_pole,O);
zajete_pole := zajete_pole + 1;
writeln;
writeln('Tablica po wstawieniu znaku przez komputer');
for i := 1 to 3 do
begin
for j := 1 to 3 do
write(gra[i,j]:4);
writeln
end
end
until (Wyg(gra,X) = true) or (Wyg(gra,O) = true) or (zajete_pole = 9)
end;
procedure First_Comp;
begin
repeat
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] := ' ';
for i := 1 to 9 do
begin
t_wezly[i] := 0;
t_schowek[i] := 0;
Wyniki[i] := 0
end;
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;
l_win := 0; l_lost := 0; l_tie := 0;
if zajete_pole = 0 then
begin
randomize;
repeat
start_rows := random(3) + 1;
start_cols := random(3) + 1;
until ((start_rows <> 2) and (start_cols <> 2)) or ((start_rows = 2) and (start_cols = 2));
gra[start_rows,start_cols] := X;
writeln('Komputer zaczyna od pola: ',start_rows,' ',start_cols);
zajete_pole := zajete_pole + 1
end
else
begin
Indeksy_Tablicy(Wyniki,false,start_rows,start_cols,zajete_pole,X);
zajete_pole := zajete_pole + 1;
end;
writeln;
writeln('Tablica po wstawieniu znaku przez komputer');
for i := 1 to 3 do
begin
for j := 1 to 3 do
write(gra[i,j]:4);
writeln
end;
if (zajete_pole < 9) and (Wyg(gra,X) = false) then
begin
writeln('Podaj współrzędne: ');
readln(i,j);
gra[i,j] := O;
zajete_pole := zajete_pole + 1;
writeln('Tablica po wstawieniu znaku przez gracza');
for i := 1 to 3 do
begin
for j := 1 to 3 do
write(gra[i,j]:4);
writeln
end
end
until (Wyg(gra,X) = true) or (Wyg(gra,O) = true) or (zajete_pole = 9)
end;
begin
ClrScr;
for i := 1 to 3 do
for j := 1 to 3 do
gra[i,j] := ' ';
O := '0'; X := 'X'; { Można zamienić :) }
zajete_pole := 0; { Liczba zajetych pól na planszy. }
{First_User;} { pierwszy gracz }
{ Procedury można testować na zmianę komentując jedną a odkomentowując drugą.}
First_Comp; { --||-- komputer }
writeln('Koniec :)');
readln
end.