def SetUp(self, options):
        #gameSetupParams: Player 1 and 2 Name, Color, Human/AI level
        if self.debugMode:
            player1Name = 'Steve'
            player1Type = 'human'
            player1Color = 'white'
            player2Name = 'Bob'
            player2Type = 'AI'
            player2Color = 'black'
        else:
            GameParams = TkinterGameSetupParams()
            (player1Name, player1Color, player1Type, player2Name, player2Color,
             player2Type) = GameParams.GetGameSetupParams()

        self.player = [0, 0]
        if player1Type == 'human':
            self.player[0] = ChessPlayer(player1Name, player1Color)
        else:
            self.player[0] = ChessAI(player1Name, player1Color)

        if player2Type == 'human':
            self.player[1] = ChessPlayer(player2Name, player2Color)
        else:
            self.player[1] = ChessAI(player2Name, player2Color)

        #create the gui object - didn't do earlier because pygame conflicts with any gui manager (Tkinter, WxPython...)
        if 't' in options:
            self.guitype = 'text'
            self.Gui = ChessGUI_text()
        else:
            self.guitype = 'pygame'
            if 'o' in options:
                self.Gui = ChessGUI_pygame(0)
            else:
                self.Gui = ChessGUI_pygame(1)
Example #2
0
    def SetUp(self, options):
        #gameSetupParams: Player 1 and 2 Name, Color, Human/AI level
        if self.debugMode:
            player1Name = 'Kasparov'
            player1Type = 'human'
            player1Color = 'white'
            player2Name = 'Light Blue'
            player2Type = 'randomAI'
            player2Color = 'black'
        else:
            GameParams = TkinterGameSetupParams()
            (player1Name, player1Color, player1Type, player2Name, player2Color,
             player2Type) = GameParams.GetGameSetupParams()

        self.player = [0, 0]
        if player1Type == 'human':
            self.player[0] = ChessPlayer(player1Name, player1Color)
        elif player1Type == 'randomAI':
            self.player[0] = ChessAI_random(player1Name, player1Color)
        elif player1Type == 'HeuristicOffense':
            self.player[0] = Off_Heuristic(player1Name, player1Color,
                                           self.Board)
        elif player1Type == 'EnemyOffense':
            self.player[0] = Off_Enemy(player1Name, player1Color, self.Board)

        if player2Type == 'human':
            self.player[1] = ChessPlayer(player2Name, player2Color)
        elif player2Type == 'randomAI':
            self.player[1] = ChessAI_random(player2Name, player2Color)
        elif player2Type == 'HeuristicDefense':
            self.player[1] = Def_Heuristic(player2Name, player2Color,
                                           self.Board)
        elif player2Type == 'EnemyDefense':
            self.player[1] = Def_Enemy(player2Name, player2Color, self.Board)

        if 'AI' in self.player[0].GetType() and 'AI' in self.player[1].GetType(
        ):
            self.AIvsAI = True
        else:
            self.AIvsAI = False

        if options.pauseSeconds > 0:
            self.AIpause = True
            self.AIpauseSeconds = int(options.pauseSeconds)
        else:
            self.AIpause = False

        #create the gui object - didn't do earlier because pygame conflicts with any gui manager (Tkinter, WxPython...)
        if options.text:
            self.guitype = 'text'
            self.Gui = ChessGUI_text()
        else:
            self.guitype = 'pygame'
            if options.old:
                self.Gui = ChessGUI_pygame(0)
            else:
                self.Gui = ChessGUI_pygame(1)
Example #3
0
    def SetUp(self, options):
        #gameSetupParams: Player 1 and 2 Name, Color, Human/AI level
        if self.debugMode:
            player1Name = 'Atahualpa'
            player1Type = 'humano'
            player1Color = 'blanco'
            player2Name = 'Huascar'
            player2Type = 'randomAI'
            player2Color = 'negro'
        else:
            GameParams = TkinterGameSetupParams()
            (player1Name, player1Color, player1Type, player2Name, player2Color,
             player2Type) = GameParams.GetGameSetupParams()

        self.player = [0, 0]
        self.redis = player1Type
        if player1Type == 'humano':
            self.player[0] = ChessPlayer(player1Name, player1Color)
        elif player1Type == 'server':
            self.player[0] = ChessPlayer(player1Name, player1Color)
        elif player1Type == 'client':
            self.player[0] = ChessPlayer(player2Name, player2Color)
        elif player1Type == 'offenseAI':
            self.player[0] = ChessAI_offense(player1Name, player1Color)

        if player2Type == 'humano':
            self.player[1] = ChessPlayer(player2Name, player2Color)
        elif player2Type == 'server':
            self.player[1] = ChessPlayer(player1Name, player1Color)
        elif player2Type == 'client':
            self.player[1] = ChessPlayer(player2Name, player2Color)
        elif player2Type == 'offenseAI':
            self.player[1] = ChessAI_offense(player2Name, player2Color)

        if options.pauseSeconds > 0:
            self.AIpause = True
            self.AIpauseSeconds = int(options.pauseSeconds)
        else:
            self.AIpause = False

        #create the gui object - didn't do earlier because pygame conflicts with any gui manager (Tkinter, WxPython...)
        if options.text:
            self.guitype = 'text'
            self.Gui = ChessGUI_text()
        else:
            self.guitype = 'pygame'
            if options.old:
                self.Gui = ChessGUI_pygame(0)
            else:
                self.Gui = ChessGUI_pygame(1)
