Пример #1
0
    def ResizeCanvas(self, canvasSize):
        # Save position of current pieces
        currentPositions = dict()
        for coordinate, piece in State().GetChessPiecePositions().items():
            currentPositions[coordinate] = piece

        # Recalculate parameters
        Parameters().CalculateDimensionParam(canvasSize)
        self.canvas.config(width=canvasSize, height=canvasSize)
        for ChessType in Parameters().GetTypesOfChess():
            ImgProcessor().ResizeChessPieceImages(ChessType)

        # Clear all objects
        self.ClearPiecesFromBoard()
        for object in self.chessboardObjects:
            self.canvas.delete(object)

        # Call functions to draw the chess board
        if State().GetChessType() == 'Chess':
            self.DrawChessBoard()
        elif State().GetChessType() == 'XiangQi':
            self.DrawXiangQiBoard()
        else:
            logging.error('Wrong "ChessType" when calling ResizeCanvas!')
            exit(1)

        # Add pieces to board
        for coordinate, chessPiece in currentPositions.items():
            self.AddPieceToBoard(chessPiece['PlayerColor'],
                                 chessPiece['PieceType'], coordinate)
Пример #2
0
    def RookMove(self, coordinate):
        CurrentMove = self.GetCurrentMove()
        PlayerColor = CurrentMove.GetPlayerColor()
        isValidMove = False

        if coordinate[0] == CurrentMove.GetStartPos()[0]:
            isValidMove = True
            CheckRange = (coordinate[1], CurrentMove.GetStartPos()[1])
            CheckRange = (min(CheckRange), max(CheckRange))
            for i in range(CheckRange[0] + 1, CheckRange[1]):
                if State().PieceExistsAtPosition((coordinate[0], i)):
                    isValidMove = False
                    break
        elif coordinate[1] == CurrentMove.GetStartPos()[1]:
            isValidMove = True
            CheckRange = (coordinate[0], CurrentMove.GetStartPos()[0])
            CheckRange = (min(CheckRange), max(CheckRange))
            for i in range(CheckRange[0] + 1, CheckRange[1]):
                if State().PieceExistsAtPosition((i, coordinate[1])):
                    isValidMove = False
                    break

        if isValidMove:
            self.GetCurrentMove().SetEndPos(coordinate)
            if CurrentMove.GetStartPos()[0] == 0 and self.GetCastlingStatus(
                    PlayerColor, 'Long'):
                self.SetCastlingStatus(PlayerColor, 'Long', False)
                self.GetCurrentMove().SetDisabledCastleTypes('Long')
            elif CurrentMove.GetStartPos()[0] == 7 and self.GetCastlingStatus(
                    PlayerColor, 'Short'):
                self.SetCastlingStatus(PlayerColor, 'Short', False)
                self.GetCurrentMove().SetDisabledCastleTypes('Short')
            return True
        return False
Пример #3
0
 def ClearPiecesFromBoard(self):
     for coordinate in State().GetChessPiecePositions():
         self.canvas.delete(self.chesspiecesObjects[coordinate][0])
         self.chesspiecesObjects.pop(coordinate)
     State().ClearChessPiecePositions()
     State().ClearMoveList()
     self.RemoveHighlights()
Пример #4
0
    def JuMove(self, coordinate):
        CurrentMove = self.GetCurrentMove()
        isValidMove = False

        if (coordinate[0] == CurrentMove.GetStartPos()[0]):
            isValidMove = True
            CheckRange = (coordinate[1], CurrentMove.GetStartPos()[1])
            CheckRange = (min(CheckRange), max(CheckRange))
            for i in range(CheckRange[0] + 1, CheckRange[1]):
                if State().PieceExistsAtPosition((coordinate[0], i)):
                    isValidMove = False
                    break
        elif (coordinate[1] == CurrentMove.GetStartPos()[1]):
            isValidMove = True
            CheckRange = (coordinate[0], CurrentMove.GetStartPos()[0])
            CheckRange = (min(CheckRange), max(CheckRange))
            for i in range(CheckRange[0] + 1, CheckRange[1]):
                if State().PieceExistsAtPosition((i, coordinate[1])):
                    isValidMove = False
                    break

        if isValidMove:
            self.GetCurrentMove().SetEndPos(coordinate)
            return True
        return False
