Exemple #1
0
 def moveForLongNotation(self, notation) :
     transTable = str.maketrans('abcdefgh', '01234567')
     humanInput = humanInput.translate(transTable)
     humanInput = [int(c) for c in humanInput]
     oldPos = C(humanInput[0], humanInput[1])
     newPos = C(humanInput[2], humanInput[3])
     return Move(oldPos, newPos)
Exemple #2
0
 def getPossibleMoves(self):
     currentPosition = self.position
     directions = [C(1, 1), C(1, -1), C(-1, 1), C(-1, -1)]
     for direction in directions:
         for move in self.movesInDirectionFromPos(currentPosition,
                                                  direction, self.side):
             yield move
Exemple #3
0
 def getPossibleMoves(self):
     # Function run to yield a group of all possible legal and illegal
     # 'Move' objects to the calling function. Does this by providing a list
     # of directions to the 'movesInDirectionFromPos' function which then
     # returns the moves to be yielded.
     pos = self.position
     directions = [C(1, 1), C(-1, -1), C(-1, 1), C(1, -1)]
     for direction in directions:
         for move in self.movesInDirectionFromPos(pos, direction,
                                                  self.side):
             yield move
Exemple #4
0
    def makeUnicodeStringRep(self, pieces):
        DISPLAY_LOOKUP = {
            "R": "♜",
            "N": "♞",
            "B": "♝",
            "K": "♚",
            "Q": "♛",
            "P": "♟",
        }

        stringRep = ''
        for y in range(7, -1, -1):
            for x in range(8):
                piece = None
                for p in pieces:
                    if p.position == C(x, y):
                        piece = p
                        break
                on_color = 'on_cyan' if y % 2 == x % 2 else 'on_yellow'
                pieceRep = colored('  ', on_color=on_color)
                if piece:
                    side = piece.side
                    color = 'white' if side == WHITE else 'grey'
                    pieceRep = colored(piece.stringRep + ' ',
                                       color=color,
                                       on_color=on_color)
                stringRep += pieceRep
            stringRep += '\n'
        return stringRep.rstrip()
Exemple #5
0
    def makeUnicodeStringRep(self, pieces):
        DISPLAY_LOOKUP = {
            "R": '♜',
            "N": '♞',
            "B": '♝',
            "K": '♚',
            "Q": '♛',
            "P": '♟',
        }

        stringRep = ''
        for y in range(7, -1, -1):
            for x in range(8):
                piece = None
                for p in pieces:
                    if p.position == C(x, y):
                        piece = p
                        break
                on_color = 'on_cyan' if y % 2 == x % 2 else 'on_yellow'
                pieceRep = colored('  ', on_color=on_color)
                if piece:
                    side = piece.side
                    color = 'white' if side == WHITE else 'grey'
                    pieceRep = colored(DISPLAY_LOOKUP[piece.stringRep] + ' ',
                                       color=color,
                                       on_color=on_color)
                else:
                    if (x + y) % 2 == 0:
                        pieceRep = 'X'
                    else:
                        pieceRep = ' '
                stringRep += pieceRep + ' '
            stringRep += '\n'
        return stringRep.rstrip()
Exemple #6
0
 def movesInDirectionFromPos(self, pos, direction, side) :
     for dis in range(1, 8) :
         movement = C(dis * direction[X], dis * direction[Y])
         newPos = pos + movement
         if self.board.isValidPos(newPos) :
             pieceAtNewPos = self.board.pieceAtPosition(newPos)
             if pieceAtNewPos is None :
                 yield Move(self, newPos)
             
             elif pieceAtNewPos is not None :
                 if pieceAtNewPos.side != side :
                     yield Move(self, newPos, pieceToCapture = pieceAtNewPos)
                 return