Example #4
0
class PythonChessMain:
    def __init__(self, options):
        if options.debug:
            self.Board = ChessBoard(2)
            self.debugMode = True
        else:
            self.Board = ChessBoard(
                6
            )  #6 for Checkmate with knights setup; see ChessBoard class for other options (for testing purposes)
            self.debugMode = False

        self.Rules = ChessRules()

    def SetUp(self, options):
        #gameSetupParams: Player 1 and 2 Name, Color, Human/AI level
        if self.debugMode:
            player1Name = 'Kasparov'
            player1Type = 'human'
            player1Color = 'white'
            player2Name = 'Light Blue'
            player2Type = 'randomAI'
            player2Color = 'black'
        else:
            GameParams = TkinterGameSetupParams()
            (player1Name, player1Color, player1Type, player2Name, player2Color,
             player2Type) = GameParams.GetGameSetupParams()

        self.player = [0, 0]
        if player1Type == 'human':
            self.player[0] = ChessPlayer(player1Name, player1Color)
        elif player1Type == 'randomAI':
            self.player[0] = ChessAI_random(player1Name, player1Color)
        elif player1Type == 'defenseAI':
            self.player[0] = ChessAI_defense(player1Name, player1Color)
        elif player1Type == 'offenseAI':
            self.player[0] = ChessAI_offense(player1Name, player1Color)

        if player2Type == 'human':
            self.player[1] = ChessPlayer(player2Name, player2Color)
        elif player2Type == 'randomAI':
            self.player[1] = ChessAI_random(player2Name, player2Color)
        elif player2Type == 'defenseAI':
            self.player[1] = ChessAI_defense(player2Name, player2Color)
        elif player2Type == 'offenseAI':
            self.player[1] = ChessAI_offense(player2Name, player2Color)

        if 'AI' in self.player[0].GetType() and 'AI' in self.player[1].GetType(
        ):
            self.AIvsAI = True
        else:
            self.AIvsAI = False

        if options.pauseSeconds > 0:
            self.AIpause = True
            self.AIpauseSeconds = int(options.pauseSeconds)
        else:
            self.AIpause = False

        #create the gui object - didn't do earlier because pygame conflicts with any gui manager (Tkinter, WxPython...)
        if options.text:
            self.guitype = 'text'
            self.Gui = ChessGUI_text()
        else:
            self.guitype = 'pygame'
            if options.old:
                self.Gui = ChessGUI_pygame(0)
            else:
                self.Gui = ChessGUI_pygame(1)

    def MainLoop(self):
        currentPlayerIndex = 0
        turnCount = 0
        while not self.Rules.IsCheckmate(
                self.Board.GetState(), self.player[currentPlayerIndex].color):
            board = self.Board.GetState()
            currentColor = self.player[currentPlayerIndex].GetColor()
            #hardcoded so that player 1 is always white
            if currentColor == 'white':
                turnCount = turnCount + 1
            self.Gui.PrintMessage("")
            baseMsg = "TURN %s - %s (%s)" % (
                str(turnCount), self.player[currentPlayerIndex].GetName(),
                currentColor)
            self.Gui.PrintMessage("-----%s-----" % baseMsg)
            self.Gui.Draw(board)
            if self.Rules.IsInCheck(board, currentColor):
                self.Gui.PrintMessage(
                    "Warning..." + self.player[currentPlayerIndex].GetName() +
                    " (" + self.player[currentPlayerIndex].GetColor() +
                    ") is in check!")

            if self.player[currentPlayerIndex].GetType() == 'AI':
                moveTuple = self.player[currentPlayerIndex].GetMove(
                    self.Board.GetState(), currentColor)
            else:
                moveTuple = self.Gui.GetPlayerInput(board, currentColor)
            moveReport = self.Board.MovePiece(
                moveTuple
            )  #moveReport = string like "White Bishop moves from A1 to C3" (+) "and captures ___!"
            self.Gui.PrintMessage(moveReport)
            currentPlayerIndex = (
                currentPlayerIndex + 1
            ) % 2  #this will cause the currentPlayerIndex to toggle between 1 and 0
            if self.AIvsAI and self.AIpause:
                time.sleep(self.AIpauseSeconds)

        self.Gui.PrintMessage("CHECKMATE!")
        winnerIndex = (currentPlayerIndex + 1) % 2
        self.Gui.PrintMessage(self.player[winnerIndex].GetName() + " (" +
                              self.player[winnerIndex].GetColor() +
                              ") won the game!")
        self.Gui.EndGame(board)
                len(protectedMoveTuples) - 1)]
        else:
            #If there aren't any protected moves, revert to random AI
            #print "No protected move exists; going to random's GetMove"
            return ChessAI_random.GetMove(self, board, color)


