title: Minimax algorithm for Tic Tac Toe Python
body: <p>I kind of understand how the minimax algorithm works for Tic Tac Toe python but I have no idea how to actually code it in Python... this is what I have so far:</p>
  
  <pre><code>from copy import deepcopy
  
  class TicTacToeBrain :
  
      def __init__(self, player = "x") :
          self._squares = {}
          self._copySquares = {}
          self._winningCombos = (
          [0, 1, 2], [3, 4, 5], [6, 7, 8],
          [0, 3, 6], [1, 4, 7], [2, 5, 8],
          [0, 4, 8], [2, 4, 6])
  
      def createBoard(self) :
          for i in range(9) :
              self._squares[i] = None
          print(self._squares)
  
      def showBoard(self) :
          print(self._squares[0], self._squares[1], self._squares[2])
          print(self._squares[3], self._squares[4], self._squares[5])
          print(self._squares[6], self._squares[7], self._squares[8])
  
      def getAvailableMoves(self) :
          self._availableMoves = []
          for i in range(9) :
              if self._squares[i] == None :
                  self._availableMoves.append(i)
          return self._availableMoves
  
      def makeMove(self, position, player) :
          self._squares[position] = player
          self.showBoard()
  
      def complete(self) :
          if None not in self._squares.values() :
              return True
          if self.getWinner() != None :
              return True
          return False
  
      def getWinner(self) :
          for player in ("x", "o") :
              for combos in self._winningCombos :
                  if self._squares[combos[0]] == player and self._squares[combos[1]] == player and self._squares[combos[2]] == player :
                      return player
          if None not in self._squares.values() :
              return "tie"
          return None
  
      def getEnemyPlayer(self, player) :
          if player == "x" :
              return "o"
          return "x"
  
      def minimax(self, node, player, depth = 0, first = True) :
          if first :
              best = 0
              self._copySquares = deepcopy(self._squares)
  
          if node.complete() :
              if node.getWinner() == "x" :
                  self._squares = self._copySquares
                  return -1 - depth
              elif node.getWinner() == "tie" :
                  self._squares = self._copySquares
                  return 0
              elif node.getWinner() == "o" :
                  self._squares = self._copySquares
                  return 1 + depth
              best = None
          for move in node.getAvailableMoves() :
              depth += 1
              node.makeMove(move, player)
              print()
              val = self.minimax(node, node.getEnemyPlayer(player), depth, first = False)
              print(val)
              if player == "o" :
                  if val &gt; best :
                      best = val
              else :
                  if val &lt; best :
                      best = val
              return best
              print()
              print()
  
      def printCopy(self) :
          print(self._copySquares)
  </code></pre>
  
  <p>However, it never prints out all the scenarios....someone please help !!! This is due for a project on Monday..</p>