示例#1
0
def startGame(board, playerSide, ai):
    parser = InputParser(board, playerSide)
    while True:
        print()
        print(board)
        print()
        if board.isCheckmate():
            if board.currentSide == playerSide:
                print("Checkmate, you lost")
            else:
                print("Checkmate! You won!")
            return

        if board.isStalemate():
            if board.currentSide == playerSide:
                print("Stalemate")
            else:
                print("Stalemate")
            return

        if board.currentSide == playerSide:
            print("Player making random move...")
            move = getRandomMove(board, parser)

            makeMove(move, board)

        else:
            print("AI thinking...")
            move = ai.getBestMove()
            move.notation = parser.notationForMove(move)
            makeMove(move, board)
def startGame(board, playerSide, ai):
    parser = InputParser(board, playerSide)
    while True:
        print()
        print(board)
        print()
        if board.isCheckmate():
            if board.currentSide == playerSide:
                print("Checkmate, you lost")
            else:
                print("Checkmate! You won!")
            return

        if board.isStalemate():
            if board.currentSide == playerSide:
                print("Stalemate")
            else:
                print("Stalemate")
            return

        if board.currentSide == playerSide:
            #printPointAdvantage(board)
            try:
                move = getAlphaBetaMove(board, parser)[1]
                #move = alphaBetaMove(board, parser, -999999, 999999, 3)[1]
            except ValueError as error:
                print("%s" % error)
                continue
            makeMove(move, board)

        else:
            print("AI thinking...")
            move = ai.getBestMove()
            move.notation = parser.notationForMove(move)
            makeMove(move, board)
示例#3
0
def startGame(board, playerSide, ai):
    parser = InputParser(board, playerSide)
    while True:
        print()
        print(board)
        print()
        if board.isCheckmate():
            if board.currentSide == playerSide:
                print("Checkmate, you lost")
            else:
                print("Checkmate! You won!")
            return

        if board.isStalemate():
            if board.currentSide == playerSide:
                print("Stalemate")
            else:
                print("Stalemate")
            return

        if board.currentSide == playerSide:
            move = playerMove(playerSide, board, 0, -99999, 99999)
            makeMove(move, board)

        else:
            move = ai.getBestMove()
            move.notation = parser.notationForMove(move)
            makeMove(move, board)
示例#4
0
def startGame(board, playerSide, ai):
    parser = InputParser(board, playerSide)
    while True:
        print()
        print(board)
        print()
        if board.isCheckmate():
            if board.currentSide == playerSide:
                print("Checkmate, you lost")
            else:
                print("Checkmate! You won!")
            return

        if board.isStalemate():
            if board.currentSide == playerSide:
                print("Stalemate")
            else:
                print("Stalemate")
            return

        if board.currentSide == playerSide:
            # printPointAdvantage(board)
            move = None
            command = input("It's your move." " Type '?' for options. ? ")
            if command.lower() == 'u':
                undoLastTwoMoves(board)
                continue
            elif command.lower() == '?':
                printCommandOptions()
                continue
            elif command.lower() == 'l':
                printAllLegalMoves(board, parser)
                continue
            elif command.lower() == 'r':
                move = getRandomMove(board, parser)
            elif command.lower() == 'exit' or command.lower() == 'quit':
                return
            try:
                move = parser.parse(command)
            except ValueError as error:
                print("%s" % error)
                continue
            makeMove(move, board)

        else:
            print("AI thinking...")
            move = ai.getBestMove()

            print(move)
            # TODO we have done check cordinate system returns

            # printAllLegalMoves(board, InputParser(board, False))

            # TODO we will hack to different notation
            move.notation = parser.notationForMove(move)
            print("Ai says", move.notation)
            makeMove(move, board)
            moveMotor(move)
示例#5
0
def startGame(board, playerSide, ai):
    parser = InputParser(board, playerSide)
    while True:
        print()
        print(board)
        print()
        if board.isCheckmate():
            if board.currentSide == playerSide:
                print("Checkmate, you lost")
            else:
                print("Checkmate! You won!")
            return

        if board.isStalemate():
            if board.currentSide == playerSide:
                print("Stalemate")
            else:
                print("Stalemate")
            return

        if board.currentSide == playerSide:
            # printPointAdvantage(board)
            move = None
            command = input("It's your move."
                            " Type '?' for options. ? ")
            if command.lower() == 'u':
                undoLastTwoMoves(board)
                continue
            elif command.lower() == '?':
                printCommandOptions()
                continue
            elif command.lower() == 'l':
                printAllLegalMoves(board, parser)
                continue
            elif command.lower() == 'r':
                move = getRandomMove(board, parser)
            elif command.lower() == 'exit' or command.lower() == 'quit':
                return
            try:
                move = parser.parse(command)
            except ValueError as error:
                print("%s" % error)
                continue
            makeMove(move, board)

        else:
            print("AI thinking...")
            move = ai.getBestMove()
            move.notation = parser.notationForMove(move)
            makeMove(move, board)
