Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

18.06.2011, 11:06

Problem mit MinMax-Algorithmus

Guten Tag,
ich habe ein kleines VierGewinnt geschrieben, welches auch wunderbar funktioniert. Jetzt möchte ich eine KI, basierend auf dem MinMax-Algorithmus, hinzufügen. Vom Prinzip her ist das nicht so schwer, ich gehe rekursiv immer alle sieben Möglichkeiten durch, die man zum Setzen hat (meißtens, am Ende auch weniger), bis zu einer bestimmten Suchtiefe. Dabei wird immer bewertet, wie gut eine Zug ist, bis jetzt gibt es aber nur Sieg oder Niederlage als Kriterium (+1 oder -1). Ist man selber am Zug, so wird der für einen selber beste Zug zurückgegeben, ist der Gegner am Zug für ihn der Beste.
Ich muss wohl gerade ein Brett vorm Kopf haben, aber ich finde den Fehler in meinem Code nicht. Die KI setzt, ohne das ich ein System dahinter erkennen könnte. Die Züge die sie macht sind aber keineswegs sinnvoll, da sie direkte Bedrohungen nicht erkennt (z.B. drei in einer Reihe).

Hier mein Code:
Die Klasse CSituation ist nichts anderes als ein Abbild des Spielfeldes, auf das man Steine setzen kann (SetCoin()) oder überprüfen kann, ob ein Spieler gewonnen hat (PlayerWin()). Hier die zwei relevanten Methoden: GetDecision wird aufgerufen, wenn die KI eine Entscheidung treffen soll

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
int CKI::GetDecision(const CSituation& Situation)
{
    int Depth = 8;
    int Best = 0;
    int BestValue = -2;

    for(int i=0;i<7;++i)
    {
        CSituation* NewSituation = new CSituation(Situation);
        if(!NewSituation->SetCoin(mWhoAmI, i))
        {
            delete NewSituation;
            continue;
        }

        int Value = Rate(*NewSituation, i, Depth, 0);
        if(Value > BestValue)
        {
            BestValue = Value;
            Best = i;
        }
        delete NewSituation;
    }
    return Best;
}

int CKI::Rate(const CSituation& Situation, int LastCoinX, int Depth, int Level)
{
    if(Level%2 == 0)
    {
        if(Situation.PlayerWin(mWhoAmINot, LastCoinX)) return -1;
    }
    else
    {
        if(Situation.PlayerWin(mWhoAmI, LastCoinX)) return 1;
    }

    if(Level < Depth)
    {
        int Best = 0;
        int BestValue = -2;
        int Worst = 0;
        int WorstValue = 2;

        for(int i=0;i<7;++i)
        {
            CSituation* NewSituation = new CSituation(Situation);
            if(!NewSituation->SetCoin((Level%2==0)?mWhoAmI:mWhoAmINot, i))
            {
                delete NewSituation;
                continue;
            }

            int Value = Rate(*NewSituation, i, Depth, Level+1);
            if(Value > BestValue)
            {
                BestValue = Value;
                Best = i;
            }
            else if(Value < WorstValue)
            {
                WorstValue = Value;
                Worst = i;
            }

            delete NewSituation;
        }

        if(Level%2 == 0) return Best;
        else return Worst;

    }
    else return 0;
}


Könnte vielleicht jemand mal drübergucken?
Wäre echt nett :thumbup:

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

18.06.2011, 11:19

"denn die 7 ist meine Zahl"[/quote] :thumbsup:
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Dieser Beitrag wurde bereits 7 mal editiert, zuletzt von »BlueCobold« (18.06.2011, 11:36)


3

18.06.2011, 11:54

und er editiert seinen beitrag sieben mal :thumbsup:
ein feld ist nunmal 7x6 groß... :rolleyes:

Werbeanzeige