コード例 #1
0
    def test_black_pawns_can_capture_diagonally():
        # Arrange
        board = Board.empty()
        pawn = Pawn(Player.BLACK)
        pawn_square = Square.at(3, 4)
        board.set_piece(pawn_square, pawn)

        friendly = Pawn(Player.BLACK)
        friendly_square = Square.at(2, 5)
        board.set_piece(friendly_square, friendly)

        # Act
        moves = pawn.get_available_moves(board)

        # Assert
        assert Square.at(2, 3) not in moves
        assert Square.at(2, 5) not in moves
コード例 #2
0
        def test_white_rook_can_capture():
            # Arrange
            board = Board.empty()
            rook = Rook(Player.WHITE)
            square = Square.at(4, 4)
            board.set_piece(square, rook)

            obstructing_square = Square.at(5, 4)
            obstruction = Pawn(Player.BLACK)
            board.set_piece(obstructing_square, obstruction)

            # Act
            moves = rook.get_available_moves(board)

            # Assert
            assert Square.at(5, 4) in moves
            assert Square.at(6, 4) not in moves
コード例 #3
0
    def test_bishop_is_blocked_by_friendly_pieces():
        # Arrange
        board = Board.empty()
        bishop = Bishop(Player.WHITE)
        square = Square.at(3, 5)
        board.set_piece(square, bishop)

        friendly = Pawn(Player.WHITE)
        friendly_square = Square.at(5, 3)
        board.set_piece(friendly_square, friendly)

        # Act
        moves = bishop.get_available_moves(board)

        # Assert
        assert Square.at(6, 2) not in moves
        assert Square.at(7, 7) not in moves
コード例 #4
0
    def test_black_pawn_cannot_move_if_piece_in_front():

        # Arrange
        board = Board.empty()
        pawn = Pawn(Player.BLACK)
        pawn_square = Square.at(4, 4)
        board.set_piece(pawn_square, pawn)

        obstructing_square = Square.at(3, 4)
        obstruction = Pawn(Player.WHITE)
        board.set_piece(obstructing_square, obstruction)

        # Act
        moves = pawn.get_available_moves(board)

        # Assert
        assert len(moves) == 0
コード例 #5
0
    def test_white_pawns_cannot_move_diagonally_except_to_capture():
        # Arrange
        board = Board.empty()
        pawn = Pawn(Player.WHITE)
        pawn_square = Square.at(3, 4)
        board.set_piece(pawn_square, pawn)

        friendly = Pawn(Player.WHITE)
        friendly_square = Square.at(4, 5)
        board.set_piece(friendly_square, friendly)

        # Act
        moves = pawn.get_available_moves(board)

        # Assert
        assert Square.at(4, 3) not in moves
        assert Square.at(4, 5) not in moves
コード例 #6
0
    def test_white_pawn_cannot_move_two_squares_if_piece_two_in_front():

        # Arrange
        board = Board.empty()
        pawn = Pawn(Player.WHITE)
        pawn_square = Square.at(4, 4)
        board.set_piece(pawn_square, pawn)

        obstructing_square = Square.at(6, 4)
        obstruction = Pawn(Player.BLACK)
        board.set_piece(obstructing_square, obstruction)

        # Act
        moves = pawn.get_available_moves(board)

        # Assert
        assert obstructing_square not in moves
コード例 #7
0
    def test_white_king_checked_by_black_knight():
        # Arrange
        board = Board.empty()
        king = King(Player.WHITE)
        king_square = Square.at(2, 3)
        board.set_piece(king_square, king)

        enemy = Knight(Player.BLACK)
        enemy_square = Square.at(1, 1)
        board.set_piece(enemy_square, enemy)

        # Act
        # check if current square is in check?
        check = king.is_in_check(board)

        # Assert
        assert check is True