Пример #5
0
    def lmb_callback(self, event):
        ChessType = State().GetChessType()
        CellSize = Parameters().GetCellSize(ChessType)
        BoardXStart, BoardXEnd = Parameters().GetBoardXLimits(ChessType)
        BoardYStart, BoardYEnd = Parameters().GetBoardYLimits(ChessType)

        # Handle events within the chessboard
        if BoardXStart < event.x < BoardXEnd and BoardYStart < event.y < BoardYEnd:
            x = int((event.x - BoardXStart) / CellSize)
            y = int((event.y - BoardYStart) / CellSize)

            # Check if x,y are allowed values
            if x < 0: x = 0
            if x >= Parameters().GetChessBoardXArray(ChessType):
                x = Parameters().GetChessBoardXArray(ChessType) - 1

            if y < 0: y = 0
            if y >= Parameters().GetChessBoardYArray(ChessType):
                y = Parameters().GetChessBoardYArray(ChessType) - 1

            coordinate = (x, y)
            if State().IsGameOngoing():
                MoveHandler().Process(coordinate)
            else:
                self.ChangePieceOnBoard(coordinate)
Пример #6
0
    def Process(self, coordinate):
        SelectedPiece = State().GetChessPieceAtPosition(coordinate)
        PlayerColor, PieceType = None, None
        if SelectedPiece != None:
            PlayerColor = SelectedPiece['PlayerColor']
            PieceType = SelectedPiece['PieceType']

        if self.GetCurrentMove().GetStartPiece() == None:
            if PieceType != None and (
                    self.GetMoveIndex() == 0
                    or self.GetPreviousMove().GetPlayerColor() != PlayerColor):
                self.GetCurrentMove().SetStartPieceAndPos(
                    PlayerColor, PieceType, coordinate)
                self.__ChessBoard.RemoveHighlights()
                self.__ChessBoard.AddHighlight(coordinate)
        else:
            if PieceType != None and PlayerColor == self.GetCurrentMove(
            ).GetPlayerColor():
                self.GetCurrentMove().SetStartPieceAndPos(
                    PlayerColor, PieceType, coordinate)
                self.__ChessBoard.RemoveHighlights()
                self.__ChessBoard.AddHighlight(coordinate)
            else:
                ChessType = State().GetChessType()
                if ChessType == 'Chess':
                    self.ChessMove(coordinate)
                elif ChessType == 'XiangQi':
                    self.XiangQiMove(coordinate)
Пример #7
0
    def ChangeChessType(self, target_type):
        State().SetChessType(target_type)
        self.ChessBoard.ClearPiecesFromBoard()
        self.ChessBoard.InitChessBoard()
        self.chesspieces.InitializeMenu()

        State().ClearMoveList()
        self.ChessBoard.RemoveHighlights()
Пример #8
0
 def AddPieceToBoard(self, PlayerColor, PieceType, coordinate):
     State().AddChessPieceToPosition(PlayerColor, PieceType, coordinate)
     ChessType = State().GetChessType()
     img = ImgProcessor().GetPhotoImage(ChessType,
                                        PlayerColor + '_' + PieceType)
     self.chesspiecesObjects[coordinate] = [
         self.canvas.create_image(Parameters().GetCellCenter(
             ChessType, coordinate),
                                  image=img), img
     ]
Пример #9
0
        def quickload():
            self.ChessBoard.ClearPiecesFromBoard()
            for coordinate, piece in State().GetQuickSavePosition().items():
                self.ChessBoard.AddPieceToBoard(piece['PlayerColor'],
                                                piece['PieceType'], coordinate)
            State().ClearMoveList()
            self.ChessBoard.RemoveHighlights()

            self.CaptionPanel.delete(0, tkinter.END)
            self.CaptionPanel.insert(0, State().GetSavedCaption())
Пример #10
0
    def InitChessBoard(self):
        self.ClearPiecesFromBoard()
        for object in self.chessboardObjects:
            self.canvas.delete(object)

        if State().GetChessType() == 'Chess':
            self.DrawChessBoard()
        elif State().GetChessType() == 'XiangQi':
            self.DrawXiangQiBoard()
        self.StartingPositions()