Exemple #7
0
    def getPossibleMoves(self):
        # Function run to yield a group of all possible legal and illegal
        # 'Move' objects to the calling function. Does this by running through
        # a list of movements and testing for valid moves before yielding them.
        # Also handles the promotion of pieces and the ability for a piece to
        # move two spaces forward on its first move.
        pos = self.position
        movement = C(0, 1) if self.side == WHITE else C(0, -1)
        advanceOnePos = pos + movement
        if self.board.isValidPos(advanceOnePos):
            if self.board.pieceAtPosition(advanceOnePos) is None:
                col = advanceOnePos[1]
                if col in [7, 0]:
                    piecesForPromotion = \
                        [Rook(self.board, self.side, advanceOnePos),
                         Knight(self.board, self.side, advanceOnePos),
                         Bishop(self.board, self.side, advanceOnePos),
                         Queen(self.board, self.side, advanceOnePos)]
                    for piece in piecesForPromotion:
                        move = Move(self, advanceOnePos)
                        move.promotion = True
                        piece.movesMade = self.movesMade
                        move.specialMovePiece = piece
                        yield move
                else:
                    yield Move(self, advanceOnePos)

        if self.movesMade == 0:
            advanceTwoPos = pos + movement + movement
            if self.board.isValidPos(advanceTwoPos):
                if self.board.pieceAtPosition(advanceTwoPos) is None and \
                        self.board.pieceAtPosition(advanceOnePos) is None:
                    yield Move(self, advanceTwoPos)

        movements = [C(1, 1), C(
            -1, 1)] if self.side == WHITE else [C(1, -1), C(-1, -1)]
        for movement in movements:
            newPos = self.position + movement
            if self.board.isValidPos(newPos):
                pieceToTake = self.board.pieceAtPosition(newPos)
                if pieceToTake and pieceToTake.side != self.side:
                    col = newPos[1]
                    if col in [7, 0]:
                        piecesForPromotion = \
                            [Rook(self.board, self.side, newPos),
                             Knight(self.board, self.side, newPos),
                             Bishop(self.board, self.side, newPos),
                             Queen(self.board, self.side, newPos)]
                        for piece in piecesForPromotion:
                            move = Move(self,
                                        newPos,
                                        pieceToCapture=pieceToTake)
                            move.promotion = True
                            move.specialMovePiece = piece
                            yield move
                    else:
                        yield Move(self, newPos, pieceToCapture=pieceToTake)
Exemple #8
0
    def loadGame(self, filename):
        board = Board()
        board.pieces.clear()
        parserWhite = InputParser(board, WHITE)
        parserBlack = InputParser(board, BLACK)

        gameFile = open(filename, "r")
        lines = []
        for line in gameFile:
            lines.append(line)
        gameFile.close()

        histStr = lines[8]
        currentSide = ('W' == histStr[0])
        board.currentSide = currentSide

        pieceDict = dict.fromkeys(['p', '0', '1', '6', '7'], Pawn)
        pieceDict.update(dict.fromkeys(['k'], Knight))
        pieceDict.update(dict.fromkeys(['b'], Bishop))
        pieceDict.update(dict.fromkeys(['r', '2', '3', '8', '9'], Rook))
        pieceDict.update(dict.fromkeys(['q'], Queen))
        pieceDict.update(dict.fromkeys(['k', '4', '5', 'm'], King))

        for i in range(8):
            for j, p in enumerate(lines[i]):
                if p == '-':
                    continue
                coords = C(j, i)
                movesMade = 0
                if p.isalpha():
                    side = p.isupper()  #WHITE if True, else BLACK
                    if p.lower() == 'm':  #king on either side
                        movesMade = 2

                    #movesMade += 1 + int(p.isupper()) #movesMade = 1 or 2 based on p's case
                    #if p.lower() in "ab" and ((side == WHITE and coords[1] == 1) \
                    #    or (side == BLACK and coords[1] == 6)): #proves p is a pawn that hasn't moved
                    #    movesMade = 0
                else:
                    numP = int(p)
                    side = (numP % 2 == 0)  #WHITE if True, else BLACK
                    movesMade = 1 + int(numP > 5)

                board.pieces.extend(pieceDict[p.lower()](board, side, coords,
                                                         movesMade))

        #TODO: Process last move to enter into board.history
        return board
Exemple #9
0
 def makeStringRep(self, pieces):
     stringRep = ''
     for y in range(7, -1, -1):
         for x in range(8):
             piece = None
             for p in pieces:
                 if p.position == C(x, y):
                     piece = p
                     break
             pieceRep = ''
             if piece:
                 side = piece.side
                 color = 'blue' if side == WHITE else 'red'
                 pieceRep = piece.stringRep
             else:
                 pieceRep = '·'
             stringRep += pieceRep + ' '
         stringRep += '\n'
     return stringRep.rstrip()
