2017-08-22 2 views
-1

Ich arbeite an der KI von Tic Tac Toe (Benutzer vs Computer) und ich benutze Minimax-Algorithmus, um beste Bewegung für Computer zu implementieren. Ich habe ein paar Videos auf Youtube angeschaut und den Code einiger Leute gelesen. Allerdings gibt es Teile des Codes Ich bin immer noch verwirrt von dem, was tut. Nehmen wir zum Beispiel den folgenden Code von Tic Tac Toe Minimax-Funktion. Es gibt eine Hauptsache, wenn, sonst wenn, else-Anweisung und alles andere kommt von dort. Mein Hauptproblem ist das Verständnis der eingebetteten for-Schleife und der 2 ifs, die darauf folgen. Ich habe ein paar Kommentare zu dem Zeug geschrieben, denke ich, tut es. Ich nahm den Beispielcode von diesem Youtube-Video: https://www.youtube.com/watch?v=x_Je9i3aKNk Minimax-Funktion für Tic Tac Toe.könnte jemand erklären Minimax Tic Tac Toe Algorithmus

//minimax function 
function minimax(newGrid, depth, player) { 
    const gameState = isGameOver(newGrid); 
    //if the game is not over, evalute best move for computer 
    if(gameState === false) { 
     const values = []; 

     for(var i = 0; i < 3; i++) { 
      for(var j = 0; j < 3; j++) { 
       const gridCopy = _.cloneDeep(newGrid); 
       //if that spot is taken, skip to next loop 
       if(gridCopy[i][j] !== ' ') continue; 
       //if spot is player, evaluate 
       gridCopy[i][j] = player; 
       //need clarification 
       const value = minimax(gridCopy, depth+1, (player == PLAYER_TOKEN) ? COMPUTER_TOKEN : PLAYER_TOKEN); 
       values.push(value); 
      } 
     } 
     //need clarification for computer turn 
     if(player === COMPUTER_TOKEN) { 
      const max = _.maxBy(value, (v) => { 
       return v.cost; 
      }); 
      if(depth === 0) { 
       return max.cell; 
      } 
      else { 
       return max.cost; 
      } 
     //need clarification for user turn 
     else { 
      const min = _.minBy(value, (v) => { 
       return v.cost; 
      }); 
      if(depth === 0) { 
       return v.cell; 
      } 
      else { 
       return v.cost; 
      } 
     } 

    //if game state is null return 0 
    else if (gameState === null) { 
     return 0; 
    } 
    //if game state is player return negative 
    else if(gameState === PLAYER_TOKEN) { 
     return depth - 10; 
    } 
    //if game state is computer return positive 
    else if(gameState === COMPUTER_TOKEN) { 
     return 10 - depth; 
    } 
} 

Antwort

4

Der Schlüssel zum Minimax-Algorithmus ist ein hin und her zwischen den beiden Spielern, wo der Spieler, das „dreht es“ wünscht, die Bewegung mit der maximalen Punktzahl zu holen. Die Punktzahlen für jede der verfügbaren Züge werden wiederum durch den gegnerischen Spieler bestimmt, der entscheidet, welche seiner verfügbaren Züge die Mindestpunktzahl aufweist. Und die Punktzahlen für die Züge der gegnerischen Spieler werden wiederum dadurch bestimmt, dass der am Zug befindliche Spieler versucht, seine Punktzahl zu maximieren, und so weiter den gesamten Bewegungsbaum bis zu einem Endzustand herunter.

Eine Beschreibung für den Algorithmus ist unter der Annahme, X das „Turn-Spieler nehmen“, so etwas wie aussehen:

  • Wenn das Spiel vorbei ist, kehrt die Partitur von X Sicht.
  • Ansonsten eine Liste der neuen Spielzustände für jede mögliche Bewegung
  • eine Liste Partituren
  • Für jeden dieser Zustände erstellen erhalten fügen Sie das Minimax-Ergebnis von diesem Zustand in die Liste Partituren
  • Wenn es X an der Reihe, Rückkehr die maximale Punktzahl aus der Liste Partituren
  • Wenn es OS an der Reihe, kehrt die Mindestpunktzahl aus der Liste Partituren

Sie werden bemerken, dass dieser Algorithmus rekursiv ist, sie dreht hin und her zwischen den Spielern bis zu einem endgültigen Ergebnis gefunden.

die durch die Ausführung des Algorithmus laufen lassen mit der vollen Bewegung Baum, und zeigen, warum, algorithmisch, wird die sofortige Gewinnzug gepflückt:

minimax tic tac toe algorithm

  • Es ist wiederum der X in Zustand 1 X erzeugt die Zustände 2, 3 und 4 und ruft Minimax auf diesen Staaten.
  • Status 2 drückt die Punktzahl von +10, um die Punktzahl von 1 zu bestimmen, weil das Spiel in einem Endzustand ist.
  • Die Zustände 3 und 4 sind nicht in Endzuständen, daher erzeugt 3 die Zustände 5 und 6 und ruft Minimax auf ihnen auf, während Zustand 4 die Zustände 7 und 8 erzeugt und Minimax auf ihnen aufruft.
  • Status 5 drückt eine Punktzahl von -10 auf die Score-Liste von State 3, während das gleiche passiert für State 7, die einen Score von -10 auf die Score-Liste von State 4 drückt.
  • Zustand 6 und 8 erzeugen die einzigen verfügbaren Züge, die Endzustände sind, und so addieren beide die Bewertung von +10 zu den Verschiebelisten der Zustände 3 und 4.
  • Da ist O in beiden Zuständen dran 3 und 4 wird O versuchen, die Mindestpunktzahl zu finden, und gegeben die Wahl zwischen -10 und +10, werden beide Zustände 3 und 4 -10 ergeben.
  • Schließlich sind die Punkte Liste für Staaten 2, 3 und 4 mit +10, -10 und -10, und Staat 1 mit dem Ziel, die Punktzahl zu maximieren, wählt die gewinnende Bewegung mit Score +10, Zustand 2.

weitere Einzelheiten und Implementierung des Algorithmus in Code können Sie bekam durch den folgenden Artikel:

Tic Tac Toe: Understanding The Minimax Algorithm

online version tic tac toe

Source code on github

Reference: http://neverstopbuilding.com/minimax

Here is the presentation slide by us