コード例 #8
0
    def test_white_rook_can_take_piece_if_black_piece_in_front():
        # Arrange
        board = Board.empty()
        rook = Rook(Player.WHITE)
        rook_square = Square.at(0, 0)
        board.set_piece(rook_square, rook)

        obstructing_square = Square.at(1, 0)
        obstruction = Pawn(Player.BLACK)
        board.set_piece(obstructing_square, obstruction)

        # Act
        moves = rook.get_available_moves(board)

        # Assert
        assert Square.at(1, 0) in moves
        assert Square.at(2, 0) not in moves
コード例 #9
0
    def test_black_knights_can_move_in_l_shape():
        # Arrange
        board = Board.empty()
        knight = Knight(Player.BLACK)
        square = Square.at(3, 3)
        board.set_piece(square, knight)

        # Act
        moves = knight.get_available_moves(board)

        # Assert
        assert Square.at(4, 5) in moves
        assert Square.at(4, 1) in moves
        assert Square.at(5, 4) in moves
        assert Square.at(5, 2) in moves
        assert Square.at(2, 5) in moves
        assert Square.at(2, 1) in moves
        assert Square.at(1, 4) in moves
        assert Square.at(1, 2) in moves
コード例 #10
0
        def test_black_king_can_castle():
            # Arrange
            board = Board.empty()
            king = King(Player.BLACK)
            square = Square.at(7, 4)
            board.set_piece(square, king)

            rook1 = Rook(Player.BLACK)
            board.set_piece(Square.at(7, 0), rook1)

            rook2 = Rook(Player.BLACK)
            board.set_piece(Square.at(7, 7), rook2)

            # Act
            moves = king.get_available_moves(board)

            # Assert
            assert Square.at(7, 2) in moves
            assert Square.at(7, 6) in moves
コード例 #11
0
def play_game():
    psg.ChangeLookAndFeel('GreenTan')

    board = Board.at_starting_position()
    board_layout = render_board(board)
    window = psg.Window('Chessington',
                        default_button_element_size=(12, 1),
                        auto_size_buttons=False).Layout(board_layout)

    from_square = None
    to_squares = []

    def handle_click(row, col):

        nonlocal window, board, from_square, to_squares
        clicked_piece = board.get_piece(Square.at(row, col))

        # If making an allowed move, then make it
        if from_square is not None and any(s.row == row and s.col == col
                                           for s in to_squares):
            board.get_piece(from_square).move_to(board, Square.at(row, col))
            from_square, to_squares = None, []

        # If clicking on a piece whose turn it is, get its allowed moves
        elif clicked_piece is not None and clicked_piece.player == board.current_player:
            from_square = Square.at(row, col)
            to_squares = clicked_piece.get_available_moves(board)

        # Otherwise reset everything to default
        else:
            from_square, to_squares = None, []

    while True:

        # Check for a square being clicked on and react appropriately
        button, _ = window.Read()
        if button is not None:
            handle_click(*button)

        # Update the UI
        highlight_squares(window, from_square, to_squares)
        update_pieces(window, board)
コード例 #12
0
    def test_black_pawn_can_be_captured_by_en_pessant():
        # Arrange
        board = Board.empty()

        pawn1 = Pawn(Player.BLACK)  # MAKE BLACK PAWN
        starting_square1 = Square.at(6, 4)
        board.set_piece(starting_square1, pawn1)

        pawn2 = Pawn(Player.WHITE)  # MAKE WHITE PAWN
        starting_square2 = Square.at(4, 3)
        board.set_piece(starting_square2, pawn2)

        intermediate_square = Square.at(4, 4)  # move black pawn
        pawn1.move_to(board, intermediate_square)

        # Act
        moves = pawn2.get_available_moves(board)

        # Assert
        assert Square.at(5, 4) in moves