Exemple #10
0
 def getPossibleMoves(self):
     board = self.board
     currentPos = self.position
     movements = [
         C(2, 1),
         C(2, -1),
         C(-2, 1),
         C(-2, -1),
         C(1, 2),
         C(1, -2),
         C(-1, -2),
         C(-1, 2)
     ]
     for movement in movements:
         newPos = currentPos + movement
         if board.isValidPos(newPos):
             pieceAtNewPos = board.pieceAtPosition(newPos)
             if pieceAtNewPos is None:
                 yield Move(self, newPos)
             elif pieceAtNewPos.side != self.side:
                 yield Move(self, newPos, pieceToCapture=pieceAtNewPos)
Exemple #11
0
 def getPossibleMoves(self):
     # Function run to yield a group of all possible legal and illegal
     # 'Move' objects to the calling function. Does this by running through
     # a list of movements and testing for valid moves before yielding them.
     board = self.board
     pos = self.position
     movements = [
         C(2, 1),
         C(2, -1),
         C(-2, 1),
         C(-2, -1),
         C(1, 2),
         C(1, -2),
         C(-1, 2),
         C(-1, -2)
     ]
     for movement in movements:
         newPos = pos + movement
         if board.isValidPos(newPos):
             pieceAtNewPos = board.pieceAtPosition(newPos)
             if pieceAtNewPos is None:
                 yield Move(self, newPos)
             elif pieceAtNewPos.side != self.side:
                 yield Move(self, newPos, pieceToCapture=pieceAtNewPos)
Exemple #12
0
 def makeStringRep(self, pieces):
     # This creates the raw printable board before it is passed to the
     # wrapping function. It goes through each 'spot' on the board and
     # depending on whether there is a piece assigned to said 'spot',
     # it will either add a simple white '-' or else add either a red
     # or a blue letter depending on the type of the piece.
     stringRep = ''
     for y in range(7, -1, -1):
         for x in range(8):
             piece = None
             for p in pieces:
                 if p.position == C(x, y):
                     piece = p
                     break
             if piece:
                 side = piece.side
                 color = 'cyan' if side == WHITE else 'red'
                 pieceRep = colored(piece.stringRep, color)
             else:
                 pieceRep = colored('-', 'white')
             stringRep += pieceRep + ' '
         stringRep += '\n'
     stringRep = stringRep.strip()
     return stringRep
Exemple #13
0
 def getPositionOfPiece(self, piece):
     for y in range(8):
         for x in range(8):
             if self.boardArray[y][x] is piece:
                 return C(x, 7 - y)