示例#6
0
def startGame(board, playerSide, ai):
    parser = InputParser(board, playerSide)
    while True:
        print()
        print(board)
        print()
        if board.isCheckmate():
            if board.currentSide == playerSide:
                print("Checkmate, you lost")
            else:
                print("Checkmate! You won!")
            return

        if board.isStalemate():
            if board.currentSide == playerSide:
                print("Stalemate")
            else:
                print("Stalemate")
            return

        if board.currentSide == playerSide:
            # printPointAdvantage(board)
            # move = None
            # command = input("It's your move."
            #                 " Type '?' for options. ? ")
            # if command.lower() == 'u':
            #     undoLastTwoMoves(board)
            #     continue
            # elif command.lower() == '?':
            #     printCommandOptions()
            #     continue
            # elif command.lower() == 'l':
            #     printAllLegalMoves(board, parser)
            #     continue
            # elif command.lower() == 'r':
            #     move = getRandomMove(board, parser)
            # elif command.lower() == 'exit' or command.lower() == 'quit':
            #     return
            try:
                move = getRandomMove(board, parser)
            except ValueError as error:
                print("%s" % error)
                continue
            makeMove(move, board)

        else:
            print("AI thinking...")
            move = ai.getBestMove()
            move.notation = parser.notationForMove(move)
            makeMove(move, board)
示例#7
0
def startGame(board, playerSide, ai):
    parser = InputParser(board, playerSide)
    while True:
        print(board)
        print()
        if board.isCheckmate():
            if board.currentSide == playerSide:
                print("Checkmate, you lost")
            else:
                print("Checkmate! You won!")
            return

        if board.isStalemate():
            if board.currentSide == playerSide:
                print("Stalemate")
            else:
                print("Stalemate")
            return

        if board.currentSide == playerSide:
            printPointAdvantage(board)
            move = None
            command = input(
                "It's your move, what do you want to do? Type '?' for options. "
            ).lower()
            if command == 'u':
                undoLastTwoMoves(board)
                continue
            elif command == '?':
                printCommandOptions()
                continue
            elif command == 'l':
                printAllLegalMoves(board, parser)
                continue
            elif command == 'r':
                move = getRandomMove(board, parser)
            else:
                move = parser.moveForShortNotation(command)
            if move:
                makeMove(move, board)
            else:
                print(
                    "Couldn't parse input, make sure you entered a valid command or move"
                )

        else:
            print("AI thinking...")
            move = ai.getBestMove()
            move.notation = parser.notationForMove(move)
            makeMove(move, board)
示例#8
0
def startGame(board, playerSide, ai):
    parser = InputParser(board, playerSide)
    while True:
        print(board)
        print()
        if board.isCheckmate():
            if board.currentSide == playerSide:
                print("ВЫ ПРОИГРАЛИ!")
            else:
                print("ВЫ ПОБЕДИЛИ!")
            return

        if board.isStalemate():
            if board.currentSide == playerSide:
                print("ПАТ")
            else:
                print("ПАТ")
            return

        if board.currentSide == playerSide:
            # printPointAdvantage(board) - доделать
            move = None
            command = input("Ваша очередь ходить."
                            " Нажмите '?' для вызова меню. ").lower()
            if command == 'u':
                undoLastTwoMoves(board)
                continue
            elif command == '?':
                printCommandOptions()
                continue
            elif command == 'l':
                printAllLegalMoves(board, parser)
                continue
            elif command == 'r':
                move = getRandomMove(board, parser)
            elif command == 'quit':
                return
            else:
                move = parser.moveForShortNotation(command)
            if move:
                makeMove(move, board)
            else:
                print("Некорректный синтаксический ввод, повторите запрос")

        else:
            print("AI думает...")
            move = ai.getBestMove()
            move.notation = parser.notationForMove(move)
            makeMove(move, board)
示例#9
0
def startGame(board, playerSide, ai):
    parser = InputParser(board, playerSide)
    while True:
        print(board)
        print()
        if board.isCheckmate():
            if board.currentSide == playerSide:
                print("Checkmate, you lost")
            else:
                print("Checkmate! You won!")
            return

        if board.isStalemate():
            if board.currentSide == playerSide:
                print("Stalemate")
            else:
                print("Stalemate")
            return

        if board.currentSide == playerSide:
            printPointAdvantage(board)
            move = None
            command = input("It's your move."
                            " Type '?' for options. ? ").lower()
            if command == 'u':
                undoLastTwoMoves(board)
                continue
            elif command == '?':
                printCommandOptions()
                continue
            elif command == 'l':
                printAllLegalMoves(board, parser)
                continue
            elif command == 'r':
                move = getRandomMove(board, parser)
            elif command == 'quit':
                return
            else:
                move = parser.moveForShortNotation(command)
            if move:
                makeMove(move, board)
            else:
                print("Couldn't parse input, enter a valid command or move.")

        else:
            print("AI thinking...")
            move = ai.getBestMove()
            move.notation = parser.notationForMove(move)
            makeMove(move, board)