コード例 #13
0
    def test_rooks_cannot_move_off_the_board():
        # Arrange
        board = Board.empty()
        rook = Rook(Player.WHITE)
        rook_square = Square.at(0, 0)
        board.set_piece(rook_square, rook)

        friendly_1 = Pawn(Player.WHITE)
        friendly_1_square = Square.at(1, 0)
        board.set_piece(friendly_1_square, friendly_1)

        friendly_2 = Pawn(Player.WHITE)
        friendly_2_square = Square.at(0, 1)
        board.set_piece(friendly_2_square, friendly_2)

        # Act
        moves = rook.get_available_moves(board)

        # Assert
        assert len(moves) == 0
コード例 #14
0
    def test_knights_cannot_move_off_board():
        # Arrange
        board = Board.empty()
        knight = Knight(Player.WHITE)
        knight_square = Square.at(0, 0)
        board.set_piece(knight_square, knight)

        friendly_1 = Pawn(Player.WHITE)
        friendly_1_square = Square.at(2, 1)
        board.set_piece(friendly_1_square, friendly_1)

        friendly_2 = Pawn(Player.WHITE)
        friendly_2_square = Square.at(1, 2)
        board.set_piece(friendly_2_square, friendly_2)

        # Act
        moves = knight.get_available_moves(board)

        # Assert
        assert len(moves) == 0
コード例 #15
0
    def test_white_knights_can_move_to_all_possible_squares():

        # Arrange
        board = Board.empty()
        knight = Knight(Player.WHITE)
        square = Square.at(1, 4)
        board.set_piece(square, knight)

        # Act
        moves = knight.get_available_moves(board)

        # Assert
        assert set(moves) == set([
            Square.at(0, 6),
            Square.at(0, 2),
            Square.at(2, 6),
            Square.at(2, 2),
            Square.at(3, 3),
            Square.at(3, 5)
        ])
コード例 #16
0
    def test_white_kings_can_move_to_unoccupied_neighbouring_squares_inside_board(
    ):

        # Arrange
        board = Board.empty()
        king = King(Player.WHITE)
        square = Square.at(7, 0)
        board.set_piece(square, king)
        enemy1 = Pawn(Player.BLACK)
        enemy1_square = Square.at(6, 0)
        board.set_piece(enemy1_square, enemy1)
        enemy2 = Pawn(Player.WHITE)
        enemy2_square = Square.at(6, 1)
        board.set_piece(enemy2_square, enemy2)

        # Act
        moves = king.get_available_moves(board)

        # Assert
        assert set(moves) == set([Square.at(6, 0), Square.at(7, 1)])
コード例 #17
0
    def test_rook_cannot_move_if_piece_in_front():
        # Arrange
        board = Board.empty()
        rook = Rook(Player.WHITE)
        rook_square = Square.at(4, 4)
        board.set_piece(rook_square, rook)

        enemy = Pawn(Player.BLACK)
        enemy_square = Square.at(5, 4)
        board.set_piece(enemy_square, enemy)

        # Act
        moves = rook.get_available_moves(board)

        # Assert
        print(moves)
        assert Square.at(5, 4) in moves
        assert Square.at(6, 4) not in moves
        assert Square.at(7, 4) not in moves
        assert Square.at(2, 4) in moves
コード例 #18
0
    def testKnightMovementShape():
        board = Board.empty()
        knight = Knight(Player.WHITE)
        square = Square.at(3, 5)
        board.set_piece(square, knight)

        moves = knight.get_available_moves(board)

        expected_moves = [
            Square.at(4, 7),
            Square.at(4, 3),
            Square.at(5, 6),
            Square.at(5, 4),
            Square.at(2, 7),
            Square.at(2, 3),
            Square.at(1, 6),
            Square.at(1, 4)
        ]
        assert len(moves) == len(expected_moves)
        assert set(moves) == set(expected_moves)
コード例 #19
0
    def test_white_king_can_move_up_one_square():

        # Arrange
        board = Board.empty()
        king = King(Player.WHITE)
        square = Square.at(4, 4)
        board.set_piece(square, king)

        # Act
        moves = king.get_available_moves(board)

        # Assert
        assert Square.at(3, 3) in moves
        assert Square.at(3, 4) in moves
        assert Square.at(3, 5) in moves
        assert Square.at(4, 3) in moves
        assert Square.at(4, 5) in moves
        assert Square.at(5, 3) in moves
        assert Square.at(5, 4) in moves
        assert Square.at(5, 5) in moves
