Jaka funkcja oceny? Connect4 + Minimax

0

Witam,

od jakiegoś czasu na przemian próbuje znaleźć/stworzyć dobrą funkcję oceny do gry pt. Connect4. Sztuczną inteligencję opieram na algorytmie minimax z alfa-beta cięciami.

Ogólnie rzecz biorąc cały program mam już gotowy. Spokoju nie daje mi jedynie heureza. Nie musi być doskonała, ale ważna aby nie była głupia.

Moja funkcja oceny opera się na wcześniej stworzonych stringach, które zawierają w sobie wszystkie elementy poziomo, pionowo i po obu skosach. Oczywiście każdy pion, poziom czy skos jest oddzielnym stringiem. Nie łączy się z poprzednim. Z tego względu pozwoliłem sobie zrobić coś takiego:

public void SetQuality(int Player)
        {
            int Player1 = 0;
            int Player2 = 0;

            foreach (string Str in this.LevelStrings)
            {
                if (Str.Contains("1111")) Player1 += 1000; // 0 - Pole puste, 1 - Gracz 1, 2 - Gracz 2
                if (Str.Contains("0111")) Player1 += 100;
                if (Str.Contains("1110")) Player1 += 100;
                if (Str.Contains("0011")) Player1 += 30;
                if (Str.Contains("0110")) Player1 += 30;
                if (Str.Contains("1100")) Player1 += 30;
                if (Str.Contains("1000")) Player1 += 1;
                if (Str.Contains("0100")) Player1 += 1;
                if (Str.Contains("0010")) Player1 += 1;
                if (Str.Contains("0001")) Player1 += 1;

                if (Str.Contains("2222")) Player2 += 1000;
                if (Str.Contains("0222")) Player2 += 100;
                if (Str.Contains("2220")) Player2 += 100;
                if (Str.Contains("0022")) Player2 += 30;
                if (Str.Contains("0220")) Player2 += 30;
                if (Str.Contains("2200")) Player2 += 30;
                if (Str.Contains("2000")) Player2 += 1;
                if (Str.Contains("0200")) Player2 += 1;
                if (Str.Contains("0020")) Player2 += 1;
                if (Str.Contains("0002")) Player2 += 1;
            }
            
            if (Player == 1) Quality = Player1 - Player2;
            else Quality = Player2 - Player1;
        }

Na początku jest ok. Dla CPU wybierane jest środkowe pole czyli to z największą początkową szansą na połączenie 4 elementów. Problemem jednak jest stan gry w którym po dodaniu elementu mam ich 3 pod rząd. Minimax nie powinien dopuścić do takiej sytuacji gdzie w następnym ruchu mam pewną wygraną. Niestety zamiast blokować ruch dostawia swój klocek do siebie...

Jeśli ktoś ma jakiś pomysł z chęcią poczytam ;) Z góry dzięki.

0

Po kilku godzinach znalazłem błąd. Funkcja oceny jest ok. Przy debugowaniu projektu zauważyłem, że sam algorytm minimax się gubi. Może ktoś rzucić okiem?

http://speedy.sh/cdec2/Connect4AI.rar

1 użytkowników online, w tym zalogowanych: 0, gości: 1