Example #1
0
    def quickScore(self,gs, moveNum, color, move):

        gs=copy.deepcopy(gs)
        gs.getPinnedSquares()
        gs.pinPieces()
        gs.getAllMoves()
        if gs.checked == color:
            base_score=-1*color

        else:
            base_score = self.forest.score(gs, moveNum, color)

        return {'score':base_score, 'gs':gs, 'move':move}
Example #2
0
    def quickScore(gs, moveNum, color):

        gs = copy.deepcopy(gs)
        gs.getPinnedSquares()
        gs.pinPieces()
        gs.getAllMoves()
        if gs.checked == color:
            base_score = 0

        else:
            base_score = self.forest.score(gs, moveNum, color)

        return {'score': base_score, 'gs': gs}

        return best_gamestate
Example #3
0
    def rootthink(self,gs, color, moveNum, searchDepth=1):
        if color ==-1:
            searchdepth=0
            gs = copy.deepcopy(gs)

            gs.getPinnedSquares()
            gs.pinPieces()
            gs.getAllMoves()


            best_score = 1
            best_move = []
            best_gs=copy.deepcopy(gs)

            for castle in gs.castles[color*1000]:
                new_gs = copy.deepcopy(gs)


                if gs.castles[color*1000][castle] == True:

                    if castle=='king':
                        number=2
                    else:
                        number=3

                    new_board = gs.castle(color, number)
                    score = self.node_search(new_gs.returnNewGameState(new_board), moveNum, color,depth=searchdepth)
                    if score < best_score and random.random()>0.5:
                        best_score = score
                        best_move ={'type':'castle', 'number':number}
                        best_gs = copy.deepcopy(new_gs)

            for capture in gs.captures[color]:
                new_gs = copy.deepcopy(new_gs)
                origin = capture['origin']
                destination = capture['destination']
                piece = abs(gs.board[origin[0]][origin[1]])
                new_board = new_gs.simpleMove(color, piece, origin, destination)
                score = self.node_search(new_gs.returnNewGameState(new_board), moveNum, color,depth=searchdepth)
                if score < best_score and random.random()>0.5:
                    best_score = score
                    best_move = {'type':'simple', 'origin':origin, 'destination':destination}
                    best_gs=copy.deepcopy(new_gs)



            for move in gs.moves[color]:
                new_gs = copy.deepcopy(gs)
                origin = move['origin']
                destination = move['destination']

                piece = abs(new_gs.board[origin[0]][origin[1]])
                new_board = new_gs.simpleMove(color, piece, origin, destination)

                score = self.node_search(new_gs.returnNewGameState(new_board), moveNum, color,depth=searchdepth)
                if score < best_score and random.random()>0.5:
                    best_score = score
                    best_move = {'type':'simple', 'origin':origin, 'destination':destination}
                    best_gs = copy.deepcopy(new_gs)
            print('move:', best_move, 'win prob:', 1-best_score)
            return best_move

        else:
            searchdepth=1
            gs = copy.deepcopy(gs)

            gs.getPinnedSquares()
            gs.pinPieces()
            gs.getAllMoves()


            best_score = 0
            best_move = []
            best_gs=copy.deepcopy(gs)

            for castle in gs.castles[color*1000]:
                new_gs = copy.deepcopy(gs)


                if gs.castles[color*1000][castle] == True:

                    if castle=='king':
                        number=2
                    else:
                        number=3

                    new_board = gs.castle(color, number)
                    score = self.node_search(new_gs.returnNewGameState(new_board), moveNum, color,depth=searchdepth)
                    if score > best_score and random.random()>0.5:
                        best_score = score
                        best_move ={'type':'castle', 'number':number}
                        best_gs = copy.deepcopy(new_gs)

            for capture in gs.captures[color]:
                new_gs = copy.deepcopy(new_gs)
                origin = capture['origin']
                destination = capture['destination']
                piece = abs(gs.board[origin[0]][origin[1]])
                new_board = new_gs.simpleMove(color, piece, origin, destination)
                score = self.node_search(new_gs.returnNewGameState(new_board), moveNum, color,depth=searchdepth)
                if score > best_score and random.random()>0.5:
                    best_score = score
                    best_move = {'type':'simple', 'origin':origin, 'destination':destination}
                    best_gs=copy.deepcopy(new_gs)



            for move in gs.moves[color]:
                new_gs = copy.deepcopy(gs)
                origin = move['origin']
                destination = move['destination']

                piece = abs(new_gs.board[origin[0]][origin[1]])
                new_board = new_gs.simpleMove(color, piece, origin, destination)

                score = self.node_search(new_gs.returnNewGameState(new_board), moveNum, color,depth=searchdepth)
                if score > best_score and random.random()>0.5:
                    best_score = score
                    best_move = {'type':'simple', 'origin':origin, 'destination':destination}
                    best_gs = copy.deepcopy(new_gs)
            print('move:', best_move, 'win prob:', 1-best_score)
            return best_move