Пример #11
0
        def callback():
            if State().GetSelectedPieceToAddToBoard() != var.get():
                if var.get() != 'deselect':
                    State().ClearMoveList()
                    self.ChessBoard.RemoveHighlights()

                State().SetSelectedPieceToAddToBoard(var.get())
                if var.get() == 'deselect':
                    State().SetGameIsOngoing(True)
                else:
                    State().SetGameIsOngoing(False)
Пример #12
0
        def LoadFromFile():
            filename = filedialog.askopenfilename(
                initialdir='.',
                filetypes=(('Comma Separated Values', '*.csv*'), ('all files',
                                                                  '*.*')))

            if filename != '':
                data = dict()
                file = open(filename, 'r')

                lines = file.read().split('\n')
                self.CaptionPanel.delete(0, tkinter.END)
                self.CaptionPanel.insert(0, lines[0])

                for line in lines[1:]:
                    if line:
                        x, y, piece = line.split(',')
                        data[(int(x), int(y))] = piece
                file.close()

                # Get types of chess pieces
                chess_piece_types = set()
                for chess_piece in data.values():
                    chess_piece_types.add(chess_piece.split('_')[1])

                # Find out what type of chess it is
                ChessType = 'Chess'
                for piece in chess_piece_types:
                    if ChessType == 'Chess' and piece not in Parameters(
                    ).GetTypesOfChessPieces('Chess'):
                        ChessType = 'XiangQi'

                # Change chess type if neccessary
                if ChessType != State().GetChessType():
                    self.chess_type_var.set(ChessType)
                    self.ChangeChessType(ChessType)

                # Update chess pieces
                self.ChessBoard.ClearPiecesFromBoard()
                for coordinate, piece in data.items():
                    if 0 <= coordinate[0] < Parameters().GetChessBoardXArray(
                            ChessType) and 0 <= coordinate[1] < Parameters(
                            ).GetChessBoardYArray(ChessType):
                        self.ChessBoard.AddPieceToBoard(
                            piece['PlayerColor'], piece['PieceType'],
                            coordinate)
                    else:
                        msg = 'Coordinate ' + str(
                            coordinate
                        ) + ' is out of range!\nThe piece will be ignored.'
                        messagebox.showerror('Warning', msg)
                State().ClearMoveList()
                self.ChessBoard.RemoveHighlights()
Пример #13
0
    def AddMenu(self):
        ChessType = State().GetChessType()
        PlayerColors = Parameters().GetPlayerColors(ChessType)
        TypesOfChessPieces = Parameters().GetTypesOfChessPieces(ChessType)

        State().SetGameIsOngoing(True)
        var = tkinter.StringVar(value='deselect')

        def callback():
            if State().GetSelectedPieceToAddToBoard() != var.get():
                if var.get() != 'deselect':
                    State().ClearMoveList()
                    self.ChessBoard.RemoveHighlights()

                State().SetSelectedPieceToAddToBoard(var.get())
                if var.get() == 'deselect':
                    State().SetGameIsOngoing(True)
                else:
                    State().SetGameIsOngoing(False)

        for piece in TypesOfChessPieces:
            RadiobtnFrame = tkinter.Frame(self.frame)
            RadiobtnFrame.pack(anchor='w')
            for PlayerColor in PlayerColors:
                ChessPieceString = PlayerColor + '_' + piece
                img = ImgProcessor().GetImage(ChessType, ChessPieceString)
                LongerSide = img.size[
                    0] if img.size[0] > img.size[1] else img.size[1]
                ScalingFactor = self.__RadiobtnSize / LongerSide
                ScaledSize = (int(ScalingFactor * img.size[0]),
                              int(ScalingFactor * img.size[1]))
                img = ImageTk.PhotoImage(img.resize(ScaledSize))

                Radiobtn = tkinter.Radiobutton(RadiobtnFrame,
                                               command=callback,
                                               variable=var,
                                               value=ChessPieceString,
                                               image=img,
                                               indicatoron=0,
                                               width=self.__RadiobtnSize,
                                               height=self.__RadiobtnSize)
                Radiobtn.image = img
                Radiobtn.pack(side=tkinter.LEFT)
        tkinter.Radiobutton(self.frame,
                            command=callback,
                            variable=var,
                            value='remove',
                            text='Remove').pack(anchor='w')
        tkinter.Radiobutton(self.frame,
                            command=callback,
                            variable=var,
                            value='deselect',
                            text='Deselect').pack(anchor='w')