コード例 #20
0
    def test_king_cannot_move_off_the_left_of_board():

        # Arrange 
        board = Board.empty()
        king = King(Player.BLACK)
        square = Square.at(4,0)
        board.set_piece(square, king)

        # Act
        moves = king.get_available_moves(board)

        # Assert
        assert Square.at(3, 1) in moves
        assert Square.at(4, 1) in moves
        assert Square.at(5, 1) in moves
        assert Square.at(3, 0) in moves
        assert Square.at(5, 0) in moves
        assert Square.at(3, -1) not in moves
        assert Square.at(4, -1) not in moves
        assert Square.at(5, -1) not in moves
コード例 #21
0
    def test_king_cannot_move_off_the_right_of_board():

        # Arrange 
        board = Board.empty()
        king = King(Player.BLACK)
        square = Square.at(4,7)
        board.set_piece(square, king)

        # Act
        moves = king.get_available_moves(board)

        # Assert
        assert Square.at(3, 6) in moves
        assert Square.at(4, 6) in moves
        assert Square.at(5, 6) in moves
        assert Square.at(3, 7) in moves
        assert Square.at(5, 7) in moves
        assert Square.at(3, 8) not in moves
        assert Square.at(4, 8) not in moves
        assert Square.at(5, 8) not in moves
コード例 #22
0
    def test_king_cannot_move_off_the_bottom_of_board():

        # Arrange 
        board = Board.empty()
        king = King(Player.BLACK)
        square = Square.at(0,4)
        board.set_piece(square, king)

        # Act
        moves = king.get_available_moves(board)

        # Assert
        assert Square.at(1, 3) in moves
        assert Square.at(1, 4) in moves
        assert Square.at(1, 5) in moves
        assert Square.at(0, 3) in moves
        assert Square.at(0, 5) in moves
        assert Square.at(-1, 3) not in moves
        assert Square.at(-1, 4) not in moves
        assert Square.at(-1, 5) not in moves
コード例 #23
0
    def test_pawn_can_en_passant():
        # Arrange
        board = Board.empty()
        pawn1 = Pawn(Player.WHITE)
        pawn1_square = Square.at(1, 4)
        board.set_piece(pawn1_square, pawn1)
        pawn1_to_square = Square.at(3, 4)

        pawn2 = Pawn(Player.BLACK)
        pawn2_square = Square.at(3, 5)
        board.set_piece(pawn2_square, pawn2)

        # Act
        board.move_piece(pawn1_square, pawn1_to_square)
        moves = pawn2.get_available_moves(board)

        # Assert
        assert Square.at(2, 4) in moves
        assert Square.at(2, 5) in moves
        assert Square.at(2, 6) not in moves
コード例 #24
0
    def test_queen_cannot_move_if_piece_in_front():
        # Arrange
        board = Board.empty()
        queen = Queen(Player.WHITE)
        queen_square = Square.at(4, 4)
        board.set_piece(queen_square, queen)

        enemy = Pawn(Player.BLACK)
        enemy_square = Square.at(5, 5)
        board.set_piece(enemy_square, enemy)

        # Act
        moves = queen.get_available_moves(board)

        # Assert
        print(moves)
        assert Square.at(5, 5) in moves
        assert Square.at(6, 6) not in moves
        assert Square.at(7, 7) not in moves
        assert Square.at(2, 2) in moves