示例#10
0
文件: AI.py 项目: abos5/pythontutor
class AI:

    depth = 1
    board = None
    side = None
    movesAnalyzed = 0

    def __init__(self, board, side, depth):
        self.board = board
        self.side = side
        self.depth = depth
        self.parser = InputParser(self.board, self.side)

    def getFirstMove(self, side):
        move = list(self.board.getAllMovesLegal(side))[0]
        return move

    def getAllMovesLegalConcurrent(self, side):
        p = Pool(8)
        unfilteredMovesWithBoard = [
            (move, copy.deepcopy(self.board))
            for move in self.board.getAllMovesUnfiltered(side)
        ]
        legalMoves = p.starmap(self.returnMoveIfLegal,
                               unfilteredMovesWithBoard)
        p.close()
        p.join()
        return list(filter(None, legalMoves))

    def minChildrenOfNode(self, node):
        lowestNodes = []
        for child in node.children:
            if not lowestNodes:
                lowestNodes.append(child)
            elif child < lowestNodes[0]:
                lowestNodes = []
                lowestNodes.append(child)
            elif child == lowestNodes[0]:
                lowestNodes.append(child)
        return lowestNodes

    def maxChildrenOfNode(self, node):
        highestNodes = []
        for child in node.children:
            if not highestNodes:
                highestNodes.append(child)
            elif child < highestNodes[0]:
                highestNodes = []
                highestNodes.append(child)
            elif child == highestNodes[0]:
                highestNodes.append(child)
        return highestNodes

    def getRandomMove(self):
        legalMoves = list(self.board.getAllMovesLegal(self.side))
        randomMove = random.choice(legalMoves)
        return randomMove

    def generateMoveTree(self):
        moveTree = []
        for move in self.board.getAllMovesLegal(self.side):
            moveTree.append(MoveNode(move, [], None))

        for node in moveTree:
            self.board.makeMove(node.move)
            self.populateNodeChildren(node)
            self.board.undoLastMove()
        return moveTree

    def populateNodeChildren(self, node):
        node.pointAdvantage = self.board.getPointAdvantageOfSide(self.side)
        node.depth = node.getDepth()
        if node.depth == self.depth:
            return

        side = self.board.currentSide

        legalMoves = self.board.getAllMovesLegal(side)
        if not legalMoves:
            if self.board.isCheckmate():
                node.move.checkmate = True
                return
            elif self.board.isStalemate():
                node.move.stalemate = True
                node.pointAdvantage = 0
                return
            raise Exception()

        for move in legalMoves:
            self.movesAnalyzed += 1
            node.children.append(MoveNode(move, [], node))
            self.board.makeMove(move)
            self.populateNodeChildren(node.children[-1])
            self.board.undoLastMove()

    def getOptimalPointAdvantageForNode(self, node):
        if node.children:
            for child in node.children:
                child.pointAdvantage = self.getOptimalPointAdvantageForNode(
                    child)

            #If the depth is divisible by 2, it's a move for the AI's side, so return max
            if node.children[0].depth % 2 == 1:
                return (max(node.children).pointAdvantage)
            else:
                return (min(node.children).pointAdvantage)
        else:
            return node.pointAdvantage

    def getBestMove(self):
        moveTree = self.generateMoveTree()
        bestMoves = self.bestMovesWithMoveTree(moveTree)
        randomBestMove = random.choice(bestMoves)
        randomBestMove.notation = self.parser.notationForMove(randomBestMove)
        return randomBestMove

    def makeBestMove(self):
        self.board.makeMove(self.getBestMove())

    def bestMovesWithMoveTree(self, moveTree):
        bestMoveNodes = []
        for moveNode in moveTree:
            moveNode.pointAdvantage = self.getOptimalPointAdvantageForNode(
                moveNode)
            if not bestMoveNodes:
                bestMoveNodes.append(moveNode)
            elif moveNode > bestMoveNodes[0]:
                bestMoveNodes = []
                bestMoveNodes.append(moveNode)
            elif moveNode == bestMoveNodes[0]:
                bestMoveNodes.append(moveNode)

        return [node.move for node in bestMoveNodes]

    def traverseTreeForBestMove(self, side, moveTree, layersTraversed,
                                bestMovesFound):
        if layersLeft < self.depth:
            for move in moveTree:
                board.makeMove(move)
                return traverseTreeForBestMove(moveTree[move], layersLeft + 1,
                                               bestMoveFound)
        if layersLeft == self.depth:
            for move in moveTree:
                board.makeMove(move)
                pointAdvantage = board.getPointAdvantageOfSide(side)
                previousBestAdvantage = 1
                return move

    def isValidMove(self, move, side):
        for legalMove in self.board.getAllMovesLegal(side):
            if move == legalMove:
                return True
        return False

    def makeRandomMove(self):
        moveToMake = self.getRandomMove()
        self.board.makeMove(moveToMake)