Пример #14
0
    def StartingPositions(self):
        self.ClearPiecesFromBoard()
        ChessType = State().GetChessType()

        if ChessType == 'Chess':
            order = ('rook', 'knight', 'bishop', 'queen', 'king', 'bishop',
                     'knight', 'rook')
            for i in range(len(order)):
                self.AddPieceToBoard('white', order[i], (i, 7))
                self.AddPieceToBoard('white', 'pawn', (i, 6))
                self.AddPieceToBoard('black', order[i], (i, 0))
                self.AddPieceToBoard('black', 'pawn', (i, 1))
        elif ChessType == 'XiangQi':
            order = ('ju', 'ma', 'xiang', 'shi', 'shuai', 'shi', 'xiang', 'ma',
                     'ju')
            for i in range(len(order)):
                self.AddPieceToBoard('red', order[i], (i, 9))
                self.AddPieceToBoard('black', order[i], (i, 0))
            for i in (1, 7):
                self.AddPieceToBoard('red', 'pao', (i, 7))
                self.AddPieceToBoard('black', 'pao', (i, 2))
            for i in range(0, 9, 2):
                self.AddPieceToBoard('red', 'bing', (i, 6))
                self.AddPieceToBoard('black', 'bing', (i, 3))

        MoveHandler(self).ClearMoveList()
        self.RemoveHighlights()
Пример #15
0
    def PaoMove(self, coordinate):
        CurrentMove = self.GetCurrentMove()
        isValidMove = False

        if (coordinate[0] == CurrentMove.GetStartPos()[0]):
            CollisionCount = 0
            CheckRange = (coordinate[1], CurrentMove.GetStartPos()[1])
            CheckRange = (min(CheckRange), max(CheckRange))
            for i in range(CheckRange[0] + 1, CheckRange[1]):
                if State().PieceExistsAtPosition((coordinate[0], i)):
                    CollisionCount += 1
                    if CollisionCount >= 2:
                        return False

            if not State().PieceExistsAtPosition(coordinate):
                if CollisionCount == 0:
                    isValidMove = True
            elif CollisionCount == 1:
                isValidMove = True

        elif (coordinate[1] == CurrentMove.GetStartPos()[1]):
            CollisionCount = 0
            CheckRange = (coordinate[0], CurrentMove.GetStartPos()[0])
            CheckRange = (min(CheckRange), max(CheckRange))
            for i in range(CheckRange[0] + 1, CheckRange[1]):
                if State().PieceExistsAtPosition((i, coordinate[1])):
                    CollisionCount += 1
                    if CollisionCount >= 2:
                        return False

            if not State().PieceExistsAtPosition(coordinate):
                if CollisionCount == 0:
                    isValidMove = True
            elif CollisionCount == 1:
                isValidMove = True

        if isValidMove:
            self.GetCurrentMove().SetEndPos(coordinate)
            return True
        return False
Пример #16
0
    def ShuaiMove(self, coordinate):
        ChessType = 'XiangQi'
        CurrentMove = self.GetCurrentMove()
        PlayerColor = CurrentMove.GetPlayerColor()
        isValidMove = False

        xCoordinateLim = (3, 5)
        yCoordinateLim = (0, 2)
        if PlayerColor == Parameters().GetPlayerColors(ChessType)[0]:
            yCoordinateLim = (Parameters().GetChessBoardYArray(ChessType) - 1 -
                              yCoordinateLim[1],
                              Parameters().GetChessBoardYArray(ChessType) - 1 -
                              yCoordinateLim[0])
        if abs(coordinate[0] - CurrentMove.GetStartPos(
        )[0]) == 1 and coordinate[1] == CurrentMove.GetStartPos(
        )[1] and xCoordinateLim[0] <= coordinate[0] <= xCoordinateLim[1]:
            isValidMove = True
        elif abs(coordinate[1] - CurrentMove.GetStartPos(
        )[1]) == 1 and coordinate[0] == CurrentMove.GetStartPos(
        )[0] and yCoordinateLim[0] <= coordinate[1] <= yCoordinateLim[1]:
            isValidMove = True
        else:
            EnemyKing = State().GetChessPieceAtPosition(coordinate)
            if EnemyKing != None and EnemyKing[
                    'PlayerColor'] != CurrentMove.GetPlayerColor(
                    ) and EnemyKing['PieceType'] == 'shuai':
                isBlocked = False
                CheckRange = (coordinate[1], CurrentMove.GetStartPos()[1])
                CheckRange = (min(CheckRange), max(CheckRange))
                for i in range(CheckRange[0] + 1, CheckRange[1]):
                    if State().PieceExistsAtPosition((coordinate[0], i)):
                        isBlocked = True
                        break
                if not isBlocked:
                    isValidMove = True

        if isValidMove:
            self.GetCurrentMove().SetEndPos(coordinate)
            return True
        return False