Exemple #14
0
    def getPossibleMoves(self):
        currentPos = self.position
        movements = [C(0, 1), C(0, -1), C(1, 0), C(-1, 0), C(1, 1), C(1, -1), C(-1, 1), C(-1, -1)]
        for movement in movements:
            newPos = currentPos + movement
            if self.board.isValidPos(newPos):
                pieceAtNewPos = self.board.pieceAtPosition(newPos)
                if self.board.pieceAtPosition(newPos) is None:
                    yield Move(self, newPos)
                elif pieceAtNewPos.side != self.side:
                    yield Move(self, newPos, pieceToCapture=pieceAtNewPos)

        # Castling
        if self.movesMade == 0:
            inCheck = False
            kingsideCastleBlocked = False
            queensideCastleBlocked = False
            kingsideCastleCheck = False
            queensideCastleCheck = False
            kingsideRookMoved = True
            queensideRookMoved = True

            kingsideCastlePositions = [self.position + C(1, 0), self.position + C(2, 0)]
            for pos in kingsideCastlePositions:
                if self.board.pieceAtPosition(pos):
                    kingsideCastleBlocked = True

            queensideCastlePositions = [self.position - C(1, 0), self.position - C(2, 0), self.position - C(3, 0)]
            for pos in queensideCastlePositions:
                if self.board.pieceAtPosition(pos):
                    queensideCastleBlocked = True

            if kingsideCastleBlocked and queensideCastleBlocked:
                return

            otherSideMoves = self.board.getAllMovesUnfiltered(not self.side, includeKing=False)
            for move in otherSideMoves:
                if move.newPos == self.position:
                    inCheck = True
                    break
                if move.newPos == self.position + C(1, 0) or move.newPos == self.position + C(2, 0):
                    kingsideCastleCheck = True
                if move.newPos == self.position - C(1, 0) or move.newPos == self.position - C(2, 0):
                    queensideCastleCheck = True

            kingsideRookPos = self.position + C(3, 0)
            kingsideRook = self.board.pieceAtPosition(kingsideRookPos) if self.board.isValidPos(kingsideRookPos) else None
            if kingsideRook and kingsideRook.stringRep == 'R' and kingsideRook.movesMade == 0:
                kingsideRookMoved = False

            queensideRookPos = self.position - C(4, 0)
            queensideRook = self.board.pieceAtPosition(queensideRookPos) if self.board.isValidPos(queensideRookPos) else None
            if queensideRook and queensideRook.stringRep == 'R' and queensideRook.movesMade == 0:
                queensideRookMoved = False

            if not inCheck:
                if not kingsideCastleBlocked and not kingsideCastleCheck and not kingsideRookMoved:
                    move = Move(self, self.position + C(2, 0))
                    rookMove = Move(self.position, self.position + C(1, 0))
                    move.specialMovePiece = self.board.pieceAtPosition(kingsideRookPos)
                    move.kingsideCastle = True
                    move.rookMove = rookMove
                    yield move
                if not queensideCastleBlocked and not queensideCastleCheck and not queensideRookMoved:
                    move = Move(self, self.position - C(2, 0))
                    rookMove = Move(self.position, self.position - C(1, 0))
                    move.specialMovePiece = self.board.pieceAtPosition(queensideRookPos)
                    move.queensideCastle = True
                    move.rookMove = rookMove
                    yield move
Exemple #15
0
    def __init__(self,
                 mateInOne=False,
                 castleBoard=False,
                 pessant=False,
                 promotion=False):
        self.pieces = []
        self.history = []
        self.points = 0
        self.currentSide = WHITE
        self.movesMade = 0
        self.checkmate = False

        if not mateInOne and not castleBoard and not pessant and not promotion:
            self.pieces.extend([
                Rook(self, BLACK, C(0, 7)),
                Knight(self, BLACK, C(1, 7)),
                Bishop(self, BLACK, C(2, 7)),
                Queen(self, BLACK, C(3, 7)),
                King(self, BLACK, C(4, 7)),
                Bishop(self, BLACK, C(5, 7)),
                Knight(self, BLACK, C(6, 7)),
                Rook(self, BLACK, C(7, 7))
            ])
            for x in range(8):
                self.pieces.append(Pawn(self, BLACK, C(x, 6)))
            for x in range(8):
                self.pieces.append(Pawn(self, WHITE, C(x, 1)))
            self.pieces.extend([
                Rook(self, WHITE, C(0, 0)),
                Knight(self, WHITE, C(1, 0)),
                Bishop(self, WHITE, C(2, 0)),
                Queen(self, WHITE, C(3, 0)),
                King(self, WHITE, C(4, 0)),
                Bishop(self, WHITE, C(5, 0)),
                Knight(self, WHITE, C(6, 0)),
                Rook(self, WHITE, C(7, 0))
            ])

        elif promotion:
            pawnToPromote = Pawn(self, WHITE, C(1, 6))
            pawnToPromote.movesMade = 1
            kingWhite = King(self, WHITE, C(4, 0))
            kingBlack = King(self, BLACK, C(3, 2))
            self.pieces.extend([pawnToPromote, kingWhite, kingBlack])

        elif pessant:
            pawn = Pawn(self, WHITE, C(1, 4))
            pawn2 = Pawn(self, BLACK, C(2, 6))
            kingWhite = King(self, WHITE, C(4, 0))
            kingBlack = King(self, BLACK, C(3, 2))
            self.pieces.extend([pawn, pawn2, kingWhite, kingBlack])
            self.history = []
            self.currentSide = BLACK
            self.points = 0
            self.movesMade = 0
            self.checkmate = False
            firstMove = Move(pawn2, C(2, 4))
            self.makeMove(firstMove)
            self.currentSide = WHITE
            return