示例#11
0
class AI:

    depth = 1
    board = None
    side = None
    movesAnalyzed = 0

    def __init__(self, board, side, depth):
        self.board = board
        self.side = side
        self.depth = depth
        self.parser = InputParser(self.board, self.side)

    def getFirstMove(self, side):
        move = list(self.board.getAllMovesLegal(side))[0]
        return move

    def getAllMovesLegalConcurrent(self, side):
        p = Pool(8)
        unfilteredMovesWithBoard = \
            [(move, copy.deepcopy(self.board))
             for move in self.board.getAllMovesUnfiltered(side)]
        legalMoves = p.starmap(self.returnMoveIfLegal,
                               unfilteredMovesWithBoard)
        p.close()
        p.join()
        return list(filter(None, legalMoves))

    def minChildrenOfNode(self, node):
        lowestNodes = []
        for child in node.children:
            if not lowestNodes:
                lowestNodes.append(child)
            elif child < lowestNodes[0]:
                lowestNodes = []
                lowestNodes.append(child)
            elif child == lowestNodes[0]:
                lowestNodes.append(child)
        return lowestNodes

    def maxChildrenOfNode(self, node):
        highestNodes = []
        for child in node.children:
            if not highestNodes:
                highestNodes.append(child)
            elif child < highestNodes[0]:
                highestNodes = []
                highestNodes.append(child)
            elif child == highestNodes[0]:
                highestNodes.append(child)
        return highestNodes

    def getRandomMove(self):
        legalMoves = list(self.board.getAllMovesLegal(self.side))
        randomMove = random.choice(legalMoves)
        return randomMove

    def generateMoveTree(self):
        moveTree = []
        for move in self.board.getAllMovesLegal(self.side):
            moveTree.append(MoveNode(move, [], None))

        for node in moveTree:
            self.board.makeMove(node.move)
            self.populateNodeChildren(node)
            self.board.undoLastMove()
        return moveTree

    def populateNodeChildren(self, node):
        node.pointAdvantage = self.board.getPointAdvantageOfSide(self.side)
        node.depth = node.getDepth()
        if node.depth == self.depth:
            return

        side = self.board.currentSide

        legalMoves = self.board.getAllMovesLegal(side)
        if not legalMoves:
            if self.board.isCheckmate():
                node.move.checkmate = True
                return
            elif self.board.isStalemate():
                node.move.stalemate = True
                node.pointAdvantage = 0
                return
            raise Exception()

        for move in legalMoves:
            self.movesAnalyzed += 1
            node.children.append(MoveNode(move, [], node))
            self.board.makeMove(move)
            self.populateNodeChildren(node.children[-1])
            self.board.undoLastMove()

    def getOptimalPointAdvantageForNode(self, node):
        if node.children:
            for child in node.children:
                child.pointAdvantage = \
                    self.getOptimalPointAdvantageForNode(child)

            # If the depth is divisible by 2,
            # it's a move for the AI's side, so return max
            if node.children[0].depth % 2 == 1:
                return(max(node.children).pointAdvantage)
            else:
                return(min(node.children).pointAdvantage)
        else:
            return node.pointAdvantage

    def getBestMove(self):
        moveTree = self.generateMoveTree()
        bestMoves = self.bestMovesWithMoveTree(moveTree)
        randomBestMove = random.choice(bestMoves)
        randomBestMove.notation = self.parser.notationForMove(randomBestMove)
        return randomBestMove

    def makeBestMove(self):
        self.board.makeMove(self.getBestMove())

    def bestMovesWithMoveTree(self, moveTree):
        bestMoveNodes = []
        for moveNode in moveTree:
            moveNode.pointAdvantage = \
                self.getOptimalPointAdvantageForNode(moveNode)
            if not bestMoveNodes:
                bestMoveNodes.append(moveNode)
            elif moveNode > bestMoveNodes[0]:
                bestMoveNodes = []
                bestMoveNodes.append(moveNode)
            elif moveNode == bestMoveNodes[0]:
                bestMoveNodes.append(moveNode)

        return [node.move for node in bestMoveNodes]

    def traverseTreeForBestMove(self, side, moveTree,
                                layersTraversed, bestMovesFound):
        if layersLeft < self.depth:
            for move in moveTree:
                board.makeMove(move)
                return traverseTreeForBestMove(moveTree[move],
                                               layersLeft+1, bestMoveFound)
        if layersLeft == self.depth:
            for move in moveTree:
                board.makeMove(move)
                pointAdvantage = board.getPointAdvantageOfSide(side)
                previousBestAdvantage = 1
                return move

    def isValidMove(self, move, side):
        for legalMove in self.board.getAllMovesLegal(side):
            if move == legalMove:
                return True
        return False

    def makeRandomMove(self):
        moveToMake = self.getRandomMove()
        self.board.makeMove(moveToMake)
