Der MiniMax-Algorithmus ist eine künstliche Intelligenz, die in der Simulation von Brettspielen oder ähnlichem sehr viel Verwendung findet. Das Arbeitsprinzip des Algorithmus sieht folgendermaßen aus:
Von einer Ausgangsposition simuliert der Computer abwechselnd eigene und gegnerische Züge (alle, die es gibt) bis zu einer bestimmten Tiefe, bei der er dann die Stellung bewertet. Diese Bewertung sieht so aus, dass eine günstige Stellung für ihn einen positiven (großen) Wert erhält, eine günstige Stellung für den Gegner erhält einen negativen (niedrigen) Wert.
Hierdurch entsteht nun ein Spielbaum. Ganz oben befindet sich die Ausgangsposition. Von dieser zweigen ab alle Stellungen, die der Computer durch einen Zug erreichen kann. Von jenen Stellungen wiederum zweigen jeweils wieder alle Stellungen ab, die durch einen erneuten Zug des Spielers (der Computer simuliert ja diesen gegnerischen Zug) erreicht werden können. Etc. etc. bis irgendwann Schluss ist, und der Baum entweder eine vorgeschriebene Tiefe erreicht hat oder - wie in diesem Beispiel - ein Endzustand (Sieg, Niederlage oder Brett ist voll) erreicht ist.
Nun versucht der Rechner einen Weg zurückzuverfolgen, auf dem er auf eine für ihn möglichst günstige Stellung auf der letzten Eben des Baumes gelangt. Zu diesem Zweck sucht er sich aus allen Stellungswerten, die er durch einen eigenen Zug erreichen kann, das Maximum heraus und gibt dieses weiter an den Elternknoten. Aus allen Stellungswerten, die durch einen simulierten gegnerischen Zug entstanden sind, wählt er denjenigen, der am kleinsten ist. Der Computer geht nämlich davon aus, dass der Spieler den seinerseits besten Zug nimmt und dadurch die schlechteste Stellung für den PC erreicht.
Durch dieses Weitergeben von abwechselnd maximierten und minimierten Knoten erhält der Computer nun für jede ihm zur Verfügung stehende Auswahl einen bestimmten Wert, der ihm angibt, welche der Auswahl er am günstigsten treffen sollte.
Dies hört sich wahrscheinlich alles sehr schwer verständlich an, ist es aber wirklich nicht. Am besten einfach mal in Google "MiniMax" eintippen oder ähnliches. Unter den Suchergebnissen wird man sicher viele lustige Bildchen mit beschriebenen Spielbäumen finden. Visuell dargestellt lässt sich das ganze dann sehr viel einfacher begreifen =)
History
09.07.2003 Hinzugefügt
Autor: Benjamin Schröder <immoertael_auf_gmx.de>
Code aus frmTicTacToe.frm
Option Explicit
Dim SpielerZug As Boolean
Dim Spielfeld(2, 2) As String
Dim TOTALSTONES As Integer
Private Sub Command1_Click()
ResetGame
Randomize
Dim i%, j%
i = Int(Rnd * 2 + 0.5)
j = Int(Rnd * 2 + 0.5)
Feld.TextMatrix(i, j) = "O"
Spielfeld(i, j) = "O"
TOTALSTONES = TOTALSTONES + 1
SpielerZug = True
Label1.Caption = "Spieler am Zug.."
End SubPrivate Sub Feld_Click()
If SpielerZug Then
If Feld.TextMatrix(Feld.RowSel, Feld.ColSel) = "" Then
Feld.TextMatrix(Feld.RowSel, Feld.ColSel) = "X"
Spielfeld(Feld.RowSel, Feld.ColSel) = "X"
TOTALSTONES = TOTALSTONES + 1
If GameOver = "X" Then
If MsgBox("Gewonnen! (Sollte eigentlich unmöglich sein?) " & _
"Nochmal spielen?", vbYesNo, "Sieg") = vbYes Then
ResetGame
Else
Exit Sub
End If
ElseIf GameOver = "Unentschieden" Then
If MsgBox("Unentschieden. Nochmal?", vbYesNo, _
"Unentschieden") = vbYes Then
ResetGame
Else
Exit Sub
End If
End If
SpielerZug = False
Label1.Caption = "KI rechnet.."
Form1.MousePointer = 11
DoEvents
Dim i, j As Integer
Dim Bewertung(2, 2) As Integer
For i = 0 To 2
For j = 0 To 2
Bewertung(i, j) = -50
Next j
Next i
For i = 0 To 2
For j = 0 To 2
If Feld.TextMatrix(i, j) = "" Then
Spielfeld(i, j) = "O"
TOTALSTONES = TOTALSTONES + 1
Bewertung(i, j) = KI(1, -10000, 10000, "X")
Spielfeld(i, j) = ""
TOTALSTONES = TOTALSTONES - 1
End If
Next j
Next i
Dim MaxWert%, MaxPos(1) As Integer
MaxWert = -30
For i = 0 To 2
For j = 0 To 2
If Bewertung(i, j) > MaxWert Then
MaxWert = Bewertung(i, j)
MaxPos(0) = i
MaxPos(1) = j
End If
Next j
Next i
Feld.TextMatrix(MaxPos(0), MaxPos(1)) = "O"
Spielfeld(MaxPos(0), MaxPos(1)) = "O"
TOTALSTONES = TOTALSTONES + 1
Label1.Caption = "Spieler am Zug.."
Form1.MousePointer = 0
If GameOver = "O" Then
If MsgBox("Die KI hat gewonnen! Nochmal spielen?", _
vbYesNo, "Sieg") = vbYes Then
ResetGame
Else
Exit Sub
End If
ElseIf GameOver = "Unentschieden" Then
If MsgBox("Unentschieden. Nochmal?", vbYesNo, _
"Unentschieden") = vbYes Then
ResetGame
Else
Exit Sub
End If
End If
SpielerZug = True
End If
End If
End Sub
Private Function GameOver() As String
Dim i%
For i = 0 To 2
If Spielfeld(i, 0) <> "" And Spielfeld(i, 0) = Spielfeld(i, _
1) And Spielfeld(i, 1) = Spielfeld(i, 2) Then
GameOver = Spielfeld(i, 0)
Exit Function
End If
Next i
For i = 0 To 2
If Spielfeld(0, i) <> "" And Spielfeld(0, i) = Spielfeld(1, _
i) And Spielfeld(1, i) = Spielfeld(2, i) Then
GameOver = Spielfeld(0, i)
Exit Function
End If
Next i
If Spielfeld(2, 0) <> "" And Spielfeld(2, 0) = Spielfeld(1, 1) _
And Spielfeld(1, 1) = Spielfeld(0, 2) Then
GameOver = Spielfeld(2, 0)
Exit Function
End If
If Spielfeld(0, 0) <> "" And Spielfeld(0, 0) = Spielfeld(1, 1) _
And Spielfeld(1, 1) = Spielfeld(2, 2) Then
GameOver = Spielfeld(0, 0)
Exit Function
End If
If TOTALSTONES = 9 Then
GameOver = "Unentschieden"
End If
End Function
Private Function KI(Tiefe, a, b As Integer, Spieler As String) As _
Integer
Dim w, i, j As Integer
If GameOver = "X" Then
KI = -1 * (10 - Tiefe)
ElseIf GameOver = "O" Then
KI = 10 - Tiefe
ElseIf GameOver = "Unentschieden" Then
KI = 0
Else
For i = 0 To 2
For j = 0 To 2
If Spielfeld(i, j) = "" Then
Spielfeld(i, j) = Spieler
TOTALSTONES = TOTALSTONES + 1
If Spieler = "X" Then
w = KI(Tiefe + 1, -10000, 10000, "O")
Else
w = KI(Tiefe + 1, -10000, 10000, "X")
End If
If Tiefe Mod 2 = 0 Then
If w > a Then
a = w
End If
Else
If w < b Then
b = w
End If
End If
Spielfeld(i, j) = ""
TOTALSTONES = TOTALSTONES - 1
End If
Next j
Next i
If Tiefe Mod 2 = 0 Then
KI = a
Else
KI = b
End If
End If
End Function
Private Sub ResetGame()
Dim i%, j%
TOTALSTONES = 0
For i = 0 To 2
For j = 0 To 2
Spielfeld(i, j) = ""
Feld.TextMatrix(i, j) = ""
Next j
Next i
Feld.Refresh
End Sub
Private Sub Form_Load()
Dim i%
For i = 0 To 2
Feld.ColWidth(i) = 640
Feld.RowHeight(i) = 640
Next i
SpielerZug = True
End Sub