Exemple #16
0
 def humanCoordToPosition(self, coord):
     transTable = str.maketrans('abcdefgh', '12345678')
     coord = coord.translate(transTable)
     coord = [int(c) - 1 for c in coord]
     pos = C(coord[0], coord[1])
     return pos
Exemple #17
0
    def getPossibleMoves(self):
        # Function run to yield a group of all possible legal and illegal
        # 'Move' objects to the calling function. Does this by running through
        # a list of movements and testing for valid moves before yielding them.
        # Also goes through another special algorithm to test if it can also
        # perform another special type of move, a 'castle'.
        pos = self.position
        movements = [
            C(0, 1),
            C(-1, -1),
            C(1, 0),
            C(-1, 0),
            C(1, 1),
            C(1, -1),
            C(-1, 1),
            C(0, -1)
        ]
        for movement in movements:
            newPos = pos + movement
            if self.board.isValidPos(newPos):
                pieceAtNewPos = self.board.pieceAtPosition(newPos)
                if self.board.pieceAtPosition(newPos) is None:
                    yield Move(self, newPos)
                elif pieceAtNewPos.side != self.side:
                    yield Move(self, newPos, pieceToCapture=pieceAtNewPos)

        if self.movesMade == 0:  # CASTLING, HIGHLY WIP
            inCheck = False
            kingSideCastleBlocked = False
            queenSideCastleBlocked = False
            kingSideCastleCheck = False
            queenSideCastleCheck = False
            kingSideRookMoved = True
            queenSideRookMoved = True

            kingSideCastlePositions = [
                self.position - C(1, 0), self.position - C(2, 0)
            ]
            for position in kingSideCastlePositions:
                if self.board.pieceAtPosition(position):
                    kingSideCastleBlocked = True

            queenSideCastlePositions = [
                self.position + C(1, 0), self.position + C(2, 0),
                self.position + C(3, 0)
            ]
            for position in queenSideCastlePositions:
                if self.board.pieceAtPosition(position):
                    queenSideCastleBlocked = True

            if kingSideCastleBlocked and queenSideCastleBlocked:
                return

            opponentMoves = self.board.getAllMovesUnfiltered(not self.side,
                                                             includeKing=False)

            for move in opponentMoves:
                if move.newPos == self.position:
                    inCheck = True
                    break
                if move.newPos == self.position - C(1, 0) or \
                        move.newPos == self.position - C(2, 0):
                    kingSideCastleCheck = True
                if move.newPos == self.position + C(1, 0) or \
                        move.newPos == self.position + C(2, 0):
                    queenSideCastleCheck = True

            kingSideRookPos = self.position - C(3, 0)
            kingSideRook = self.board.pieceAtPosition(kingSideRookPos) \
                if self.board.isValidPos(kingSideRookPos) else None
            if kingSideRook and \
                    kingSideRook.stringRep == 'R' and \
                    kingSideRook.movesMade == 0:
                kingSideRookMoved = False

            queenSideRookPos = self.position + C(4, 0)
            queenSideRook = self.board.pieceAtPosition(queenSideRookPos) \
                if self.board.isValidPos(kingSideRookPos) else None
            if queenSideRook and \
                    queenSideRook.stringRep == 'R' and \
                    queenSideRook.movesMade == 0:
                queenSideRookMoved = False

            if not inCheck:
                if not kingSideCastleBlocked and \
                        not kingSideCastleCheck and \
                        not kingSideRookMoved:
                    move = Move(self, self.position - C(2, 0))
                    move.specialMovePiece = self.board.pieceAtPosition(
                        kingSideRookPos)
                    rookMove = Move(move.specialMovePiece,
                                    self.position - C(1, 0))
                    move.kingSideCastle = True
                    move.rookMove = rookMove
                    move.castle = True
                    yield move
                if not queenSideCastleBlocked and \
                        not queenSideCastleCheck and \
                        not queenSideRookMoved:
                    move = Move(self, self.position + C(2, 0))
                    move.specialMovePiece = self.board.pieceAtPosition(
                        queenSideRookPos)
                    rookMove = Move(move.specialMovePiece,
                                    self.position + C(1, 0))
                    move.queenSideCastle = True
                    move.rookMove = rookMove
                    move.castle = True
                    yield move