コード例 #25
0
    def test_bishop_cannot_move_if_piece_in_front():
        # Arrange
        board = Board.empty()
        bishop = Bishop(Player.WHITE)
        bishop_square = Square.at(4, 4)
        board.set_piece(bishop_square, bishop)

        enemy = Pawn(Player.BLACK)
        enemy_square = Square.at(5, 5)
        board.set_piece(enemy_square, enemy)

        # Act
        moves = bishop.get_available_moves(board)

        # Assert
        print(moves)
        assert Square.at(5, 5) in moves
        assert Square.at(6, 6) not in moves
        assert Square.at(7, 7) not in moves
        assert Square.at(2, 2) in moves
コード例 #26
0
    def test_kings_can_capture():
        # Arrange
        board = Board.empty()
        king = King(Player.WHITE)
        king_square = Square.at(4, 4)
        board.set_piece(king_square, king)

        enemy_1 = Pawn(Player.BLACK)
        enemy_1_square = Square.at(4, 3)
        board.set_piece(enemy_1_square, enemy_1)

        enemy_2 = Pawn(Player.BLACK)
        enemy_2_square = Square.at(3, 4)
        board.set_piece(enemy_2_square, enemy_2)

        # Act
        moves = king.get_available_moves(board)

        # Assert
        assert Square.at(4, 3) in moves
        assert Square.at(3, 4) in moves
コード例 #27
0
    def test_black_pawns_can_capture_diagonally():
        # Arrange
        board = Board.empty()
        pawn = Pawn(Player.BLACK)
        pawn_square = Square.at(3, 4)
        board.set_piece(pawn_square, pawn)

        enemy1 = Pawn(Player.WHITE)
        enemy1_square = Square.at(2, 5)
        board.set_piece(enemy1_square, enemy1)

        enemy2 = Pawn(Player.WHITE)
        enemy2_square = Square.at(2, 3)
        board.set_piece(enemy2_square, enemy2)

        # Act
        moves = pawn.get_available_moves(board)

        # Assert
        assert enemy1_square in moves
        assert enemy2_square in moves
コード例 #28
0
    def test_king_can_castle():
        # Arrange
        board = Board.empty()
        king = King(Player.WHITE)
        king_square = Square.at(0, 4)
        board.set_piece(king_square, king)

        friend1 = Rook(Player.WHITE)
        friend_square1 = Square.at(0, 7)
        board.set_piece(friend_square1, friend1)

        friend2 = Rook(Player.WHITE)
        friend_square2 = Square.at(0, 0)
        board.set_piece(friend_square2, friend2)

        # Act
        moves = king.get_available_moves(board)

        # Assert
        assert Square.at(0, 2) in moves
        assert Square.at(0, 6) in moves
コード例 #29
0
    def test_white_kings_can_move_to_all_neighbouring_squares():

        # Arrange
        board = Board.empty()
        king = King(Player.WHITE)
        square = Square.at(1, 4)
        board.set_piece(square, king)

        # Act
        moves = king.get_available_moves(board)

        # Assert
        assert set(moves) == set([
            Square.at(1, 5),
            Square.at(1, 3),
            Square.at(2, 5),
            Square.at(2, 3),
            Square.at(2, 4),
            Square.at(0, 5),
            Square.at(0, 3),
            Square.at(0, 4)
        ])
コード例 #30
0
    def test_black_bishop_cannot_move_if_friendly_piece_in_the_way():
        # Arrange
        board = Board.empty()
        bishop = Bishop(Player.BLACK)
        bishop_square = Square.at(2, 2)
        board.set_piece(bishop_square, bishop)

        obstructing_square1 = Square.at(1, 1)
        obstructing_square2 = Square.at(3, 3)
        obstructing_square3 = Square.at(1, 3)
        obstructing_square4 = Square.at(3, 1)
        obstruction = Pawn(Player.BLACK)
        board.set_piece(obstructing_square1, obstruction)
        board.set_piece(obstructing_square2, obstruction)
        board.set_piece(obstructing_square3, obstruction)
        board.set_piece(obstructing_square4, obstruction)

        # Act
        moves = bishop.get_available_moves(board)

        # Assert
        assert len(moves) == 0