Witam. Mam problem z zaimplementowaniem algorytmu MINIMAX do gry kółko i krzyżyk. Program się kompiluje, z tym że komputer nie zawsze wybiera najlepszą drogę, tj. da się z nim wygrać. Czy ktoś mógłby wskazać mój błąd, albo zaproponować inne podejście do problemu? Z góry dziękuję.
program minimax;
var tab : array[1..9] of char;
gracz : char;
i : integer;
procedure plansza;
var i : integer;
begin
writeln;
for i := 1 to 9 do
begin
write (' ', tab[i], ' |');
if ((i = 3) or (i = 6)) then
begin
writeln;
writeln('------------');
end;
end;
writeln;
writeln;
end;
function wygrana (g : char; sprawdzanie : boolean) : boolean;
var test : boolean;
i : integer;
begin
test := false;
for i := 0 to 2 do
begin
if (tab[1 + 3*i] = g) and (tab[2 + 3*i] = g) and (tab[3 + 3*i] = g) then test := true;
if (tab[1 + i] = g) and (tab[4 + i] = g) and (tab[7 + i] = g) then test := true;
end;
if (tab[1] = g) and (tab[5] = g) and (tab[9] = g) then test := true;
if (tab[3] = g) and (tab[5] = g) and (tab[7] = g) then test := true;
if (test) then
begin
if (not sprawdzanie) then
begin
plansza;
writeln('Wygrywa ', g);
end;
wygrana := true;
end
else wygrana := false;
end;
function remis (sprawdzanie : boolean) : boolean;
var i : integer;
pom : boolean;
begin
pom := false;
for i := 1 to 9 do
begin
if(tab[i] = ' ') then
begin
remis := false;
pom := true;
end;
end;
if (not pom) then
begin
if (not sprawdzanie) then
begin
plansza;
writeln('Remis');
remis := true;
end;
end;
end;
function minimax(gracz : char) : integer;
var m, mmx, i : integer;
pom : boolean;
begin
pom := false;
if (wygrana(gracz, true)) then
begin
if (gracz = 'X') then
begin
pom := true;
minimax := 1;
end
else if (gracz = 'O') then
begin
pom := true;
minimax := -1;
end;
end;
if (remis(true)) then
begin
pom := true;
minimax := 0;
end;
if (not pom) then
begin
if (gracz = 'X') then gracz := 'O'
else if (gracz = 'O') then gracz := 'X';
if (gracz = 'O') then mmx := 10
else if (gracz = 'X') then mmx := -10;
for i := 1 to 9 do
begin
if (tab[i] = ' ') then
begin
tab[i] := gracz;
m := minimax (gracz);
tab[i] := ' ';
if (((gracz = 'O') and (m < mmx)) or ((gracz = 'X') and (m > mmx))) then mmx := m;
end;
end;
minimax := mmx;
end;
end;
function komputer (gracz : char) : integer;
var ruch, i, j, m, mmx : integer;
begin
mmx := -10;
for i := 1 to 9 do
begin
if (tab[i] = ' ') then
begin
tab[i] := gracz;
m := minimax (gracz);
tab[i] := ' ';
if (m > mmx) then
begin
mmx := m;
ruch := i
end;
end;
end;
komputer := ruch;
end;
procedure ruch (gracz : char);
var r : integer;
begin
plansza;
if (gracz = 'O') then
begin
{writeln('Wybierz ruch: ');
writeln('1 2 3');
writeln('4 5 6');
writeln('7 8 9');
readln(r); }
writeln('Ruch komputera');
r := komputer('O');
end
else
begin
writeln('Ruch komputera');
r := komputer('X');
end;
if ((r >= 1) and (r <= 9) and (tab[r] = ' ')) then tab[r] := gracz;
end;
begin
for i := 1 to 9 do tab[i] := ' ';
//gracz := 'O';
while ((not wygrana('X', false)) and (not wygrana('O', false)) and (not remis(false))) do
begin
ruch('O');
ruch('X');
{ if (gracz = 'O') then gracz := 'X'
else gracz := 'O'; }
end;
readln;
end.