示例#12
0
文件: AI.py 项目: MysticProgg/mychess
class AI:

    depth = 1
    board = None
    side = None
    movesAnalyzed = 0

    def __init__(self, board, side, depth):
        self.board = board
        self.side = side
        self.depth = depth
        self.parser = InputParser(self.board, self.side)

    def getFirstMove(self, side):
        move = list(self.board.getAllMovesLegal(side))[0]
        return move

    #  создаем многопроцессорный пул, который находит возможные ходы и возвращает их список
    def getAllMovesLegalConcurrent(self, side):
        p = Pool(8)
        unfilteredMovesWithBoard = \
            [(move, copy.deepcopy(self.board))
             for move in self.board.getAllMovesUnfiltered(side)]
        legalMoves = p.starmap(self.returnMoveIfLegal,
                               unfilteredMovesWithBoard)
        p.close()
        p.join()
        return list(filter(None, legalMoves))

    def minChildrenOfNode(self, node):
        lowestNodes = []
        for child in node.children:
            if not lowestNodes:
                lowestNodes.append(child)
            elif child < lowestNodes[0]:
                lowestNodes = []
                lowestNodes.append(child)
            elif child == lowestNodes[0]:
                lowestNodes.append(child)
        return lowestNodes

    def maxChildrenOfNode(self, node):
        highestNodes = []
        for child in node.children:
            if not highestNodes:
                highestNodes.append(child)
            elif child < highestNodes[0]:
                highestNodes = []
                highestNodes.append(child)
            elif child == highestNodes[0]:
                highestNodes.append(child)
        return highestNodes

    def getRandomMove(self):
        legalMoves = list(self.board.getAllMovesLegal(self.side))
        randomMove = random.choice(legalMoves)
        return randomMove

    # генерация дерева решений
    def generateMoveTree(self):
        moveTree = []
        for move in self.board.getAllMovesLegal(self.side):
            moveTree.append(MoveNode(move, [], None))

        for node in moveTree:
            self.board.makeMove(node.move)
            self.populateNodeChildren(node)
            self.board.undoLastMove()
        return moveTree

    def populateNodeChildren(self, node):
        node.pointAdvantage = self.board.getPointAdvantageOfSide(self.side)
        node.depth = node.getDepth()
        if node.depth == self.depth:
            return

        side = self.board.currentSide

        legalMoves = self.board.getAllMovesLegal(side)
        if not legalMoves:
            if self.board.isCheckmate():
                node.move.checkmate = True
                return
            elif self.board.isStalemate():
                node.move.stalemate = True
                node.pointAdvantage = 0
                return
            raise Exception()

        for move in legalMoves:
            self.movesAnalyzed += 1
            node.children.append(MoveNode(move, [], node))
            self.board.makeMove(move)
            self.populateNodeChildren(node.children[-1])
            self.board.undoLastMove()

    def getOptimalPointAdvantageForNode(self, node):
        if node.children:
            for child in node.children:
                child.pointAdvantage = \
                    self.getOptimalPointAdvantageForNode(child)

            # Если глубина делится на 2,
            # Это ход для AI ----> возвращаем max
            if node.children[0].depth % 2 == 1:
                return(max(node.children).pointAdvantage)
            else:
                return(min(node.children).pointAdvantage)
        else:
            return node.pointAdvantage

    # находит лучший ход
    def getBestMove(self):
        moveTree = self.generateMoveTree()
        bestMoves = self.bestMovesWithMoveTree(moveTree)
        randomBestMove = random.choice(bestMoves)
        randomBestMove.notation = self.parser.notationForMove(randomBestMove)
        return randomBestMove

    # выбирает лучший ход
    def makeBestMove(self):
        self.board.makeMove(self.getBestMove())

    def bestMovesWithMoveTree(self, moveTree):
        bestMoveNodes = []
        for moveNode in moveTree:
            moveNode.pointAdvantage = \
                self.getOptimalPointAdvantageForNode(moveNode)
            if not bestMoveNodes:
                bestMoveNodes.append(moveNode)
            elif moveNode > bestMoveNodes[0]:
                bestMoveNodes = []
                bestMoveNodes.append(moveNode)
            elif moveNode == bestMoveNodes[0]:
                bestMoveNodes.append(moveNode)

        return [node.move for node in bestMoveNodes]

    def isValidMove(self, move, side):
        for legalMove in self.board.getAllMovesLegal(side):
            if move == legalMove:
                return True
        return False

    def makeRandomMove(self):
        moveToMake = self.getRandomMove()
        self.board.makeMove(moveToMake)