Example #4
0
    def node_search(self,gs, moveNum, color, depth=0, base_score=None):
        moveNum+=1
        results=[]
        if base_score==None:
            gs=copy.deepcopy(gs)
            gs.getPinnedSquares()
            gs.pinPieces()
            gs.getAllMoves()
            base_score = self.forest.score(gs, moveNum, color)

        if gs.checked == color:
            print('checked')
            return -1*color

        if (color == 1 and base_score < 0.3) or (color == -1 and base_score > 0.7):
            return base_score

        best_score=0.5
        if depth == 0:
            return base_score

        d=depth-1
        color=color*-1

        for castle in gs.castles[color*1000]:
            new_gs = copy.deepcopy(gs)


            if new_gs.castles[color*1000][castle] == True:

                if castle=='king':
                    number=2
                else:
                    number=3
                m={'type':'castle', number:'number'}
                new_board = new_gs.castle(color, number)
                g=new_gs.returnNewGameState(new_board)
                results.append(self.quickScore(g, moveNum, color, m))


        for capture in gs.captures[color]:

            new_gs = copy.deepcopy(new_gs)
            origin = capture['origin']
            destination = capture['destination']
            m = {'type':'simple', 'origin':origin, 'destination':destination}
            piece = abs(new_gs.board[origin[0]][origin[1]])
            new_board = new_gs.simpleMove(color, piece, origin, destination)
            g=new_gs.returnNewGameState(new_board)
            results.append(self.quickScore(g, moveNum, color, m))





        for move in gs.moves[color]:

            new_gs = copy.deepcopy(gs)
            origin = move['origin']
            destination = move['destination']
            m = {'type':'simple', 'origin':origin, 'destination':destination}

            piece = abs(new_gs.board[origin[0]][origin[1]])
            new_board = new_gs.simpleMove(color, piece, origin, destination)

            g=new_gs.returnNewGameState(new_board)
            results.append(self.quickScore(g, moveNum, color, m))




        results = sorted(results, key=itemgetter('score'))

        if color == -1:
            begin = 0
            end = min(5, len(results))
            increment = 1
            best_score=1
            for i in range(begin, end, increment):

                result=results[i]
                new_score = self.node_search(result['gs'], moveNum, color, depth=d, base_score=result['score'])
                if new_score < best_score:
                    best_score = new_score

        else:
            begin = len(results)-1
            end = len(results)-6
            increment = -1
            best_score=0

            for i in range(begin, end, increment):

                result=results[i]
                new_score = self.node_search(result['gs'], moveNum, color, depth=d, base_score=result['score'])
                if new_score > best_score:
                    best_score = new_score


        return best_score
Example #5
0
    def node_search(self, gs, moveNum, color, depth=0, base_score=False):
        if base_score == False:
            gs = copy.deepcopy(gs)
            gs.getPinnedSquares()
            gs.pinPieces()
            gs.getAllMoves()
            base_score = self.forest.score(gs, moveNum, color)
        if gs.checked == color:
            return 0

        best_score = 0
        if depth == 0:
            return base_score

        d = depth - 1
        color = color * -1

        for castle in gs.castles[color * 1000]:
            new_gs = copy.deepcopy(gs)

            if new_gs.castles[color * 1000][castle] == True:

                if castle == 'king':
                    number = 2
                else:
                    number = 3

                new_board = new_gs.castle(color, number)
                score = self.node_search(new_gs.returnNewGameState(new_board),
                                         moveNum,
                                         color,
                                         depth=d)
                if score > best_score:
                    best_score = score
                    best_move = {'type': 'castle', number: 'number'}
                    best_gs = copy.deepcopy(new_gs)

        for capture in gs.captures[color]:
            new_gs = copy.deepcopy(new_gs)
            origin = capture['origin']
            destination = capture['destination']
            piece = abs(new_gs.board[origin[0]][origin[1]])
            new_board = new_gs.simpleMove(color, piece, origin, destination)
            score = self.node_search(new_gs.returnNewGameState(new_board),
                                     moveNum,
                                     color,
                                     depth=d)
            if score > best_score:
                best_score = score
                best_move = {
                    'type': 'simple',
                    'origin': origin,
                    'destination': destination
                }
                best_gs = copy.deepcopy(new_gs)

        for move in gs.moves[color]:
            new_gs = copy.deepcopy(gs)
            origin = move['origin']
            destination = move['destination']

            piece = abs(new_gs.board[origin[0]][origin[1]])
            new_board = new_gs.simpleMove(color, piece, origin, destination)

            score = self.node_search(new_gs.returnNewGameState(new_board),
                                     moveNum,
                                     color,
                                     depth=d,
                                     base_score=move['score'])
            if score > best_score:
                best_score = score
                best_move = {
                    'type': 'simple',
                    'origin': origin,
                    'destination': destination
                }
                best_gs = copy.deepcopy(new_gs)

        return max(base_score - best_score, 0)