def minimax(board, player, depth, prune_depth, tile, computerTile): if main.getValidMoves(board, tile) == [] or depth == prune_depth: return evaluator.heuristic_eval( board, computerTile, getOpponentTileColor(computerTile)), None bestMove = (8, 8) #aiween value if player == 0: bestScore = +INFINITY else: bestScore = -INFINITY for x, y in main.getValidMoves(board, tile): dupeBoard = copy.deepcopy(board) main.makeMove(dupeBoard, tile, x, y) score, bla = minimax(dupeBoard, 1 - player, depth + 1, prune_depth, getOpponentTileColor(tile), computerTile) if player == 1: if (score > bestScore): bestScore = score # max bestMove = (x, y) else: if (score < bestScore): bestScore = score # min bestMove = (x, y) return bestScore, bestMove
def alphabetapruning(board, player, depth, prune_depth, tile, computerTile, alpha, beta): if main.getValidMoves(board, tile) == [] or depth == prune_depth: return evaluator.heuristic_eval(board, computerTile, getOpponentTileColor(computerTile)), None bestMove = (8,8) #aiween value if player == 0: bestScore = +INFINITY else: bestScore = -INFINITY for x,y in main.getValidMoves(board,tile): dupeBoard = copy.deepcopy(board) main.makeMove(dupeBoard, tile, x, y) score, bla = alphabetapruning(dupeBoard, 1-player, depth + 1, prune_depth, getOpponentTileColor(tile), computerTile, alpha, beta) if player == 1: if ( score > bestScore ): bestScore = score # max bestMove = (x,y) if (bestScore > alpha): alpha = bestScore else: if ( score < bestScore ): bestScore = score # min bestMove = (x,y) if (bestScore < beta): beta = bestScore if(alpha >= beta): break return bestScore, bestMove
def chooseBestMove(board,player,positions): records = getRecords() bestpositions = map(lambda position: (boardValue(makeMove(board,player,position),records,player),position),positions) bestpositions = sorted(bestpositions) topscore = bestpositions[len(bestpositions)-1][0] bestpositions = [y for (x,y) in bestpositions if (x>=topscore)] return random.choice(bestpositions)
def playGame(timed = False): board = startingBoard() player = "B" history = [] while (not isGameOver(board)): if not timed: print boardToString(board) if not existsValidMove(board,player): if not timed: print "\nPlayer " + player + " has no valid moves\n" player = otherPlayer(player) if not timed: print "\n----------------------\n" + str(player) + " is playing\n----------------------\n" position = computeBestMove(copy.deepcopy(board),player) assert validMove(board,player,position), "The move given is not valid!" board = makeMove(board,player,position) history.append([player,position]) player = otherPlayer(player) print boardToString(board) print "\n**EndGame**\n" winner = getWinner(board) print winner + " wins" print "\nHistory:" print history updateRecords(startingBoard(),history,winner) return winner
def computeNewRecords(startingboard,history,winner): newRecords = pandas.DataFrame({'BoardValue': pandas.Series([],index=[]),'Player': pandas.Series([],index=[]),'Wins': pandas.Series([],index=[]),'Losses': pandas.Series([],index=[]),'Board': pandas.Series([],index=[])}) board = startingboard for i in range(0,len(history)): player = history[i][0] board = makeMove(board,player,history[i][1]) newline = pandas.DataFrame({'BoardValue': pandas.Series([0.05],index=[i]),'Player': pandas.Series([player],index=[i]),'Wins': pandas.Series([int(player == winner)],index=[i]),'Losses': pandas.Series([int(player != winner)],index=[i]),'Board': pandas.Series([board],index=[i])}) newRecords = newRecords.append(newline,ignore_index=True) newRecords['BoardValue'] = map(lambda w,l: computeLowerBound(w,l),newRecords['Wins'],newRecords['Losses']) return newRecords