示例#13
0
    def startGame(self):
        parser = InputParser(self.board, self.playerSide)
        movecount = 0
        while True:
            #print("player side")
            #print(self.playerSide)
            print()
            print(self.board)
            #print(self.uciBoard)
            print()
            reedBoard = self.table.reedBoard.getBoard()
            self.compareBoard(reedBoard)
            
            if self.uciBoard.is_game_over():
                if self.uciBoard.is_stalemate():
                    print("Stalemate")
                    self.ledMatrix.sendMultLines("STALE","MATE")
                    self.table.moveto(0,0)
                    time.sleep(1)
                elif self.board.currentSide == self.playerSide:
                    print("Checkmate, you lost")
                    self.ledMatrix.sendMultLines("YOU","LOST")
                    self.table.moveto(0,0)
                    time.sleep(1)
                else:
                    print("Checkmate! You won!")
                    self.ledMatrix.sendMultLines("YOU","WON")
                    self.table.moveto(0,0)
                    time.sleep(1)
                return
        
            if self.board.currentSide == self.playerSide:
                voiceCommandMade = False
                #if Bluetooth vs AI
                if (self.gameMode == 3):
                    move = self.btMove(parser)
                    
                else:
                    if self.led:
                        if self.gameMode == 5:
                            self.ledMatrix.sendMultLines("DEMO","MOVE")
                        else:
                            if self.playerSide == WHITE:
                                self.ledMatrix.sendMultLines("WHITE","MOVE")
                            else:
                                self.ledMatrix.sendMultLines("BLACK","MOVE")
                        self.scrollButton.startListener()
                        self.selectButton.startListener()
                        self.voice1.startListener()
                    
                    if self.reedBoardOption:
                        scrollCount = 0
                        menuOpened = False
                        voiceCommandMade = False
                        startTime = datetime.now()
                        timerUp = False
                        while True:
                            if (datetime.now() - startTime).total_seconds() >= 2:
                                timerUp = True
                            if self.selectButton.wasPressed() or (timerUp and not(menuOpened) and self.gameMode == 5):
                                if menuOpened:
                                    if scrollCount == 1 or scrollCount == 2:
                                        move = None
                                        self.scrollButton.stopListener()
                                        self.selectButton.stopListener()
                                        self.voice1.stopListener()
                                        break
                                    #end the current game
                                    elif scrollCount == 3:
                                        self.table.moveto(0,0)
                                        self.scrollButton.stopListener()
                                        self.selectButton.stopListener()
                                        self.voice1.stopListener()
                                        return
                                    elif scrollCount == 4:
                                        print("Closing the program and shutting down the Pi")
                                        self.table.moveto(0,0)
                                        self.scrollButton.stopListener()
                                        self.selectButton.stopListener()
                                        self.voice1.stopListener()
                                        self.ledMatrix.sendMultLines("!SHUT","DOWN")
                                        time.sleep(1)
                                        self.ledMatrix.sendMultLines("!IN","5 SEC")
                                        time.sleep(2)
                                        self.ledMatrix.sendString("clear")
                                        os.system("sudo shutdown -h now")
                                        sys.exit(0)
                                else:
                                    if self.gameMode == 5:
                                        self.ledMatrix.sendString("load")
                                        move = self.getUCIEngineMove(self.aiDepth*1000)
                                        self.ledMatrix.sendString("l")
                                        self.scrollButton.stopListener()
                                        self.selectButton.stopListener()
                                        self.voice1.stopListener()
                                        break
                                    else:
                                        moveReturn = self.table.getMove(self.board)
                                        move = moveReturn[0]
                                        if move:
                                            print("FOUND IT!")
                                        else:
                                            moveError = moveReturn[1]
                                            self.printReedBoard(self.table.playableBoard)
                                        self.scrollButton.stopListener()
                                        self.selectButton.stopListener()
                                        self.voice1.stopListener()
                                        break
                                self.selectButton.stopListener()
                            elif self.scrollButton.wasPressed():
                                menuOpened = True
                                self.scrollButton.stopListener()
                                time.sleep(self.sleepTime)
                                self.scrollButton.startListener()
                                scrollCount = scrollCount + 1
                                print("Scroll Button was Pressed")
                                print(scrollCount)
                                if scrollCount == 1:
                                    self.ledMatrix.sendMultLines("@GAME","MENU") 
                                elif scrollCount == 2:
                                    self.ledMatrix.sendMultLines("CARRY","ON") 
                                elif scrollCount == 3:
                                    self.ledMatrix.sendMultLines("NEW","GAME") 
                                elif scrollCount == 4:
                                    self.ledMatrix.sendMultLines("!END","GAME")
                                else:
                                    self.ledMatrix.sendMultLines("CARRY","ON")
                                    scrollCount = 2
                            elif self.voiceControl:
                                if menuOpened == False:
                                    if self.voice1.wasPressed():
                                        self.ledMatrix.sendMultLines("REC","VOICE") 
                                        voiceCommandMade = True
                                        result, voicemove = self.voiceListener1.listen(self.board)
                                        if result == "move":
                                            #if self.board.moveIsLegal(voicemove):  # fails if king would be in check after move
                                            move = voicemove
                                            #else:
                                            #    print("illegal move")
                                            #    move = None
                                            #    self.ledMatrix.sendMultLines("MOVE","ERROR")
                                            #    time.sleep(2)
                                        else:
                                            move = None
                                        self.scrollButton.stopListener()
                                        self.selectButton.stopListener()
                                        self.voice1.stopListener()
                                        break   
                                
                    else:                        
                        command = input("It's your move."
                                        " Type '?' for options. ? ").lower()
                      
                        if command == 'u':
                            self.undoLastTwoMoves()
                            continue
                        elif command == '?':
                            self.printCommandOptions()
                            continue
                        elif command == 'l':
                            self.printAllLegalMoves(parser)
                            continue
                        elif command == 'x':
                            self.printAllUnfilteredMoves(self.board)
                            continue
                        elif command == 'r':
                            move = self.getRandomMove(parser)
                        elif command == 'quit':
                            return
                        else:
                            parser.side = self.playerSide
                            move = parser.moveForShortNotation(command)
                            '''
                            self.ledMatrix.sendString("clear")
                            alphaPos = self.board.positionToHumanCoord(move.newPos)
                            self.ledMatrix.sendString("move" + str(move.piece.stringRep) + str(alphaPos))
                            time.sleep(3)
                            '''
                if move:
                    if self.board.moveIsLegal(move):
                        self.makeMove(move)
                        self.moveWasMade = 1
                        if voiceCommandMade or self.gameMode == 5:
                            '''
                            alphaPos = self.board.positionToHumanCoord(move.newPos)
                            self.ledMatrix.sendString("move" + str(move.piece.stringRep).lower() + str(alphaPos).upper())
                            self.table.move(move)
                            if move.pieceToCapture:
                                self.ledMatrix.sendString("capture" + str(move.pieceToCapture.stringRep).lower())
                                time.sleep(3)
                            '''
                            alphaPos = self.board.positionToHumanCoord(move.newPos)
                            self.table.move(move, self.ledMatrix, alphaPos)
                            
                        print("Human Move: ")
                        print(move)
                        if self.bt == 0:
                            print("bluetooth is on")
                            moveStr = str(move.oldPos[0]) + str(move.oldPos[1]) + str(move.newPos[0]) + str(move.newPos[1])
                            print(moveStr)
                            self.bluetooth.sendmove(moveStr)
                        else:
                            print("bt is off ")
                    else:
                        self.ledMatrix.sendMultLines("MOVE","ERROR")
                        time.sleep(2)
                    
                else:
                    if voiceCommandMade:
                        if result == "illegal move":
                            print(result)
                            self.ledMatrix.sendMultLines("MOVE","ERROR")
                        elif result == "bad record":
                            print(result)
                            self.ledMatrix.sendMultLines("SPEAK","AGAIN")
                        elif result == "multiple targets":
                            print(result)
                            self.ledMatrix.sendMultLines("SPEAK","COORD")
                        time.sleep(2)
                    elif menuOpened:
                        if self.playerSide == WHITE:
                            self.ledMatrix.sendMultLines("WHITE","MOVE")
                        else:
                            self.ledMatrix.sendMultLines("BLACK","MOVE")
                    else:
                        reedBoard = self.table.reedBoard.getBoard()              
                         
                        if moveError == 1:
                            self.ledMatrix.sendMultLines("CHECK","BOARD")
                            time.sleep(2)
                            self.compareBoard(reedBoard)
                        elif moveError == 3:
                            self.ledMatrix.sendMultLines("MOVE","ERROR")
                            time.sleep(2)
                            self.compareBoard(reedBoard)
                        elif moveError == 2:
                            self.ledMatrix.sendMultLines("MAKE","MOVE")
                            time.sleep(2)
                        else:
                            self.ledMatrix.sendMultLines("MOVE","ERROR")
                            time.sleep(2)
                            self.compareBoard(reedBoard)

            #Player 2
            else:
				#if Human vs Bluetooth
                if (self.gameMode == 2):
                    print("Bluetooth Player's Turn...")
                elif (self.gameMode == 4):
                    print("Player 2's Turn")
                else:
                    print("AI thinking...")
                    
                
                #if Human vs Bluetooth
                if (self.gameMode == 2):
                    self.ledMatrix.sendMultLines("BT","MOVE")
                    move = self.btMove(parser)
                    move.notation = parser.notationForMove(move)
                    
                elif (self.gameMode == 4):
                    print("gameMode is 4")
                    parser2 = InputParser(self.board, self.btSide)
                    
                    if self.led:
                        if self.playerSide == WHITE:
                            self.ledMatrix.sendMultLines("BLACK","MOVE")
                        else:
                            self.ledMatrix.sendMultLines("WHITE","MOVE")
                        self.scrollButton.startListener()
                        self.selectButton.startListener()
                        self.voice2.startListener()
                        
                    if self.reedBoardOption:
                        scrollCount = 0
                        menuOpened = False
                        voiceCommandMade = False
                        while True:
                            if self.selectButton.wasPressed():
                                if menuOpened:
                                    if scrollCount == 1 or scrollCount == 2:
                                        move = None
                                        self.scrollButton.stopListener()
                                        self.selectButton.stopListener()
                                        self.voice2.stopListener()      #switched from voice 1 to voice 2
                                        break
                                    elif scrollCount == 3:
                                        self.table.moveto(0,0)
                                        self.scrollButton.stopListener()
                                        self.selectButton.stopListener()
                                        self.voice2.stopListener()
                                        return
                                    elif scrollCount == 4:
                                        print("Closing the program and shutting down the Pi")
                                        self.table.moveto(0,0)
                                        self.scrollButton.stopListener()
                                        self.selectButton.stopListener()
                                        self.voice1.stopListener()
                                        self.ledMatrix.sendMultLines("!SHUT","DOWN")
                                        time.sleep(1)
                                        self.ledMatrix.sendMultLines("!IN","5 SEC")
                                        time.sleep(2)
                                        self.ledMatrix.sendString("clear")
                                        os.system("sudo shutdown -h now")
                                        sys.exit(0)
                                else:
                                    moveReturn = self.table.getMove(self.board)
                                    move = moveReturn[0]
                                    moveError = moveReturn[1]
                                    self.scrollButton.stopListener()
                                    self.selectButton.stopListener()
                                    self.voice2.stopListener()
                                    break
                            elif self.scrollButton.wasPressed():
                                menuOpened = True
                                self.scrollButton.stopListener()
                                time.sleep(self.sleepTime)
                                self.scrollButton.startListener()
                                scrollCount = scrollCount + 1
                                print("Scroll Button was Pressed")
                                print(scrollCount)
                                if scrollCount == 1:
                                    self.ledMatrix.sendMultLines("@GAME","MENU") 
                                elif scrollCount == 2:
                                    self.ledMatrix.sendMultLines("CARRY","ON") 
                                elif scrollCount == 3:
                                    self.ledMatrix.sendMultLines("NEW","GAME") 
                                elif scrollCount == 4:
                                    self.ledMatrix.sendMultLines("!END","GAME")
                                else:
                                    self.ledMatrix.sendMultLines("CARRY","ON")
                                    scrollCount = 2
                            elif self.voiceControl:
                                if menuOpened == False:
                                    if self.voice2.wasPressed():
                                        self.ledMatrix.sendMultLines("REC","VOICE")
                                        voiceCommandMade = True
                                        result2, voicemove = self.voiceListener2.listen(self.board)
                                        if result2 == "move":
                                            #if self.board.moveIsLegal(voicemove):  # fails if king would be in check after move
                                            move = voicemove
                                        else:
                                            move = None
                                        self.scrollButton.stopListener()
                                        self.selectButton.stopListener()
                                        self.voice2.stopListener()
                                        
                                        break
                    
                else:
                    self.ledMatrix.sendString("load")
                    move = self.getUCIEngineMove(self.aiDepth*1000)
                    self.ledMatrix.sendString("l")
                    
                
                if move:
                    if self.board.moveIsLegal(move):
                        self.makeMove(move)
                        if self.gameMode != 4:
                            alphaPos = self.board.positionToHumanCoord(move.newPos) 
                            self.table.move(move, self.ledMatrix, alphaPos)  
                        elif voiceCommandMade:
                            alphaPos = self.board.positionToHumanCoord(move.newPos)
                            self.ledMatrix.sendString("move" + str(move.piece.stringRep).lower() + str(alphaPos).upper())
                            self.table.move(move)
                            if move.pieceToCapture:
                                self.ledMatrix.sendString("capture" + str(move.pieceToCapture.stringRep).lower())
                                time.sleep(3)
                    else:
                        self.ledMatrix.sendMultLines("MOVE","ERROR")
                        time.sleep(2)
                else:
                    if voiceCommandMade:
                        if result2 == "illegal move":
                            print(result2)
                            self.ledMatrix.sendMultLines("MOVE","ERROR")
                        elif result2 == "bad record":
                            print(result2)
                            self.ledMatrix.sendMultLines("SPEAK","AGAIN")
                        elif result2 == "multiple targets":
                            print(result2)
                            self.ledMatrix.sendMultLines("SPEAK","COORD")
                        time.sleep(2)
                    elif menuOpened:
                        if self.playerSide == WHITE:
                            self.ledMatrix.sendMultLines("BLACK","MOVE")
                        else:
                            self.ledMatrix.sendMultLines("WHITE","MOVE")
                    else:
                        reedBoard = self.table.reedBoard.getBoard()              
                         
                        if moveError == 1:
                            self.ledMatrix.sendMultLines("CHECK","BOARD")
                            time.sleep(2)
                            self.compareBoard(reedBoard)
                        elif moveError == 3:
                            self.ledMatrix.sendMultLines("MOVE","ERROR")
                            time.sleep(2)
                            self.compareBoard(reedBoard)
                        elif moveError == 2:
                            self.ledMatrix.sendMultLines("MAKE","MOVE")
                            time.sleep(2)
                        else:
                            self.ledMatrix.sendMultLines("MOVE","ERROR")
                            time.sleep(2)
                            self.compareBoard(reedBoard)
                        print("Couldn't parse input, enter a valid command or move.")
                if self.uciBoard.is_check():
                    print("King was put in check")
                    self.ledMatrix.sendString("CHECK")
                    time.sleep(5)
                self.ledMatrix.sendString("clear")