Exemple #18
0
    def __init__(self,
                 mateInOne=False,
                 castleBoard=False,
                 passant=False,
                 promotion=False):
        self.pieces = []
        self.history = []
        self.points = 0
        self.currentSide = WHITE
        self.movesMade = 0
        self.checkmate = False

        if not mateInOne and not castleBoard and not passant and not promotion:
            self.pieces.extend([
                Rook(self, BLACK, C(0, 7)),
                Knight(self, BLACK, C(1, 7)),
                Bishop(self, BLACK, C(2, 7)),
                Queen(self, BLACK, C(3, 7)),
                King(self, BLACK, C(4, 7)),
                Bishop(self, BLACK, C(5, 7)),
                Knight(self, BLACK, C(6, 7)),
                Rook(self, BLACK, C(7, 7))
            ])
            for x in range(8):
                self.pieces.append(Pawn(self, BLACK, C(x, 6)))
            for x in range(8):
                self.pieces.append(Pawn(self, WHITE, C(x, 1)))
            self.pieces.extend([
                Rook(self, WHITE, C(0, 0)),
                Knight(self, WHITE, C(1, 0)),
                Bishop(self, WHITE, C(2, 0)),
                Queen(self, WHITE, C(3, 0)),
                King(self, WHITE, C(4, 0)),
                Bishop(self, WHITE, C(5, 0)),
                Knight(self, WHITE, C(6, 0)),
                Rook(self, WHITE, C(7, 0))
            ])

        elif mateInOne:
            kingW = King(self, WHITE, C(4, 0))
            kingB = King(self, BLACK, C(4, 7))
            rook1 = Rook(self, WHITE, C(3, 0))
            rook2 = Rook(self, WHITE, C(5, 0))
            queen = Queen(self, WHITE, C(7, 1))
            self.pieces.extend([kingW, kingB, rook1, rook2, queen])

        elif castleBoard:
            kingW = King(self, WHITE, C(4, 0))
            kingB = King(self, BLACK, C(4, 7))
            rook1 = Rook(self, WHITE, C(0, 0))
            rook2 = Rook(self, WHITE, C(7, 0))
            pawn1 = Pawn(self, WHITE, C(1, 3))
            pawn2 = Pawn(self, WHITE, C(2, 1))
            bshp = Bishop(self, WHITE, C(3, 3))
            queen = Queen(self, BLACK, C(2, 4))
            self.pieces.extend(
                [kingW, kingB, rook1, rook2, pawn1, pawn2, bshp, queen])

        elif promotion:
            pawn1 = Pawn(self, WHITE, C(1, 6))
            pawn1.movesMade = 1
            pawn2 = Pawn(self, WHITE, C(2, 6))
            pawn3 = Pawn(self, WHITE, C(3, 5))
            pawnB = Pawn(self, BLACK, C(2, 7))
            kingWhite = King(self, WHITE, C(4, 0))
            kingBlack = King(self, BLACK, C(3, 2))
            self.pieces.extend(
                [pawn1, pawn2, pawn3, pawnB, kingWhite, kingBlack])

        elif passant:
            pawn = Pawn(self, WHITE, C(1, 4))
            pawn2 = Pawn(self, BLACK, C(2, 6))
            kingWhite = King(self, WHITE, C(4, 0))
            kingBlack = King(self, BLACK, C(3, 2))
            self.pieces.extend([pawn, pawn2, kingWhite, kingBlack])
            self.history = []
            self.currentSide = BLACK
            self.points = 0
            self.movesMade = 0
            self.checkmate = False
            firstMove = Move(pawn2, C(2, 4))
            self.makeMove(firstMove)
            self.currentSide = WHITE
            return
