def recBestMove(self, gameState, evalAsPlayer, options, depth=0, st=""): if depth == 0: return [0,None,None,gameState]; arr = []; for commandList in options.enumerateAll(deferToPlayer=evalAsPlayer): newGameState = GameState(); newGameState.copyState(gameState); outputList = []; anyChoices = False; for i,command in enumerate(commandList): if isinstance(command, Command): outputList.append(command); newGameState.processCommand(command.command); continue; #it's a CommandOption score, _, chosenList, newGameState = self.recBestMove(newGameState, command.evalAsPlayer, command, depth=1); outputList.extend(chosenList); anyChoices = True; score = self.evaluateGameState(evalAsPlayer, newGameState); if anyChoices == False: del outputList; outputList = commandList; arr.append( [score, commandList, outputList, newGameState] ); arr.sort(reverse=True); if depth > 1: for i in xrange(len(arr)): oldGameState = arr[i][-1]; if oldGameState.currentPlayer == gameState.currentPlayer: oldGameState.nextPlayer(); options = oldGameState.generateOperations(oldGameState.currentPlayer); _, _, _, newGameState = self.recBestMove(oldGameState, oldGameState.currentPlayer, options, depth-1); if self.keepCalculating() == False: break; if oldGameState == newGameState: continue; arr[i][0] = self.evaluateGameState(evalAsPlayer, newGameState, display=False); arr.sort(reverse=True); return arr[0];