示例#14
0
			[0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0], \
			[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], \
			[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], \
			[0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0], \
			[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], \
			[0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0], \
			[0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0]]
            
table12 = ChessTable(1)
currentBoard = newReed
move = table12.getMoveNew(board12, currentBoard)
print(move)
print()

parser = InputParser(board12, WHITE)
notation = parser.notationForMove(move)
if notation == "e4":
    numPassed = numPassed + 1
    board12.makeChosenMove(move)
    print("Passed move 1 of 30")
    print()
    print(board12)
else:
    print("Failed move 1 of 30")

enter = input("Enter to continue")

#---------------------- 2 of 30 ---------------------------#

newReed =  [[0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0], \
			[0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0], \
示例#15
0
def startGame(board, playerSide, ai):
    parser = InputParser(board, playerSide)
    previous_count = 0
    count = 0
    while True:
        if len(open(op_input).readlines()) == 0:
            break
        else:
            print("Please Clear the op_input.txt first!")
    while True:

        if board.isCheckmate():
            if board.currentSide == playerSide:
                print("--------------------")
                print("AI: Today is a beautiful day!")
                print("--------------------")
            else:
                print("--------------------")
                print("AI: NOOOOOOOOOOOOOOOOOOOOOOOOOO!")
                print("--------------------")
            return

        if board.isStalemate():
            if board.currentSide == playerSide:
                print("--------------------")
                print("AI: Live together? See you next time")
                print("--------------------")
            else:
                print("--------------------")
                print("AI: Live together? See you next time")
                print("--------------------")
            return

        if board.currentSide == playerSide:
            # printPointAdvantage(board)
            move = None
            command = input("It's your move." " Type '?' for options. ? ")
            if command.lower() == 'u':
                undoLastTwoMoves(board)
                continue
            elif command.lower() == '?':
                printCommandOptions()
                continue
            elif command.lower() == 'l':
                printAllLegalMoves(board, parser)
                continue
            elif command.lower() == 'r':
                move = getRandomMove(board, parser)
            elif command.lower() == 'exit' or command.lower() == 'quit':
                return
            try:
                move = parser.parse(command)
                print("move: ", command)
            except ValueError as error:
                print("%s" % error)
                continue
            move = getRandomMove(board, parser)

            while True:
                previous_count = count
                count = len(open(op_input).readlines())
                if count - previous_count > 0:
                    with open(op_input) as f:
                        read_data = f.read().splitlines()
                        op_latest_input = read_data[-1]
                        print("--------------------")
                        print("BELOW IS YOUR MOVE")
                        print("--------------------")
                        move = parser.parse(op_latest_input)
                        f.closed
                    break
            makeMove(move, board)

        else:
            print("--------------------")
            print("AI: I will beat you!")
            print("--------------------")
            move = ai.getBestMove()
            move.notation = parser.notationForMove(move)
            makeMove(move, board)

            with open(AI_output, 'a+') as f:
                f.write(move.notation + '\n')
                f.closed
            # move = getRandomMove(board, parser)
        print(board)