Exemple #19
0
    def getPossibleMoves(self):
        currentPosition = self.position

        # Pawn moves one up
        movement = C(0, 1) if self.side == WHITE else C(0, -1)
        advanceOnePosition = currentPosition + movement
        if self.board.isValidPos(advanceOnePosition):
            #Promotion moves
            if self.board.pieceAtPosition(advanceOnePosition) is None:
                col = advanceOnePosition[1]
                if col == 7 or col == 0:
                    piecesForPromotion = [
                        Rook(self.board, self.side, advanceOnePosition),
                        Knight(self.board, self.side, advanceOnePosition),
                        Bishop(self.board, self.side, advanceOnePosition),
                        Queen(self.board, self.side, advanceOnePosition)
                    ]
                    for piece in piecesForPromotion:
                        move = Move(self, advanceOnePosition)
                        move.promotion = True
                        move.specialMovePiece = piece
                        yield move
                else:
                    yield Move(self, advanceOnePosition)

        #Pawn moves two up
        if self.movesMade == 0:
            movement = C(0, 2) if self.side == WHITE else C(0, -2)
            advanceTwoPosition = currentPosition + movement
            if self.board.isValidPos(advanceTwoPosition):
                if self.board.pieceAtPosition(
                        advanceTwoPosition
                ) is None and self.board.pieceAtPosition(
                        advanceOnePosition) is None:
                    yield Move(self, advanceTwoPosition)

        #Pawn takes
        movements = [C(1, 1), C(
            -1, 1)] if self.side == WHITE else [C(1, -1), C(-1, -1)]

        for movement in movements:
            newPosition = self.position + movement
            if self.board.isValidPos(newPosition):
                pieceToTake = self.board.pieceAtPosition(newPosition)
                if pieceToTake and pieceToTake.side != self.side:
                    col = newPosition[1]
                    #Promotions
                    if col == 7 or col == 0:
                        piecesForPromotion = [
                            Rook(self.board, self.side, newPosition),
                            Knight(self.board, self.side, newPosition),
                            Bishop(self.board, self.side, newPosition),
                            Queen(self.board, self.side, newPosition)
                        ]
                        for piece in piecesForPromotion:
                            move = Move(self, advanceOnePosition)
                            move.promotion = True
                            move.specialMovePiece = piece
                            yield move
                    else:
                        yield Move(self,
                                   newPosition,
                                   pieceToCapture=pieceToTake)

        #En pessant
        movements = [C(1, 1), C(
            -1, 1)] if self.side == WHITE else [C(1, -1), C(-1, -1)]
        for movement in movements:
            posBesidePawn = self.position + C(movement[0], 0)
            if self.board.isValidPos(posBesidePawn):
                pieceBesidePawn = self.board.pieceAtPosition(posBesidePawn)
                lastPieceMoved = self.board.getLastPieceMoved()
                lastMoveWasAdvanceTwo = False
                lastMove = self.board.getLastMove()

                if lastMove:
                    if lastMove.newPos - lastMove.oldPos == C(
                            0, 2) or lastMove.newPos - lastMove.oldPos == C(
                                0, -2):
                        lastMoveWasAdvanceTwo = True

                if pieceBesidePawn and pieceBesidePawn.stringRep == 'p' and pieceBesidePawn.side != self.side and lastPieceMoved is pieceBesidePawn and lastMoveWasAdvanceTwo:
                    move = Move(self,
                                self.position + movement,
                                pieceToCapture=pieceBesidePawn)
                    move.pessant = True
                    move.specialMovePiece = pieceBesidePawn
                    yield move
