Example #1
0
    def evaluate_options(self):
        Temperature = 5
        currWinner = None
        editBoard = GameBoard()
        editBoard.board = self.copy_board(self.currBoard)
        score = 0
        strng = ""

        prob = list()
        self.currBoard.print_board()
        for i in range(3):
            for j in range(3):
                if (self.currBoard.is_valid_move((i, j))):
                    editBoard.board[i][j] = self.piece
                    strng = editBoard.to_string_one_line()
                    score = 0
                    
                    prob.append(((i, j), self.evaluate_option(strng, (i, j), Temperature)))


                    editBoard.board = self.copy_board(self.currBoard)
        bot = 0
        for dub in prob:
            bot += dub[1]
        for dub in range(len(prob)):
            # print(prob[dub])
            if dub == 0:
                prob[dub] = (prob[dub][0], prob[dub][1] / bot)
            else :
                prob[dub] = (prob[dub][0], prob[dub][1] / bot + prob[dub - 1][1])

        rand = random()
        # print(prob)
        for dub in prob:
            if (rand < dub[1]):
                return dub[0]
        print("F**K")
        return (0, 0)
Example #2
0
class Persona:
    def copy_board(self, board):
        tempBoard = GameBoard()
        for i in range(3):
            for j in range(3):
                tempBoard.board[i][j] = board.board[i][j]
        return tempBoard.board

    def rev_board(self, board):
        d = {"-": "-", "O": "X", "X": "O"}
        s = ""
        for c in board:
            s = s + d[c]
        return s

    # this is where end of game / memory file stuff is
    def read_history(self, fileName):
        mem = dict()
        with open(fileName, "r") as file:
            split = [] 
            # print(file.read())
            for line in file.readlines():
                # print(line)
                split = line.split(" ")
                split[2] = split[2][:-1]
                # print(split)
                mem[split[0]] = (float(split[1]), float(split[2]))
        file.close()
        # print(mem)
        return mem


    def write_history(self, fileName):
        file = open(fileName, "w")
        for brd in self.memory:
            file.write(brd)
            file.write(" ")
            file.write(str(self.memory[brd][0])[:7])
            file.write(" ")
            file.write(str(self.memory[brd][1]))
            file.write("\n")
        file.close()

    def add_board_to_memory(self, board, w):
        if board in self.memory:
            self.memory[board] = ((self.memory[board][0] * self.memory[board][1] + w) / (self.memory[board][1] + 1), self.memory[board][1] + 1)
        else:
            self.memory[board] = (w, 1)
        
        rBoard = self.rev_board(board)

        d = {0: 1, 1: 0, self.TIEWORTH: self.TIEWORTH}

        if rBoard in self.memory:
            # self.memory[rBoard] = ((self.memory[rBoard][0] * self.memory[rBoard][1] + d[w]) / (self.memory[rBoard][1] + 1), self.memory[rBoard][1] + 1)
            t = True
        else:
            self.memory[rBoard] = (d[w], 1)

    # this is where in game memory is
    def add_board(self, brdStrng):
        if brdStrng not in self.boardStates:
            self.boardStates.append(brdStrng)


    def __init__(self, t):
        self.memory = self.read_history("history.txt")
        self.currBoard = GameBoard()
        self.boardStates = [GameBoard().to_string_one_line()]
        self.piece = t
        self.UNRESEARCHEDBOARDVALUE = .5
        self.TIEWORTH = .7

    # default operations of a "player"
    def Q(self, board, move):
        posBonus = 0

        if board in self.memory:
            print("IN MEMORY")
            prevQ = self.memory[board][0] * math.log(self.memory[board][1], 10)
            posBonus = posBonus / self.memory[board][1]
        else:
            print("NEW MOVE")
            prevQ = self.UNRESEARCHEDBOARDVALUE

        return prevQ + posBonus


    def evaluate_option(self, board, move, temp):
        top = math.e ** (self.Q(board, move) / temp)
        return top

    def evaluate_options(self):
        Temperature = 5
        currWinner = None
        editBoard = GameBoard()
        editBoard.board = self.copy_board(self.currBoard)
        score = 0
        strng = ""

        prob = list()
        self.currBoard.print_board()
        for i in range(3):
            for j in range(3):
                if (self.currBoard.is_valid_move((i, j))):
                    editBoard.board[i][j] = self.piece
                    strng = editBoard.to_string_one_line()
                    score = 0
                    
                    prob.append(((i, j), self.evaluate_option(strng, (i, j), Temperature)))


                    editBoard.board = self.copy_board(self.currBoard)
        bot = 0
        for dub in prob:
            bot += dub[1]
        for dub in range(len(prob)):
            # print(prob[dub])
            if dub == 0:
                prob[dub] = (prob[dub][0], prob[dub][1] / bot)
            else :
                prob[dub] = (prob[dub][0], prob[dub][1] / bot + prob[dub - 1][1])

        rand = random()
        # print(prob)
        for dub in prob:
            if (rand < dub[1]):
                return dub[0]
        print("F**K")
        return (0, 0)

    def make_move(self):
        return self.evaluate_options()

    def update(self, board, pos):
        self.add_board(board.to_string_one_line())
        if (board.to_string_one_line() != self.currBoard.to_string_one_line()):
            self.currBoard.board = self.copy_board(board)

    def end_game(self, board, w):
        d = {"-": self.TIEWORTH, "O": 1 if self.piece == w else 0, "X": 1 if self.piece == w else 0}


        # print(self.boardStates)
        # print("")

        self.add_board(board.to_string_one_line())
        [self.add_board_to_memory(b, d[w]) for b in self.boardStates]
        self.boardStates = [GameBoard().to_string_one_line()]