if __name__ == "__main__":

    from ChessBoard import ChessBoard
    cb = ChessBoard(3)
    board = cb.GetState()
    color = 'black'

    from ChessGUI_pygame import ChessGUI_pygame
    gui = ChessGUI_pygame()
    gui.Draw(board, highlightSquares=[])
    defense = ChessAI_defense('Bob', 'black')

    myPieces = defense.GetMyPiecesWithLegalMoves(board, color)
    enemyPieces = defense.GetEnemyPiecesWithLegalMoves(board, color)
    protectedMoveTuples = defense.GetProtectedMoveTuples(
        board, color, myPieces, enemyPieces)
    movesThatPutEnemyInCheck = defense.GetMovesThatPutEnemyInCheck(
        board, color, protectedMoveTuples)
    print "MyPieces = ", cb.ConvertSquareListToAlgebraicNotation(myPieces)
    print "enemyPieces = ", cb.ConvertSquareListToAlgebraicNotation(
        enemyPieces)
    print "protectedMoveTuples = ", cb.ConvertMoveTupleListToAlgebraicNotation(
        protectedMoveTuples)
    print "movesThatPutEnemyInCheck = ", cb.ConvertMoveTupleListToAlgebraicNotation(
Example #6
0
class PythonChessMain:
    def __init__(self, options):
        if options.debug:
            self.Board = ChessBoard(2)
            self.debugMode = True
        else:
            self.Board = ChessBoard(
                0
            )  #0 for normal board setup; see ChessBoard class for other options (for testing purposes)
            self.debugMode = False

        self.Rules = ChessRules()

    def SetUp(self, options):
        #gameSetupParams: Player 1 and 2 Name, Color, Human/AI level
        if self.debugMode:
            player1Name = 'Kasparov'
            player1Type = 'human'
            player1Color = 'white'
            player2Name = 'Light Blue'
            player2Type = 'randomAI'
            player2Color = 'black'
        else:
            GameParams = TkinterGameSetupParams()
            (player1Name, player1Color, player1Type, player2Name, player2Color,
             player2Type) = GameParams.GetGameSetupParams()

        self.player = [0, 0]
        if player1Type == 'human':
            self.player[0] = ChessPlayer(player1Name, player1Color)
        elif player1Type == 'randomAI':
            self.player[0] = ChessAI_random(player1Name, player1Color)
        elif player1Type == 'HeuristicOffense':
            self.player[0] = Off_Heuristic(player1Name, player1Color,
                                           self.Board)
        elif player1Type == 'EnemyOffense':
            self.player[0] = Off_Enemy(player1Name, player1Color, self.Board)

        if player2Type == 'human':
            self.player[1] = ChessPlayer(player2Name, player2Color)
        elif player2Type == 'randomAI':
            self.player[1] = ChessAI_random(player2Name, player2Color)
        elif player2Type == 'HeuristicDefense':
            self.player[1] = Def_Heuristic(player2Name, player2Color,
                                           self.Board)
        elif player2Type == 'EnemyDefense':
            self.player[1] = Def_Enemy(player2Name, player2Color, self.Board)

        if 'AI' in self.player[0].GetType() and 'AI' in self.player[1].GetType(
        ):
            self.AIvsAI = True
        else:
            self.AIvsAI = False

        if options.pauseSeconds > 0:
            self.AIpause = True
            self.AIpauseSeconds = int(options.pauseSeconds)
        else:
            self.AIpause = False

        #create the gui object - didn't do earlier because pygame conflicts with any gui manager (Tkinter, WxPython...)
        if options.text:
            self.guitype = 'text'
            self.Gui = ChessGUI_text()
        else:
            self.guitype = 'pygame'
            if options.old:
                self.Gui = ChessGUI_pygame(0)
            else:
                self.Gui = ChessGUI_pygame(1)

    def MainLoop(self):
        currentPlayerIndex = 0
        turnCount = 0
        # open("log_X.txt", "w").close()
        # open("log_Y.txt", "w").close()
        prevBoards = []  #To compare previous boards
        while not self.Rules.IsCheckmate(
                self.Board.GetState(), self.player[currentPlayerIndex].color):
            board = self.Board.GetState()
            currentColor = self.player[currentPlayerIndex].GetColor()
            #hardcoded so that player 1 is always white
            turnCount = turnCount + 1
            if turnCount == 101:
                self.Gui.PrintMessage("Maximum moves reached.")
                self.Gui.EndGame(board)
            if currentColor == 'black':  #Only the defense player wants a draw
                #print prevBoards.count(board)
                if prevBoards.count(board) == 2:
                    self.Gui.PrintMessage(
                        "Black player calls threefold repetition draw.")
                    self.Gui.EndGame(board)
                prevBoards.append(copy.deepcopy(board))
            self.Gui.PrintMessage("")
            baseMsg = "TURN %s - %s (%s)" % (
                str(turnCount), self.player[currentPlayerIndex].GetName(),
                currentColor)
            self.Gui.PrintMessage("-----%s-----" % baseMsg)
            self.Gui.Draw(board)
            if currentColor == "white":
                currentPlayer = "X"
            if currentColor == "black":
                currentPlayer = "Y"
            if self.Rules.IsInCheck(board, currentColor):
                self.Gui.PrintMessage(
                    "Warning..." + self.player[currentPlayerIndex].GetName() +
                    " (" + self.player[currentPlayerIndex].GetColor() +
                    ") is in check!")

            move = ""
            if self.player[currentPlayerIndex].GetType() == 'HeuristicDefense':
                #	then get new move to put into MoveTuple and make move
                currentPlayer = "Y"

                if turnCount > 1:
                    textFileX = open("log_X.txt", "r")
                    for line in textFileX:
                        move = line
                    textFileY = open("log_Y.txt", "a")
                    textFileY.write(move)
                    textFileY.close()
                    textFileX.close()
                moveTuple = self.player[currentPlayerIndex].GetMove(
                    self.Board.GetState(), currentColor)
                self.WriteMove(board, moveTuple, currentPlayer, turnCount)

            #	write to text file player_ytext below before changing currentPlayerIndex below
            elif self.player[currentPlayerIndex].GetType(
            ) == 'HeuristicOffense':
                currentPlayer = "X"

                if turnCount > 1:
                    textFileY = open("log_Y.txt", "r")
                    for line in textFileY:
                        move = line
                    textFileX = open("log_X.txt", "a")
                    textFileX.write(move)
                    textFileX.close()
                    textFileY.close()
                moveTuple = self.player[currentPlayerIndex].GetMove(
                    self.Board.GetState(), currentColor)
                self.WriteMove(board, moveTuple, currentPlayer, turnCount)

            # #	then get new move to put into Movetuple and make move
            # #	write to text file player_xtext below before changing currentPlayerIndex below
            elif self.player[currentPlayerIndex].GetType() == 'EnemyDefense':
                moveTuple = self.player[currentPlayerIndex].GetMove(
                    self.Board.GetState(), currentColor, turnCount)
            # 	#CALL READ FUNCTION HERE FOR ENEMY PLAYER == DEFENSE KRUTIK
            # 	#moveTuple = defense read function
            elif self.player[currentPlayerIndex].GetType() == 'EnemyOffense':
                moveTuple = self.player[currentPlayerIndex].GetMove(
                    self.Board.GetState(), currentColor, turnCount)
            # 	#CALL READ FUNCTION HERE FOR ENEMY PLAYER == OFFENSE KRUTIK
            # 	#moveTuple = offense read function
            else:
                moveTuple = self.Gui.GetPlayerInput(board, currentColor)
            moveReport = self.Board.MovePiece(
                moveTuple
            )  #moveReport = string like "White Bishop moves from A1 to C3" (+) "and captures ___!"
            self.Gui.PrintMessage(moveReport)
            #	use current player index to determine what file to write to
            #	index = 0 is player x / "white" / offense
            #	index = 1 is player y / "black" / defense
            currentPlayerIndex = (
                currentPlayerIndex + 1
            ) % 2  #this will cause the currentPlayerIndex to toggle between 1 and 0
            self.AIvsAI = True
            if self.AIvsAI and self.AIpause:
                time.sleep(self.AIpauseSeconds)
        self.Gui.PrintMessage("CHECKMATE!")
        winnerIndex = (currentPlayerIndex + 1) % 2
        self.Gui.PrintMessage(self.player[winnerIndex].GetName() + " (" +
                              self.player[winnerIndex].GetColor() +
                              ") won the game!")
        self.Gui.EndGame(board)

    def WriteMove(self, board, tuple, currentPlayer, turnCount):
        #a-g columns
        #1-8 rows
        pieceRow = tuple[0][0]
        pieceCol = tuple[0][1]
        pieceToMove = board[pieceRow][pieceCol]
        print tuple

        if tuple[1][1] == 0:
            columnLetter = 'a'
        elif tuple[1][1] == 1:
            columnLetter = 'b'
        elif tuple[1][1] == 2:
            columnLetter = 'c'
        elif tuple[1][1] == 3:
            columnLetter = 'd'
        elif tuple[1][1] == 4:
            columnLetter = 'e'
        elif tuple[1][1] == 5:
            columnLetter = 'f'
        elif tuple[1][1] == 6:
            columnLetter = 'g'
        elif tuple[1][1] == 7:
            columnLetter = 'h'

        if tuple[1][0] == 0:
            rowNumber = 8
        elif tuple[1][0] == 1:
            rowNumber = 7
        elif tuple[1][0] == 2:
            rowNumber = 6
        elif tuple[1][0] == 3:
            rowNumber = 5
        elif tuple[1][0] == 4:
            rowNumber = 4
        elif tuple[1][0] == 5:
            rowNumber = 3
        elif tuple[1][0] == 6:
            rowNumber = 2
        elif tuple[1][0] == 7:
            rowNumber = 1

        fileName = "log_" + currentPlayer + ".txt"
        file = open(fileName, "a")
        file.write(
            str(turnCount) + " " + currentPlayer + ":" + pieceToMove[1] + ":" +
            columnLetter + str(rowNumber) + "\n")
        file.close()
Example #7
0
class PythonChessMain:
    def __init__(self,options):
        if options.debug:
            self.Board = ChessBoard(1)
            self.debugMode = True
        else:
            self.Board = ChessBoard(0)#0 for normal board setup; see ChessBoard class for other options (for testing purposes)
            self.debugMode = False

        self.Rules = ChessRules()
        self.StateList = []
        
    def SetUp(self,options):
        #gameSetupParams: Player 1 and 2 Name, Color, Human/AI level
        if self.debugMode:
            player1Name = 'Kasparov'
            player1Type = 'human'
            player1Color = 'white'
            player2Name = 'Light Blue'
            player2Type = 'AI'
            player2Color = 'black'        
        else:
            GameParams = TkinterGameSetupParams()
            (player1Name, player1Color, player1Type, player2Name, player2Color, player2Type) = GameParams.GetGameSetupParams()

        self.player = [0,0]
        if player1Type == 'human':
            self.player[0] = ChessPlayer(player1Name,player1Color)
        elif player1Type == 'RandomAI':
            self.player[0] = ChessAI_random(player1Name,player1Color)
        elif player1Type == 'SunpushAI':
            self.player[0] = ChessAI_sunpush(player1Name,player1Color)
            
        if player2Type == 'human':
            self.player[1] = ChessPlayer(player2Name,player2Color)
        elif player2Type == 'RandomAI':
            self.player[1] = ChessAI_random(player2Name,player2Color)
        elif player2Type == 'SunpushAI':
            self.player[1] = ChessAI_sunpush(player2Name,player2Color)
            
        if 'AI' in self.player[0].GetType() and 'AI' in self.player[1].GetType():
            self.AIvsAI = True
        else:
            self.AIvsAI = False
            
        if options.pauseSeconds > 0:
            self.AIpause = True
            self.AIpauseSeconds = int(options.pauseSeconds)
        else:
            self.AIpause = False
            
        #create the gui object - didn't do earlier because pygame conflicts with any gui manager (Tkinter, WxPython...)
        if options.text:
            self.guitype = 'text'
            self.Gui = ChessGUI_text()
        else:
            self.guitype = 'pygame'
            if options.old:
                self.Gui = ChessGUI_pygame(0)
            else:
                self.Gui = ChessGUI_pygame(1)
            
    def MainLoop(self):
        currentPlayerIndex = 0
        turnCount = 0
        movelist=[]
        while not self.Rules.IsCheckmate(self.Board) and not self.Rules.IsStalemate(self):
            self.Board.GetSquaresLayout()
            currentColor = self.player[currentPlayerIndex].GetColor()
            self.StateList.append((self.Board.board,currentColor))
            #hardcoded so that player 1 is always white
            if currentColor == 'white':
                turnCount = turnCount + 1
            self.Gui.PrintMessage("")
            baseMsg = "TURN %s - %s (%s)" % (str(turnCount),self.player[currentPlayerIndex].GetName(),currentColor)
            self.Gui.PrintMessage("-----%s-----" % baseMsg)
            self.Gui.Draw(self.Board,currentColor)
            if self.Rules.IsInCheck(self.Board):
                self.Gui.PrintMessage("Warning..."+self.player[currentPlayerIndex].GetName()+" ("+self.player[currentPlayerIndex].GetColor()+") is in check!")
            if self.player[currentPlayerIndex].GetType() == 'AI':
                moveTuple = self.player[currentPlayerIndex].GetMove(self.Board) 
                if moveTuple[1] not in self.Rules.GetListOfValidMoves(self.Board,moveTuple[0]):
                    if (moveTuple[1],moveTuple[2]) not in self.Rules.GetListOfValidMoves(self.Board,moveTuple[0]):
                        print(moveTuple[1])
                        print(self.Rules.DoesMovePutPlayerInCheck(self.Board,'white',moveTuple))
                        raise TypeError('AI did an invalid move')
            else:
                moveTuple = self.Gui.GetPlayerInput(self.Board,currentColor)
            moveReport = self.Board.MovePiece(moveTuple,currentColor,getMessage=True) #moveReport = string like "White Bishop moves from A1 to C3" (+) "and captures ___!"
            self.Board.GetSquaresLayout()
            movelist.append(moveReport+'\n')
            self.Gui.PrintMessage(moveReport)
            currentPlayerIndex = (currentPlayerIndex+1)%2 #this will cause the currentPlayerIndex to toggle between 1 and 0
            if self.AIvsAI and self.AIpause:
                time.sleep(self.AIpauseSeconds)
                self.Gui.Draw(self.Board,currentColor)
            with open('logs/chess','w') as f:
                f.writelines(movelist)
            self.Board.Rotate() #rotate it so that chessrules can understand it
            #self.Board.GetSquaresLayout()

        if self.Rules.IsCheckmate(self.Board):
            self.Board.Rotate()
            self.Board.GetSquaresLayout()
            self.Gui.Draw(self.Board,currentColor)
            self.Gui.PrintMessage("CHECKMATE!")
            winnerIndex = (currentPlayerIndex+1)%2
            self.Gui.PrintMessage(self.player[winnerIndex].GetName()+" ("+self.player[winnerIndex].GetColor()+") won the game!")
        else:
            self.Board.Rotate()
            self.Gui.Draw(self.Board,currentColor)
            self.Gui.PrintMessage("STALEMATE!")
            self.Gui.PrintMessage("It's a draw!")
        self.Gui.EndGame(self.Board,currentColor)
class PythonChessMain:
    def __init__(self, options):
        if 'd' in options:
            self.Board = ChessBoard(2)
            self.debugMode = True
        else:
            self.Board = ChessBoard(
                0
            )  #0 for normal board setup; see ChessBoard class for other options (for testing purposes)
            self.debugMode = False

        self.Rules = ChessRules()

    def SetUp(self, options):
        #gameSetupParams: Player 1 and 2 Name, Color, Human/AI level
        if self.debugMode:
            player1Name = 'Steve'
            player1Type = 'human'
            player1Color = 'white'
            player2Name = 'Bob'
            player2Type = 'AI'
            player2Color = 'black'
        else:
            GameParams = TkinterGameSetupParams()
            (player1Name, player1Color, player1Type, player2Name, player2Color,
             player2Type) = GameParams.GetGameSetupParams()

        self.player = [0, 0]
        if player1Type == 'human':
            self.player[0] = ChessPlayer(player1Name, player1Color)
        else:
            self.player[0] = ChessAI(player1Name, player1Color)

        if player2Type == 'human':
            self.player[1] = ChessPlayer(player2Name, player2Color)
        else:
            self.player[1] = ChessAI(player2Name, player2Color)

        #create the gui object - didn't do earlier because pygame conflicts with any gui manager (Tkinter, WxPython...)
        if 't' in options:
            self.guitype = 'text'
            self.Gui = ChessGUI_text()
        else:
            self.guitype = 'pygame'
            if 'o' in options:
                self.Gui = ChessGUI_pygame(0)
            else:
                self.Gui = ChessGUI_pygame(1)

    def MainLoop(self):
        currentPlayerIndex = 0
        turnCount = 0
        while not self.Rules.IsCheckmate(
                self.Board.GetState(), self.player[currentPlayerIndex].color):
            board = self.Board.GetState()
            currentColor = self.player[currentPlayerIndex].GetColor()
            #hardcoded so that player 1 is always white
            if currentColor == 'white':
                turnCount = turnCount + 1
            self.Gui.Draw(board)
            self.Gui.PrintMessage("")
            self.Gui.PrintMessage("-----------TURN " + str(turnCount) + " - " +
                                  self.player[currentPlayerIndex].GetName() +
                                  " (" + currentColor + ")-----------")
            if self.Rules.IsInCheck(board, currentColor):
                self.Gui.PrintMessage(
                    "Warning..." + self.player[currentPlayerIndex].GetName() +
                    " (" + self.player[currentPlayerIndex].GetColor() +
                    ") is in check!")

            if self.player[currentPlayerIndex].GetType() == 'AI':
                moveTuple = self.player[currentPlayerIndex].GetMove(
                    self.Board.GetState(), currentColor)
            else:
                moveTuple = self.Gui.GetPlayerInput(board, currentColor)
            moveReport = self.Board.MovePiece(
                moveTuple
            )  #moveReport = string like "White Bishop moves from A1 to C3" (+) "and captures ___!"
            self.Gui.PrintMessage(moveReport)
            currentPlayerIndex = (
                currentPlayerIndex + 1
            ) % 2  #this will cause the currentPlayerIndex to toggle between 1 and 0

        self.Gui.PrintMessage("CHECKMATE!")
        winnerIndex = (currentPlayerIndex + 1) % 2
        self.Gui.PrintMessage(self.player[winnerIndex].GetName() + " (" +
                              self.player[winnerIndex].GetColor() +
                              ") won the game!")
        self.Gui.Draw(board)  #draw board a final time to show the end game
        c = raw_input(
            "Game finished...press any key to quit.")  #pause at the end
        if self.guitype == 'pygame':
            pygame.quit()
Example #9
0
class ChessAI_defense(ChessAI_random): #tamame harakate mojaze khodam va harif ro chek mikonam
# kheylee sade harakati ke be ye khune montahi mishano hazf mikonam. @ betarze ahmaqane harakati ke harifo kish mikonan
#ro tarjih midam!! :| dar gheire in soorat ye harakat random az mabaqie harakat bar midaram.
	def __init__(self,name,color,protectionPriority=("queen","rook","knight","bishop","pawn")):
		self.piecePriority = protectionPriority
		ChessAI.__init__(self,name,color)
	def GetMove(self,board,color):
		myPieces = self.moherehaye_harakatdar(board,color)
		harifPieces = self.GetharifPiecesWithharakate_mojaz(board,color)
		protectedMoveTuples = self.GetProtectedMoveTuples(board,color,myPieces,harifPieces)
		movesThatPutharifInCheck = self.GetMovesThatPutharifInCheck(board,color,protectedMoveTuples)
		if len(movesThatPutharifInCheck) > 0:
			return movesThatPutharifInCheck[random.randint(0,len(movesThatPutharifInCheck)-1)]
        for pieceType in self.piecePriority: #olaviate 2 inja harakatayi entekhab mishe ke az khatare zade shodan nejat mide
			piecesProtectedMoves = self.GetMovesThatProtectPiece(board,color,pieceType,protectedMoveTuples)
			if len(piecesProtectedMoves) > 0:
				return piecesProtectedMoves[random.randint(0,len(piecesProtectedMoves)-1)]
		#olaviate 3 - harakati entekhab mishe ke ye mohre az harif begire
		for pieceType in self.piecePriority:
			capturePieceMoves = self.GetMovesThatCaptureharifPiece(board,color,pieceType,protectedMoveTuples)
			if len(capturePieceMoves) > 0:
				return capturePieceMoves[random.randint(0,len(capturePieceMoves)-1)]
		#age az olaviat haye 1 ta 3 chzi nabud, yeki az protected haro entekahb mikone
		if len(protectedMoveTuples) > 0:
			return protectedMoveTuples[random.randint(0,len(protectedMoveTuples)-1)]
		else: # age protected ham nabud ye random begir!
			return ChessAI_random.GetMove(self,board,color)
	def GetharifPiecesWithharakate_mojaz(self,board,color):
		if color == "black":
			myColor = 'b'
			harifColor = 'w'
			harifColor_full = 'white'
		else:
			myColor = 'w'
			harifColor = 'b'
			harifColor_full = 'black'
		harifPieces = []
		for row in range(8):
			for col in range(8):
				piece = board[row][col]
				if harifColor in piece:
					if len(self.Rules.listofvalidmoves(board,harifColor_full,(row,col))) > 0:
						harifPieces.append((row,col))
		return harifPieces
	def GetProtectedMoveTuples(self,board,color,myPieces,harifPieces):
		if color == "black":
			myColor = 'b'
			harifColor = 'w'
			harifColor_full = 'white'
		else:
			myColor = 'w'
			harifColor = 'b'
			harifColor_full = 'black'
		protectedMoveTuples = []
		for my_p in myPieces:   ## in for ro chek kon shak daram :| :|
			my_harakate_mojaz = self.Rules.listofvalidmoves(board,color,my_p)
			toBeRemoved = []
		    for harif_p in harifPieces:
                harif_moves = self.Rules.listofvalidmoves(board,harifColor_full,harif_p)
                for harif_m in harif_moves:
                    if harif_m in my_harakate_mojaz:
                        toBeRemoved.append(harif_m)
			for remove_m in toBeRemoved:
				if remove_m in my_harakate_mojaz:
					my_harakate_mojaz.remove(remove_m)
			for my_m in my_harakate_mojaz: #now, "dangerous" moves are removed
				protectedMoveTuples.append((my_p,my_m))
		return protectedMoveTuples
	def GetMovesThatProtectPiece(self,board,color,pieceType,protectedMoveTuples):
		piecesProtectedMoves = []
		piecePositions = self.PiecePositions(board,color,pieceType)
		if len(piecePositions)>0:
			for p in piecePositions:
				if self.PieceCanBeCaptured(board,color,p):
					piecesProtectedMoves.extend(self.GetPiecesMovesFromMoveTupleList(p,protectedMoveTuples))
		return piecesProtectedMoves
	def GetMovesThatCaptureharifPiece(self,board,color,pieceType,protectedMoveTuples):
		if color == "black":
			myColor = 'b'
			harifColor = 'w'
			harifColor_full = 'white'
		else:
			myColor = 'w'
			harifColor = 'b'
			harifColor_full = 'black'
		capturePieceMoves = []
		harifPiecePositions = self.PiecePositions(board,harifColor,pieceType)
		if len(harifPiecePositions)>0:
			for p in harifPiecePositions:
				if self.PieceCanBeCaptured(board,harifColor,p):
					capturePieceMoves.extend(self.GetCapturePieceMovesFromMoveTupleList(p,protectedMoveTuples))
		return capturePieceMoves
	def GetMovesThatPutharifInCheck(self,board,color,protectedMoveTuples): #range harif ro midam besh :))
		if color == "black":
			myColor = 'b'
			harifColor = 'w'
			harifColor_full = 'white'
		else:
			myColor = 'w'
			harifColor = 'b'
			harifColor_full = 'black'
		movesThatPutharifInCheck = []
		for mt in protectedMoveTuples:
			if self.Rules.chek_Achmaz(board,harifColor_full,mt[0],mt[1]):
				movesThatPutharifInCheck.append(mt)
		return movesThatPutharifInCheck
	def PiecePositions(self,board,color,pieceType):
		if color == "black":
			myColor = 'b'
		else:
			myColor = 'w'

		if pieceType == "king":
			myPieceType = 'K'
		elif pieceType == "queen":
			myPieceType = 'Q'
		elif pieceType == "rook":
			myPieceType = 'R'
		elif pieceType == "knight":
			myPieceType = 'T'
		elif pieceType == "bishop":
			myPieceType = 'B'
		elif pieceType == "pawn":
			myPieceType = 'P'
		piecePositions = []
		for row in range(8):
			for col in range(8):
				piece = board[row][col]
				if myColor in piece and myPieceType in piece:
					piecePositions.append((row,col))
		return piecePositions

	def PieceCanBeCaptured(self,board,color,p):
		if color == "black":
			myColor = 'b'
			harifColor = 'w'
			harifColorFull = 'white'
		else:
			myColor = 'w'
			harifColor = 'b'
			harifColorFull = 'black'

		for row in range(8):
			for col in range(8):
				piece = board[row][col]
				if harifColor in piece:
					if self.Rules.Sah_move(board,harifColorFull,(row,col),p):
						return True
		return False

	def GetCapturePieceMovesFromMoveTupleList(self,p,possibleMoveTuples): ##possible hamoon protected ha hastan
		moveTuples = []
		for m in possibleMoveTuples:
			if m[1] == p:
				moveTuples.append(m)
		return moveTuples

	def GetPiecesMovesFromMoveTupleList(self,p,possibleMoveTuples):
		moveTuples = []
		for m in possibleMoveTuples:
			if m[0] == p:
				moveTuples.append(m)
		return moveTuples
class ChessAI_offense(ChessAI_defense):
	def GetMove(self,board,color):
		myPieces = self.moherehaye_harakatdar(board,color)
		harifPieces = self.GetharifPiecesWithharakate_mojaz(board,color)
		#inja AI harakatio tarjih khahad dad ke mana natunam begiram.
		protectedMoveTuples = self.GetProtectedMoveTuples(board,color,myPieces,harifPieces)
		#olaviat aval hamlei ke be man hamle kone
		movesThatPutharifInCheck = self.GetMovesThatPutharifInCheck(board,color,protectedMoveTuples)
		if len(movesThatPutharifInCheck) > 0:
			#print "Picking move that puts harif in check"
			return movesThatPutharifInCheck[random.randint(0,len(movesThatPutharifInCheck)-1)]
		#hamlei mikone ke yeki az mohre haye harifo migire
		for pieceType in self.piecePriority:
			capturePieceMoves = self.GetMovesThatCaptureharifPiece(board,color,pieceType,protectedMoveTuples)
			if len(capturePieceMoves) > 0:
				return capturePieceMoves[random.randint(0,len(capturePieceMoves)-1)]

		#olaviate 3 harakati mkone ke khatar roshu raf kone
		for pieceType in self.piecePriority:
			piecesProtectedMoves = self.GetMovesThatProtectPiece(board,color,pieceType,protectedMoveTuples)
			if len(piecesProtectedMoves) > 0:
				return piecesProtectedMoves[random.randint(0,len(piecesProtectedMoves)-1)]
		#age az 1ta 3 chizi nadasht yeki az protected ha bar midare dg
		if len(protectedMoveTuples) > 0:
			return protectedMoveTuples[random.randint(0,len(protectedMoveTuples)-1)]
		else:
			return ChessAI_random.GetMove(self,board,color)

if __name__ == "__main__":

	from ChessBoard import ChessBoard
	cb = ChessBoard(3)
	board = cb.GetState()
	color = 'black'

	from ChessGUI_pygame import ChessGUI_pygame
	gui = ChessGUI_pygame()
	gui.Draw(board,highlightSquares=[])
	defense = ChessAI_defense('Bob','black')

	myPieces = defense.moherehaye_harakatdar(board,color)
	harifPieces = defense.GetharifPiecesWithharakate_mojaz(board,color)
	protectedMoveTuples = defense.GetProtectedMoveTuples(board,color,myPieces,harifPieces)
	movesThatPutharifInCheck = defense.GetMovesThatPutharifInCheck(board,color,protectedMoveTuples)
	print ("MyPieces = ", cb.ConvertSquareListToAlgebraicNotation(myPieces))
	print ("harifPieces = ", cb.ConvertSquareListToAlgebraicNotation(harifPieces))
	print ("protectedMoveTuples = ", cb.ConvertMoveTupleListToAlgebraicNotation(protectedMoveTuples))
	print ("movesThatPutharifInCheck = ", cb.ConvertMoveTupleListToAlgebraicNotation(movesThatPutharifInCheck))
Example #10
0
class PythonChessMain:
    def __init__(self, options):
        if options.debug:
            self.Board = ChessBoard(2)
            self.debugMode = True
        else:
            self.Board = ChessBoard(
                0
            )  #0 for normal board setup; see ChessBoard class for other options (for testing purposes)
            self.debugMode = False

        self.Rules = ChessRules()

    def SetUp(self, options):
        #gameSetupParams: Player 1 and 2 Name, Color, Human/AI level
        if self.debugMode:
            player1Name = 'Atahualpa'
            player1Type = 'humano'
            player1Color = 'blanco'
            player2Name = 'Huascar'
            player2Type = 'randomAI'
            player2Color = 'negro'
        else:
            GameParams = TkinterGameSetupParams()
            (player1Name, player1Color, player1Type, player2Name, player2Color,
             player2Type) = GameParams.GetGameSetupParams()

        self.player = [0, 0]
        self.redis = player1Type
        if player1Type == 'humano':
            self.player[0] = ChessPlayer(player1Name, player1Color)
        elif player1Type == 'server':
            self.player[0] = ChessPlayer(player1Name, player1Color)
        elif player1Type == 'client':
            self.player[0] = ChessPlayer(player2Name, player2Color)
        elif player1Type == 'offenseAI':
            self.player[0] = ChessAI_offense(player1Name, player1Color)

        if player2Type == 'humano':
            self.player[1] = ChessPlayer(player2Name, player2Color)
        elif player2Type == 'server':
            self.player[1] = ChessPlayer(player1Name, player1Color)
        elif player2Type == 'client':
            self.player[1] = ChessPlayer(player2Name, player2Color)
        elif player2Type == 'offenseAI':
            self.player[1] = ChessAI_offense(player2Name, player2Color)

        if options.pauseSeconds > 0:
            self.AIpause = True
            self.AIpauseSeconds = int(options.pauseSeconds)
        else:
            self.AIpause = False

        #create the gui object - didn't do earlier because pygame conflicts with any gui manager (Tkinter, WxPython...)
        if options.text:
            self.guitype = 'text'
            self.Gui = ChessGUI_text()
        else:
            self.guitype = 'pygame'
            if options.old:
                self.Gui = ChessGUI_pygame(0)
            else:
                self.Gui = ChessGUI_pygame(1)

    """def reDato(self,s,sc):
		print "globales"
		global hilo
		global datito
		print "esperando mensaje"
		mensaje = sc.recv(1024)
		print "recibido"
		datito=mensaje
		print "hilito"
		hilo = 1
        print "brack"""

    def MainLoop(self):
        hilo = 0
        datito = "123"
        s = 0
        sc = 0
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        #s.settimeout(20)
        verify = 2
        if self.redis == 'server':
            verify = 0
            serv = ventanaServer()
            (direccion) = serv.GetipServer()
            if direccion == '0':
                pygame.quit()
                sys.exit(0)
            else:
                s.bind((direccion, 9999))
                s.listen(1)
                s.settimeout(20)
                #s.setblocking (0)
                print "Esperando conexion..."
                sc, adr = s.accept()
                #sc.settimeout(20)
                #sc.setblocking (0)
        elif self.redis == 'client':
            verify = 1
            clie = ventanaClient()
            (direccion1) = clie.GetipClient()
            if direccion1 == '0':
                pygame.quit()
                sys.exit(0)
            else:
                s.connect((direccion1, 9999))
        currentPlayerIndex = 0
        turnCount = 0
        sinComer = 0
        reySoloBlanco = 0
        reySoloNegro = 0
        reySolo = 0
        ayniN = 0
        ayniB = 0
        while not self.Rules.IsCheckmate(self.Board.GetState(),
                                         self.player[currentPlayerIndex].color,
                                         ayniB, ayniN):
            board = self.Board.GetState()
            currentColor = self.player[currentPlayerIndex].GetColor()
            #hardcoded so that player 1 is always white
            if currentColor == 'blanco':
                turnCount = turnCount + 1
            self.Gui.PrintMessage("")
            baseMsg = "TURNO %s - %s (%s)" % (
                str(turnCount), self.player[currentPlayerIndex].GetName(),
                currentColor)
            self.Gui.PrintMessage("-----%s-----" % baseMsg)
            self.Gui.Draw(board)
            if self.Rules.IsInCheck(board, currentColor):
                self.Gui.PrintMessage(
                    "Peligro..." + self.player[currentPlayerIndex].GetName() +
                    " (" + self.player[currentPlayerIndex].GetColor() +
                    ") esta en jaque")
                jak = jake()
                (ka) = jak.aviso()
            if currentColor == 'negro' and verify == 0:  #self.player[currentPlayerIndex].GetType() == 'server' and turnCount%2!=0: blanco espera movimiento
                """#s.settimeout(20)
				#s.setblocking (0)
				#hilo=False
				print "ejecutando el treaht"
				thread.start_new_thread(self.reDato,(s,sc))
				hilo=0
				print hilo,"bucle infinito"
				while (hilo==0):
						pass
				#hilo=True
				print "salio de bucle",hilo
				recibido=datito"""
                recibido = sc.recv(1024)
                if recibido == "empate":
                    empa = confirmarDerrota()
                    (empat) = empa.confirmacionEmpate()
                    if empat == 1:
                        sc.send("aceptar")
                        em = empate()
                        (emp) = em.mostrarEmpate()
                        self.Gui.EndGame(board)
                    elif empat == 2:
                        sc.send("no")
                        recibido = sc.recv(1024)
                elif recibido == "salir":
                    vi = victoria()
                    (vic) = vi.mostrarVictoria()
                    self.Gui.EndGame(board)
                else:
                    numero = int(recibido)
                    Aa = numero / 1000
                    AA = numero % 1000
                    Ee = AA / 100
                    EE = AA % 100
                    Ii = EE / 10
                    II = EE % 10
                    moveTuple = (Aa, Ee), (Ii, II)

            elif currentColor == 'blanco' and verify == 0:  #self.player[currentPlayerIndex].GetType() == 'client' and turnCount%2==0: blanco hace su movimiento
                moveTuple = self.Gui.GetPlayerInput(board, currentColor,
                                                    verify, s, sc, ayniB,
                                                    ayniN)
                (a, e), (i, o) = moveTuple
                A = str(a)
                E = str(e)
                I = str(i)
                O = str(o)
                mensaje = A + E + I + O
                sc.send(mensaje)
            elif currentColor == 'blanco' and verify == 1:  #negro espera movimiento
                recibido = s.recv(1024)
                if recibido == "empate":
                    empa = confirmarDerrota()
                    (empat) = empa.confirmacionEmpate()
                    if empat == 1:
                        s.send("aceptar")
                        em = empate()
                        (emp) = em.mostrarEmpate()
                        self.Gui.EndGame(board)
                    elif empat == 2:
                        s.send("no")
                        recibido = s.recv(1024)
                elif recibido == "salir":
                    vi = victoria()
                    (vic) = vi.mostrarVictoria()
                    self.Gui.EndGame(board)
                else:
                    numero = int(recibido)
                    Aa = numero / 1000
                    AA = numero % 1000
                    Ee = AA / 100
                    EE = AA % 100
                    Ii = EE / 10
                    II = EE % 10
                    moveTuple = (Aa, Ee), (Ii, II)
            elif currentColor == 'negro' and verify == 1:  #blanco hace su movimiento
                moveTuple = self.Gui.GetPlayerInput(board, currentColor,
                                                    verify, s, sc, ayniB,
                                                    ayniN)
                (a, e), (i, o) = moveTuple
                A = str(a)
                E = str(e)
                I = str(i)
                O = str(o)
                mensaje = A + E + I + O
                s.send(mensaje)
            else:
                moveTuple = self.Gui.GetPlayerInput(board, currentColor,
                                                    verify, s, sc, ayniB,
                                                    ayniN)
            moveReport, contadorsito, solito, ayni = self.Board.MovePiece(
                moveTuple
            )  #moveReport = string like "White Bishop moves from A1 to C3" (+) "and captures ___!"
            self.Gui.PrintMessage(moveReport)
            currentPlayerIndex = (
                currentPlayerIndex + 1
            ) % 2  #this will cause the currentPlayerIndex to toggle between 1 and 0
            if ayni == 1:
                ayniB = ayniB + 1
                print ayniB, "y", ayniN
            elif ayni == 2:
                ayniN = ayniN + 1
                print ayniB, "y", ayniN
            if contadorsito == 1:
                sinComer = sinComer + 1
            else:
                sinComer = 0
            if solito == 1:
                reySoloNegro = reySoloNegro + 1
            elif solito == 0:
                reySoloBlanco = reySoloBlanco + 1
            if reySoloBlanco == 14 or reySoloNegro == 14:
                reySolo = reySolo + 1
            if sinComer == 28 or reySolo == 15:
                em = empate()
                (emp) = em.mostrarEmpate()
                self.Gui.EndGame(board)

        s.close()
        self.Gui.PrintMessage(
            "--------------------------------------------------     JAKE MATE")
        winnerIndex = (currentPlayerIndex + 1) % 2
        self.Gui.PrintMessage(self.player[winnerIndex].GetName() + " (" +
                              self.player[winnerIndex].GetColor() +
                              ") gano el juego")
        if (self.player[winnerIndex].GetColor() == 'blanco' and verify
                == 0) or (self.player[winnerIndex].GetColor() == 'negro'
                          and verify == 1):
            vi = victoria()
            (vic) = vi.mostrarVictoria()
        elif (self.player[winnerIndex].GetColor() == 'negro' and verify
              == 0) or (self.player[winnerIndex].GetColor() == 'blanco'
                        and verify == 1):
            dec = derrota()
            (derr) = dec.mostrarDerrota()
        else:
            vi = victoria()
            (vic) = vi.mostrarVictoria()
        self.Gui.EndGame(board)
Example #11
0
    def __init__(self, options):
        self.board = chess.Board()

        self.Gui = ChessGUI_pygame(1)
        self.ai_players = {}
Example #12
0
class PythonChessMain:
    def __init__(self, options):
        self.board = chess.Board()

        self.Gui = ChessGUI_pygame(1)
        self.ai_players = {}

    def SetUp(self):
        game_params = TkinterGameSetupParams()
        (player1Type, player1Depth, player2Type, player2Depth) = game_params.GetGameSetupParams()

        if player1Type == 'AI':
            if player1Depth > 0:
                self.ai_players[chess.WHITE] = AI(self.board, chess.WHITE, player1Depth)
            else:
                self.ai_players[chess.WHITE] = RandomAI()

        if player2Type == 'AI':
            if player2Depth > 0:
                self.ai_players[chess.BLACK] = AI(self.board, chess.BLACK, player2Depth)
            else:
                self.ai_players[chess.BLACK] = RandomAI(self.board)

    def MainLoop(self):
        while not self.board.is_game_over():
            board = self.board
            player = "WHITE" if board.turn else "BLACK"
            # hardcoded so that player 1 is always white
            self.Gui.PrintMessage("")
            baseMsg = "TURN %s - %s" % (board.fullmove_number, player)
            self.Gui.PrintMessage("-----%s-----" % baseMsg)
            self.Gui.Draw(board)
            if board.is_check():
                self.Gui.PrintMessage("Warning... " + player + " is in check!")

            # Get move from player
            if board.turn in self.ai_players:
                move = self.ai_players[board.turn].GetNextMove()
            else:
                move = self.Gui.GetPlayerInput(board)
                if board.piece_type_at(move.from_square) is chess.PAWN and move.to_square in chess.SquareSet(
                        chess.BB_RANK_8):
                    move.promotion = chess.QUEEN

            # Indicate if piece was captured
            if board.is_capture(move):
                if board.is_en_passant(move):
                    piece_captured = PIECE_NAMES[chess.PAWN]
                else:
                    piece_captured = PIECE_NAMES[board.piece_at(move.to_square).piece_type]
                self.Gui.PrintMessage(
                    PIECE_NAMES[board.piece_at(move.from_square).piece_type] + ' ' +
                    str(move) + '    ' + piece_captured + ' was captured')
            else:
                self.Gui.PrintMessage(PIECE_NAMES[board.piece_at(move.from_square).piece_type] + ' '
                                      + str(move))

            board.push(move)

        # Check for end game conditions
        if board.is_game_over():
            self.Gui.PrintMessage('')
            winner = 'Black' if board.turn else 'White'
            draw_message = 'The game is a draw!'
            if board.is_checkmate():
                self.Gui.PrintMessage("Checkmate!")
                self.Gui.PrintMessage(winner + " won the game!")
            elif board.is_stalemate():
                self.Gui.PrintMessage("Stalemate!")
                self.Gui.PrintMessage(draw_message)
            elif board.is_insufficient_material():
                self.Gui.PrintMessage("Insufficient Material!")
                self.Gui.PrintMessage(draw_message)
            elif board.is_fivefold_repetition():
                self.Gui.PrintMessage("Fivefold Repetition!")
                self.Gui.PrintMessage(draw_message)
            elif board.is_seventyfive_moves():
                self.Gui.PrintMessage("Seventy Five Move Rule!")
                self.Gui.PrintMessage(draw_message)
            self.Gui.PrintMessage('Result: ' + board.result())
            self.Gui.EndGame(board)