Exemple #20
0
    def getPossibleMoves(self):
        currentPosition = self.position

        # Движение пешки вперед на 1 клетку
        movement = C(0, 1) if self.side == WHITE else C(0, -1)
        advanceOnePosition = currentPosition + movement
        if self.board.isValidPos(advanceOnePosition):
            # Продвижение
            if self.board.pieceAtPosition(advanceOnePosition) is None:
                col = advanceOnePosition[1]
                if col == 7 or col == 0:
                    piecesForPromotion = \
                        [Rook(self.board, self.side, advanceOnePosition),
                         Knight(self.board, self.side, advanceOnePosition),
                         Bishop(self.board, self.side, advanceOnePosition),
                         Queen(self.board, self.side, advanceOnePosition)]
                    for piece in piecesForPromotion:
                        move = Move(self, advanceOnePosition)
                        move.promotion = True
                        move.specialMovePiece = piece
                        yield move
                else:
                    yield Move(self, advanceOnePosition)

        # Пешка ходит вперед на 2 клетки
        if self.movesMade == 0:
            movement = C(0, 2) if self.side == WHITE else C(0, -2)
            advanceTwoPosition = currentPosition + movement
            if self.board.isValidPos(advanceTwoPosition):
                if self.board.pieceAtPosition(advanceTwoPosition) is None and \
                   self.board.pieceAtPosition(advanceOnePosition) is None:
                    yield Move(self, advanceTwoPosition)

        # Пешка ест фигуру противника
        movements = [C(1, 1), C(-1, 1)] \
            if self.side == WHITE else [C(1, -1), C(-1, -1)]

        for movement in movements:
            newPosition = self.position + movement
            if self.board.isValidPos(newPosition):
                pieceToTake = self.board.pieceAtPosition(newPosition)
                if pieceToTake and pieceToTake.side != self.side:
                    col = newPosition[1]
                    # достижения другого конца доски, выбор новой фигуры
                    if col == 7 or col == 0:
                        piecesForPromotion = \
                            [Rook(self.board, self.side, newPosition),
                             Knight(self.board, self.side, newPosition),
                             Bishop(self.board, self.side, newPosition),
                             Queen(self.board, self.side, newPosition)]
                        for piece in piecesForPromotion:
                            move = Move(self, advanceOnePosition)
                            move.promotion = True
                            move.specialMovePiece = piece
                            yield move
                    else:
                        yield Move(self, newPosition,
                                   pieceToCapture=pieceToTake)

        #
        movements = [C(1, 1), C(-1, 1)] \
            if self.side == WHITE else [C(1, -1), C(-1, -1)]
        for movement in movements:
            posBesidePawn = self.position + C(movement[0], 0)
            if self.board.isValidPos(posBesidePawn):
                pieceBesidePawn = self.board.pieceAtPosition(posBesidePawn)
                lastPieceMoved = self.board.getLastPieceMoved()
                lastMoveWasAdvanceTwo = False
                lastMove = self.board.getLastMove()

                if lastMove:
                    if lastMove.newPos - lastMove.oldPos == C(0, 2) or \
                       lastMove.newPos - lastMove.oldPos == C(0, -2):
                        lastMoveWasAdvanceTwo = True

                if pieceBesidePawn and \
                   pieceBesidePawn.stringRep == 'p' and \
                   pieceBesidePawn.side != self.side and \
                   lastPieceMoved is pieceBesidePawn and \
                   lastMoveWasAdvanceTwo:
                    move = Move(self, self.position + movement,
                                pieceToCapture=pieceBesidePawn)
                    move.pessant = True
                    move.specialMovePiece = pieceBesidePawn
                    yield move
Exemple #21
0
    def __init__(self):
        # The initialising function of the 'Board' class. Assigns all of the
        # attributes their starting values before creating all of the pieces
        # needed for the game.
        self.pieces = []
        self.history = []
        self.points = 0
        self.currentSide = WHITE
        self.movesMade = 0

        for x in range(8):
            self.pieces.append(Pawn(self, BLACK, C(x, 6)))
            self.pieces.append(Pawn(self, WHITE, C(x, 1)))
        self.pieces.extend([
            Rook(self, WHITE, C(0, 0)),
            Knight(self, WHITE, C(1, 0)),
            Bishop(self, WHITE, C(2, 0)),
            King(self, WHITE, C(3, 0)),
            Queen(self, WHITE, C(4, 0)),
            Bishop(self, WHITE, C(5, 0)),
            Knight(self, WHITE, C(6, 0)),
            Rook(self, WHITE, C(7, 0)),
            Rook(self, BLACK, C(0, 7)),
            Knight(self, BLACK, C(1, 7)),
            Bishop(self, BLACK, C(2, 7)),
            King(self, BLACK, C(3, 7)),
            Queen(self, BLACK, C(4, 7)),
            Bishop(self, BLACK, C(5, 7)),
            Knight(self, BLACK, C(6, 7)),
            Rook(self, BLACK, C(7, 7))
        ])