min max (problem)

no1nick
Użytkownik
Użytkownik
Posty: 1
Rejestracja: 16 gru 2008, o 14:34
Płeć: Mężczyzna
Lokalizacja: Elbląg

min max (problem)

Post autor: no1nick »

Mam problem z działaniem algorytmu min max. Niby wszystko ok ale tylko przy rozmiarze 10 x 10 i to tez nie zawsze. Mianowicie chodzi o to ,że komputer wybiera pola, które sa zaznaczone albo nie chcę wybierac nic innego po za 1wszym wierszem a takze przy wiekszych rozmiarach strasznie zamula tzw. chyba xle dobirem głebokosc drzewa i w zlym miejscu ją ustawiłem. prosze o pomoc daje kod funckji na bazie której działa komputer.
int komputer(char **t, int a)
{
int ruch, i,j,w,k, m, mmx,gl=0;
cout<<endl<<"|----------------------------------|"<<endl;
cout<<"Komputer mysli...prosze czekac"<<endl;
mmx = -3;
for(i = 0; i <a; i++)
{for(j=0;j<a;j++)
{
if(t[j] == ' ')
{
t[j] = 'x';
m = minimax(t,a,'x',gl);
t[j] = ' ';



if(m > mmx)
{
mmx = m; ruch = (i+1)*(j+1);
}
}
}
}
return ruch;
}

int minimax(char **t,int a, char gracz,int gl)
{
int m, mmx;

// Najpierw sprawdzamy, czy bieżący gracz wygrywa na planszy. Jeśli tak, to
// zwracamy jego maksymalny wynik

if(gl<3){
if(wygrana(t,a,gracz,true)) return (gracz == 'x') ? 1 : -1;

// Następnie sprawdzamy, czy nie ma remisu. Jeśli jest, zwracamy wynik 0

if(remis(t,a,true)) return 0;

// Będziemy analizować możliwe posunięcia przeciwnika. Zmieniamy zatem
// bieżącego gracza na jego przeciwnika

gracz = (gracz == 'x') ? 'o' : 'x';

// Algorytm MINIMAX w kolejnych wywołaniach rekurencyjnych naprzemiennie analizuje
// grę gracza oraz jego przeciwnika. Dla gracza oblicza maksimum wyniku gry, a dla
// przeciwnika oblicza minimum. Wartość mmx ustawiamy w zależności od tego, czyje
// ruchy analizujemy:
// X - liczymy max, zatem mmx <- -3
// O - liczymy min, zatem mmx <- 3
mmx = (gracz=='o') ? 3 : -3;


// Przeglądamy planszę szukając wolnych pół na ruch gracza. Na wolnym polu ustawiamy
// literkę gracza i wyznaczamy wartość tego ruchu rekurencyjnym wywołaniem
// algorytmu MINIMAX. Planszę przywracamy i w zależności kto gra:
// X - wyznaczamy maximum
// O - wyznaczamy minimum

for(int i = 0; i < a; i++)
{for(int j = 0;j<a;j++)
{
if(t[j] == ' ')
{
t[j] = gracz;
m = minimax(t,a,gracz,gl+1);
t[j] = ' ';
if(((gracz == 'o') && (m < mmx)) || ((gracz == 'x') && (m > mmx)))
{
mmx = m;

}
}
}
}

return mmx;
}return mmx;
}
ODPOWIEDZ