I think we need more insight into your code to resolve your points issue. Are you zeroing it out each time you fill it up? I assume that it's an integer? When you step through the code, does it double the value the moment you execute that line, or are you rechecking it periodically?
I suppose a larger question is, do you want "points" to indicate how many times the intersection has happened in total? The number of times over a series of frames? My suspicion is that you're never zeroing it out, but it just keeps accruing, probably at the same speed as the timing of whatever thread you use to check this value.
To answer your first question, assuming you correctly handled building the third rectangle between the first two, is that your check will be thrice. Assuming intersect1 is the intersection of the label's bounds with the top rectangle, intersect2 is the intersection of the label's bounds with the bottom rectangle, and intersect3 is the intersection of the label with the rectangle created by the shared width of the two original rectangles (I don't know, from your example, whether they have a horizontal offset from each other) and the height of the space between them, it's between the two pipes but not touching when (( intersect1 == Rectangle.Empty | intersect2 == Rectangle.Empty) && intersect3 != Rectangle.Empty)
. Your current check just increments "points" when your label is not intersecting either pipe.
And, just as a wild guess, recreating Flappy Bird?