public boolean canMoveExact( int playerColor) {
        if (! legitPlayerColor(playerColor)) {
            throw new IllegalArgumentException("Bad color '" + playerColor + "'");
        }
        if ((myDice.isDoubles( )) && (myDice.getDoubletMovesCountdown( ) < 1)) {
            return false;
        }
        // ?? need total movesCountdown so we can use up PartialMoves !!
        int move1, move2;
        // Cycle through all the points
        for (int point = 1; point <= howManyPoints; point++) {
            // Only check points which contain the player's blots
            if (getColorOnPoint(point) == playerColor ) {
                move1 = endPointMovingFrom(point, myDice.getDie(1 ), playerColor/*, this*/); 
                // might return BLACK_PAST_BEAR_OFF_LOC
                move2 = endPointMovingFrom(point, myDice.getDie(2 ), playerColor/*, this*/);
                if ( ((canLandOnExact(move1, playerColor)) && (!myDice.getUsedDie( 1))) 
                || ((canLandOnExact(move2, playerColor)) && (!myDice.getUsedDie(2 ))) ) {
                    return true;
                }
                // canLandOnExact() only allows bearing off with exact rolls.
                // If the player has no other option, moving with a roll greater than needed 
                // to bear off is legal
            }
        }
        return false;
    } // canMoveExact( )