Exemple #1
0
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
Exemple #2
0
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)
Exemple #4
0
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