Пример #17
0
    def MaMove(self, coordinate):
        CurrentMove = self.GetCurrentMove()
        isValidMove = False

        xDiff = abs(coordinate[0] - CurrentMove.GetStartPos()[0])
        yDiff = abs(coordinate[1] - CurrentMove.GetStartPos()[1])

        if xDiff == 1 and yDiff == 2:
            BlockPos = (CurrentMove.GetStartPos()[0],
                        (coordinate[1] + CurrentMove.GetStartPos()[1]) // 2)
            if not State().PieceExistsAtPosition(BlockPos):
                isValidMove = True
        elif xDiff == 2 and yDiff == 1:
            BlockPos = ((coordinate[0] + CurrentMove.GetStartPos()[0]) // 2,
                        CurrentMove.GetStartPos()[1])
            if not State().PieceExistsAtPosition(BlockPos):
                isValidMove = True

        if isValidMove:
            self.GetCurrentMove().SetEndPos(coordinate)
            return True
        return False
Пример #18
0
    def QueenMove(self, coordinate):
        CurrentMove = self.GetCurrentMove()
        isValidMove = False

        if coordinate[0] == CurrentMove.GetStartPos()[0]:
            isValidMove = True
            CheckRange = (coordinate[1], CurrentMove.GetStartPos()[1])
            CheckRange = (min(CheckRange), max(CheckRange))
            for i in range(CheckRange[0] + 1, CheckRange[1]):
                if State().GetChessPieceAtPosition((coordinate[0], i)) != None:
                    isValidMove = False
                    break
        elif coordinate[1] == CurrentMove.GetStartPos()[1]:
            isValidMove = True
            CheckRange = (coordinate[0], CurrentMove.GetStartPos()[0])
            CheckRange = (min(CheckRange), max(CheckRange))
            for i in range(CheckRange[0] + 1, CheckRange[1]):
                if State().PieceExistsAtPosition((i, coordinate[1])):
                    isValidMove = False
                    break
        elif abs(coordinate[0] - CurrentMove.GetStartPos()[0]) == abs(
                coordinate[1] - CurrentMove.GetStartPos()[1]):
            isValidMove = True
            x, y = CurrentMove.GetStartPos()
            xDirection = 1 if CurrentMove.GetStartPos(
            )[0] < coordinate[0] else -1
            yDirection = 1 if CurrentMove.GetStartPos(
            )[1] < coordinate[1] else -1
            for i in range(1,
                           abs(CurrentMove.GetStartPos()[0] - coordinate[0])):
                if State().GetChessPieceAtPosition(
                    (x + i * xDirection, y + i * yDirection)) != None:
                    isValidMove = False
                    break

        if isValidMove:
            self.GetCurrentMove().SetEndPos(coordinate)
            return True
        return False
Пример #19
0
 def SaveToFile():
     filename = filedialog.asksaveasfilename(
         initialdir='.',
         title='Select a File',
         defaultextension='.csv',
         filetypes=(('csv files', '*.csv*'), ('all files', '*.*')))
     if filename != '':
         file = open(filename, 'w')
         file.write(self.CaptionPanel.get() + '\n')
         for key, value in State().GetChessPiecePositions().items():
             file.write(
                 str(key[0]) + ',' + str(key[1]) + ',' + str(value) +
                 '\n')
         file.close()
Пример #20
0
 def ResetCastlingStatus(self):
     for color, KingYCoordinate in {'white': 7, 'black': 0}.items():
         KingPiece = State().GetChessPieceAtPosition((4, KingYCoordinate))
         if KingPiece is None:
             break
         if KingPiece['PlayerColor'] == color and KingPiece[
                 'PieceType'] == 'king':
             for CastleType, RookXCoordinate in {
                     'Long': 0,
                     'Short': 7
             }.items():
                 RookPiece = State().GetChessPieceAtPosition(
                     (RookXCoordinate, KingYCoordinate))
                 if RookPiece == None:
                     continue
                 if RookPiece['PlayerColor'] == color and RookPiece[
                         'PieceType'] == 'rook':
                     self.SetCastlingStatus(color, CastleType, True)
                 else:
                     self.SetCastlingStatus(color, CastleType, False)
         else:
             for CastleType in ('Long', 'Short'):
                 self.SetCastlingStatus(color, CastleType, False)
Пример #21
0
    def KingMove(self, coordinate):
        CurrentMove = self.GetCurrentMove()
        PlayerColor = CurrentMove.GetPlayerColor()
        isValidMove = False

        if abs(coordinate[0] - CurrentMove.GetStartPos()[0]) <= 1 and abs(
                coordinate[1] - CurrentMove.GetStartPos()[1]) <= 1:
            isValidMove = True
        elif abs(coordinate[0] - CurrentMove.GetStartPos()[0]
                 ) == 2 and coordinate[1] == CurrentMove.GetStartPos()[1]:
            CastleType = {2: 'Long', 6: 'Short'}
            RookPos = {'Long': 0, 'Short': 7}
            if coordinate[0] in CastleType.keys() and self.GetCastlingStatus(
                    PlayerColor, CastleType[coordinate[0]]):
                isBlocked = False
                CheckRange = (coordinate[0],
                              RookPos[CastleType[coordinate[0]]])
                CheckRange = (min(CheckRange), max(CheckRange))
                for i in range(CheckRange[0] + 1, CheckRange[1]):
                    if State().PieceExistsAtPosition((i, coordinate[1])):
                        isBlocked = True
                        break

                if not isBlocked:
                    self.__ChessBoard.RemovePieceFromBoard(
                        (RookPos[CastleType[coordinate[0]]], coordinate[1]))
                    RookEndCoordinate = (
                        (coordinate[0] + CurrentMove.GetStartPos()[0]) // 2,
                        coordinate[1])
                    self.__ChessBoard.AddPieceToBoard(PlayerColor, 'rook',
                                                      RookEndCoordinate)
                    isValidMove = True

        if isValidMove:
            for CastleType in ('Long', 'Short'):
                self.SetCastlingStatus(PlayerColor, CastleType, False)
                self.GetCurrentMove().SetDisabledCastleTypes(CastleType)
            self.GetCurrentMove().SetEndPos(coordinate)
            return True
        return False
Пример #22
0
    def BishopMove(self, coordinate):
        CurrentMove = self.GetCurrentMove()
        isValidMove = False

        if abs(coordinate[0] - CurrentMove.GetStartPos()[0]) == abs(
                coordinate[1] - CurrentMove.GetStartPos()[1]):
            isValidMove = True
            x, y = CurrentMove.GetStartPos()
            xDirection = 1 if CurrentMove.GetStartPos(
            )[0] < coordinate[0] else -1
            yDirection = 1 if CurrentMove.GetStartPos(
            )[1] < coordinate[1] else -1
            for i in range(1,
                           abs(CurrentMove.GetStartPos()[0] - coordinate[0])):
                if State().GetChessPieceAtPosition(
                    (x + i * xDirection, y + i * yDirection)) != None:
                    isValidMove = False
                    break

        if isValidMove:
            self.GetCurrentMove().SetEndPos(coordinate)
            return True
        return False
Пример #23
0
    def XiangMove(self, coordinate):
        ChessType = 'XiangQi'
        CurrentMove = self.GetCurrentMove()
        PlayerColor = CurrentMove.GetPlayerColor()
        isValidMove = False

        yCoordinateLim = (0, 4)
        if PlayerColor == Parameters().GetPlayerColors(ChessType)[0]:
            yCoordinateLim = (Parameters().GetChessBoardYArray(ChessType) - 1 -
                              yCoordinateLim[1],
                              Parameters().GetChessBoardYArray(ChessType) - 1 -
                              yCoordinateLim[0])
        if (abs(coordinate[0] - CurrentMove.GetStartPos()[0]) == 2
                and abs(coordinate[1] - CurrentMove.GetStartPos()[1]) == 2
                and yCoordinateLim[0] <= coordinate[1] <= yCoordinateLim[1]):
            midpoint = ((coordinate[0] + CurrentMove.GetStartPos()[0]) // 2,
                        (coordinate[1] + CurrentMove.GetStartPos()[1]) // 2)
            if State().GetChessPieceAtPosition(midpoint) == None:
                isValidMove = True

        if isValidMove:
            self.GetCurrentMove().SetEndPos(coordinate)
            return True
        return False
Пример #24
0
 def quicksave():
     State().SetQuickSavePosition()
     State().SetSavedCaption(self.CaptionPanel.get())
Пример #25
0
 def RemovePieceFromBoard(self, coordinate):
     if coordinate in State().GetChessPiecePositions():
         self.canvas.delete(self.chesspiecesObjects[coordinate][0])
         self.chesspiecesObjects.pop(coordinate)
         State().RemoveChessPieceFromPosition(coordinate)
Пример #26
0
 def callback():
     if State().GetChessType() != self.chess_type_var.get():
         self.ChangeChessType(self.chess_type_var.get())
Пример #27
0
 def SetEndPos(self, Position):
     ChessPiece = State().GetChessPieceAtPosition(Position)
     if ChessPiece != None:
         self.SetTakenPieceAndPos(ChessPiece, Position)
     self.__EndPiece = self.GetStartPiece()
     self.__EndPos = Position
Пример #28
0
    def PawnMove(self, coordinate):
        PieceType = 'pawn'
        CurrentMove = self.GetCurrentMove()
        PlayerColor = CurrentMove.GetPlayerColor()
        isValidMove = False
        if PlayerColor == 'white':
            StartingRow = 6
            MoveDirection = -1
        else:
            StartingRow = 1
            MoveDirection = 1

        # Check if pawn is moving straight
        if coordinate[0] == CurrentMove.GetStartPos()[0]:
            StepsTaken = coordinate[1] - CurrentMove.GetStartPos()[1]
            if StepsTaken == MoveDirection:
                isValidMove = True
            elif CurrentMove.GetStartPos(
            )[1] == StartingRow and StepsTaken == MoveDirection * 2:
                isValidMove = True

        # Check if pawn is taking another piece
        elif abs(coordinate[0] -
                 CurrentMove.GetStartPos()[0]) == 1 and coordinate[
                     1] - CurrentMove.GetStartPos()[1] == MoveDirection:
            if State().PieceExistsAtPosition(coordinate):
                isValidMove = True
            # En passant
            else:
                EnPassantEndingRow = {'white': 2, 'black': 5}
                if coordinate[1] == EnPassantEndingRow[PlayerColor]:
                    EnemyPawnPos = (coordinate[0],
                                    CurrentMove.GetStartPos()[1])
                    EnemyPawn = State().GetChessPieceAtPosition(EnemyPawnPos)
                    if EnemyPawn != None and EnemyPawn[
                            'PlayerColor'] != PlayerColor and EnemyPawn[
                                'PieceType'] == PieceType:
                        if self.GetMoveIndex() == 0:
                            self.GetCurrentMove().SetTakenPieceAndPos(
                                PieceType, coordinate)
                            isValidMove = True
                        elif self.GetPreviousMove().GetStartPiece(
                        ) == PieceType and self.GetPreviousMove().GetEndPos(
                        )[0] == coordinate[0] and abs(
                                self.GetPreviousMove().GetStartPos()[1] -
                                self.GetPreviousMove().GetEndPos()[1]) == 2:
                            self.GetCurrentMove().SetTakenPieceAndPos(
                                PieceType, EnemyPawnPos)
                            isValidMove = True

        def PawnPromotion(color):
            class PromotionPrompt:
                def __init__(self):
                    root = Parameters().GetRoot()
                    self.PieceToPromoteTo = None

                    self.PromotionWindow = tkinter.Toplevel(root)
                    self.PromotionWindow.title('Promotion')

                    def callback(ChosenPiece):
                        self.PieceToPromoteTo = ChosenPiece
                        self.PromotionWindow.destroy()

                    for PieceType in Parameters().GetTypesOfChessPieces(
                            'Chess'):
                        if PieceType != 'king' and PieceType != 'pawn':
                            ImgName = color + '_' + PieceType
                            ButtonSize = Parameters().GetCellSize('Chess')
                            img = ImgProcessor().GetPhotoImage(
                                'Chess', ImgName)
                            bt = tkinter.Button(
                                self.PromotionWindow,
                                image=img,
                                command=lambda s=PieceType: callback(s),
                                width=ButtonSize,
                                height=ButtonSize)
                            bt.image = img
                            bt.pack(side=tkinter.LEFT)

                    root.wait_window(self.PromotionWindow)

            promotion = PromotionPrompt()
            if promotion.PieceToPromoteTo == None:
                return 'queen'
            return promotion.PieceToPromoteTo

        if isValidMove:
            self.GetCurrentMove().SetEndPos(coordinate)
            PromotionRow = {'white': 0, 'black': 7}
            if coordinate[1] == PromotionRow[PlayerColor]:
                self.GetCurrentMove().SetEndPiece(PawnPromotion(PlayerColor))
            return True
        return False
Пример #29
0
    def AddHighlight(self, square):
        if square != 0:
            ChessType = State().GetChessType()
            linewidth = Parameters().GetHighlightLinewidth()
            color = Parameters().GetHighlightColor(ChessType)
            x, y = Parameters().GetCellCenter(ChessType, square)
            size = 0.5 * Parameters().GetCellSize(ChessType)
            length = 0.6 * size
            offset = 0.1 * linewidth

            # Top left corner
            self.active_square_objects.append(
                self.canvas.create_rectangle(x - size + offset,
                                             y - size + offset,
                                             x - size + length,
                                             y - size + linewidth,
                                             width=0,
                                             fill=color))
            self.active_square_objects.append(
                self.canvas.create_rectangle(x - size + offset,
                                             y - size + offset,
                                             x - size + linewidth,
                                             y - size + length,
                                             width=0,
                                             fill=color))

            # Top right corner
            self.active_square_objects.append(
                self.canvas.create_rectangle(x + size - offset,
                                             y - size + offset,
                                             x + size - length,
                                             y - size + linewidth,
                                             width=0,
                                             fill=color))
            self.active_square_objects.append(
                self.canvas.create_rectangle(x + size - offset,
                                             y - size + offset,
                                             x + size - linewidth,
                                             y - size + length,
                                             width=0,
                                             fill=color))

            # Bottom left corner
            self.active_square_objects.append(
                self.canvas.create_rectangle(x - size + offset,
                                             y + size - offset,
                                             x - size + length,
                                             y + size - linewidth,
                                             width=0,
                                             fill=color))
            self.active_square_objects.append(
                self.canvas.create_rectangle(x - size + offset,
                                             y + size - offset,
                                             x - size + linewidth,
                                             y + size - length,
                                             width=0,
                                             fill=color))

            # Bottom right corner
            self.active_square_objects.append(
                self.canvas.create_rectangle(x + size - offset,
                                             y + size - offset,
                                             x + size - length,
                                             y + size - linewidth,
                                             width=0,
                                             fill=color))
            self.active_square_objects.append(
                self.canvas.create_rectangle(x + size - offset,
                                             y + size - offset,
                                             x + size - linewidth,
                                             y + size - length,
                                             width=0,
                                             fill=color))
Пример #30
0

def SetupLogging():
    logDirName = 'log'
    if not os.path.exists(logDirName):
        os.makedirs(logDirName)
    logging.basicConfig(
        filename=logDirName + os.path.sep + date.today().strftime('%Y%m%d') +
        '.log',
        encoding='utf-8',
        format='%(asctime)s %(levelname)-8s %(module)-30s: %(message)s',
        level=logging.INFO,
        datefmt='%Y-%m-%d %H:%M:%S',
    )


if __name__ == '__main__':
    SetupLogging()
    logging.info('Program has started')

    Parameters()
    State()
    ImgProcessor()

    root = tkinter.Tk()
    root.state('zoomed')
    Parameters().SetRoot(root)

    MainWindow = MainWindow(root)
    root.mainloop()